1.7. 使用 Ceph Manager 负载均衡器模块

balancer 是 Ceph Manager(ceph-mgr)的一个模块,用于优化 OSD 之间放置组(PG)放置,从而实现平衡的分发(可自动或监管方式)。

模式

目前支持的负载均衡器模式有两种:

  • CRUSH -compat :CRUSH compat 模式使用 Ceph Luminous 中引入的兼容 weight-set 功能来管理 CRUSH 层次结构中设备的备用权重集合。普通权重应保持设置为设备的大小,以反映您要存储在设备上的数据数量。然后,负载均衡器会优化 weight-set 值,以较小的增量调整它们,以实现与目标分布匹配的发行版。由于 PG 放置是一种伪随机进程,因此放置有自然变化;通过优化权重,平衡平衡器的作用是自然变化。

    这个模式与旧的客户端完全向后兼容。当 OSDMap 和 CRUSH map 与旧客户端共享时,平衡器会将优化的权重显示为实际权重。

    此模式的主要限制是,如果层次结构的子树共享任何 OSD,则均衡器无法处理具有不同放置规则的多个 CRUSH 层次结构。由于此配置使得在共享 OSD 上管理空间利用率比较困难,因此通常不建议这样做。因此,这个限制通常不是问题。

  • upmap: 从 Luminous 开始,OSDMap 可以存储各个 OSD 的显式映射,如普通的 CRUSH 放置计算例外。这些 upmap 条目提供对 PG 映射的精细控制。此 CRUSH 模式将优化各个 PG 的放置,以实现均衡的分发。在大多数情况下,此分布为"完美",每个 OSD +/-1 PG 上相等的 PG 数量,因为它们可能无法均匀划分。

    重要

    要允许使用这个功能,您必须使用以下命令告知集群只需要支持 luminous 或更新的客户端:

    [root@admin ~]# ceph osd set-require-min-compat-client luminous

    如果任何 pre-luminous 客户端或守护进程连接到 monitor,则此命令会失败。

    由于一个已知问题,内核 CephFS 客户端会将自身报告为 jewel 客户端。要临时解决这个问题,请使用 --yes-i-really-mean-it 标志:

    [root@admin ~]# ceph osd set-require-min-compat-client luminous --yes-i-really-mean-it

    您可以检查哪些客户端版本被用于:

    [root@admin ~]# ceph features

先决条件

  • 一个正在运行的 Red Hat Ceph Storage 集群。

流程

  1. 确保 balancer 模块位于:

    示例

    [root@mon ~]# ceph mgr module ls | more
    {
        "always_on_modules": [
            "balancer",
            "crash",
            "devicehealth",
            "orchestrator_cli",
            "progress",
            "rbd_support",
            "status",
            "volumes"
        ],
        "enabled_modules": [
            "dashboard",
            "pg_autoscaler",
            "prometheus"
        ],

    1. 如果 balancer 模块没有列在 always_onenabled 模块中,则启用它:

      语法

      ceph mgr module enable balancer

  2. 打开 balancer 模块:

    [root@mon ~]# ceph balancer on
  3. 默认模式为 crush-compat。可使用以下方法更改模式:

    [root@mon ~]# ceph balancer mode upmap

    或者

    [root@mon ~]# ceph balancer mode crush-compat

状态

balancer 的当前状态可随时检查:

[root@mon ~]# ceph balancer status

自动平衡

默认情况下,在打开 balancer 模块时会使用自动平衡:

[root@mon ~]# ceph balancer on

可以使用以下方法再次关闭:

[root@mon ~]# ceph balancer off

这将使用 crush-compat 模式,它与旧的客户端向后兼容,并且会随着时间的推移对数据分发进行小更改,以确保 OSD 平等地使用。

节流

如果集群已降级,则没有对 PG 分发的调整,例如,如果 OSD 已出现故障,系统尚未修复自身。

当集群处于健康状态时,负载均衡器会节流到其更改,使得 PG 百分比被错误或需要移动,默认低于 5%。可以使用 target_max_misplaced_ratio 设置调整这个百分比。例如,将阈值增加到 7%:

示例

[root@mon ~]# ceph config set mgr target_max_misplaced_ratio .07

用于自动平衡:

  • 将自动负载均衡器运行间隔之间的秒数设置为 sleep :

示例

[root@mon ~]# ceph config set mgr mgr/balancer/sleep_interval 60

  • 将天数设置为以 HHMM 格式开始自动平衡:

示例

[root@mon ~]# ceph config set mgr mgr/balancer/begin_time 0000

  • 以 HHMM 格式设置一天完成自动平衡的时间:

示例

[root@mon ~]# ceph config set mgr mgr/balancer/end_time 2359

  • 将自动平衡限制为一周或之后的这一天。使用与 crontab 相同的惯例,0 代表星期日,1 代表星期一,以此类推:

示例

[root@mon ~]# ceph config set mgr mgr/balancer/begin_weekday 0

  • 将自动平衡限制为一周或更早的这一天。这使用与 crontab 相同惯例,0 代表星期日,1 代表星期一,以此类推:

示例

[root@mon ~]# ceph config set mgr mgr/balancer/end_weekday 6

  • 定义自动平衡限制的池 ID。这样做的默认值是一个空字符串,这意味着所有池都是均衡的。可以使用 ceph osd pool ls detail 命令获取数字池 ID:

示例

[root@mon ~]#  ceph config set mgr mgr/balancer/pool_ids 1,2,3

监控的优化

balancer 操作分为几个不同的阶段:

  1. 构建 计划
  2. 评估数据分发的质量,针对当前的 PG 分发,或在执行一个计划(plan)后生成的 PG 分发。
  3. 执行计划

    • 评估和分数当前发行版:

      [root@mon ~]# ceph balancer eval
    • 评估单个池的分发:

      语法

      ceph balancer eval POOL_NAME

      示例

      [root@mon ~]# ceph balancer eval rbd

    • 查看更多评估详情:

      [root@mon ~]# ceph balancer eval-verbose ...
    • 使用当前配置模式生成计划:

      语法

      ceph balancer optimize PLAN_NAME

      使用自定义计划名称替换 PLAN_NAME

      示例

      [root@mon ~]# ceph balancer optimize rbd_123

    • 查看计划的内容:

      语法

      ceph balancer show PLAN_NAME

      示例

      [root@mon ~]# ceph balancer show rbd_123

    • 要丢弃旧计划:

      语法

      ceph balancer rm PLAN_NAME

      示例

      [root@mon ~]# ceph balancer rm rbd_123

    • 要查看当前记录的计划,请使用 status 命令:

      [root@mon ~]# ceph balancer status
    • 要计算执行计划后结果的分发质量:

      语法

      ceph balancer eval PLAN_NAME

      示例

      [root@mon ~]# ceph balancer eval rbd_123

    • 执行计划:

      语法

      ceph balancer execute PLAN_NAME

      示例

      [root@mon ~]# ceph balancer execute rbd_123

      注意

      仅在希望改进发行版时执行计划。执行后,计划将被丢弃。