注意
本文档适用于 Ceph 的开发版本。
均衡器模块
均衡器(balancer)可以优化放置组 (PG) 在 OSD 上的分配,以实现均衡分布。均衡器可以自动运行,也可以在有人监督的情况下运行。
状态
要检查均衡器的当前状态,请运行以下命令
ceph balancer status
自动均衡
当均衡器处于 upmap 模式(默认模式)时,自动 upmap 均衡功能启用。有关更多详细信息,请参阅 使用 pg-upmap。要禁用均衡器,请运行以下命令
ceph balancer off
均衡器模式可以从 upmap 模式更改为 crush-compat 模式。crush-compat 模式向后兼容旧版客户端。在 crush-compat 模式下,均衡器会自动对数据分布进行微小更改,以确保 OSD 得到同等利用。
附加模式包括 upmap-read 和 read。upmap-read 模式将 upmap 均衡器与 read 均衡器结合起来,以优化写入和读取。当只需要读取优化时,可以使用 read 模式。有关更多详细信息,请参阅 操作读取(主)均衡器。
节流
如果集群处于降级状态(即,如果 OSD 发生故障且系统尚未自我修复),则均衡器不会对 PG 分布进行任何调整。
当集群健康时,均衡器将分阶段重新映射不均衡的 PG,以逐步提高 PG 分布的均匀性。单个阶段中要重新映射(移动)的 PG 最大百分比默认为 5%。要调整此 target_max_misplaced_ratio 阈值设置,请运行以下形式的命令
ceph config set mgr target_max_misplaced_ratio .03 # 3%
较大的值可能会提高集群均衡/收敛的速度,但可能会对客户端操作产生更大的影响。
有一个单独的设置 upmap_max_deviation,用于 PG 分布必须有多均匀才能让模块认为集群充分均衡。在撰写本文时(2025 年 6 月),该值默认为 5,这意味着如果给定 OSD 的 PG 副本与集群平均值相比上下波动不超过 5 个,则认为其已充分均衡。
PG 副本/分片(与逻辑 PG 不同)的此值由 ceph osd df 命令在 PGS 列下报告,与平均值的上下波动在 VAR 列下报告。通过设置一个非常低的值来指定完美或近乎完美的分布似乎是可取的,但在实践中不建议这样做,尤其是在集群或单个池配置的 PG 数量少于理想数量时。该设置值过低可能会导致均衡器永远重新洗牌数据,因为它努力满足不可能的期望。
话虽如此,具有多个 CRUSH 设备类和/或容量不同的 OSD 的集群将受益于较小的值。在这种情况下,请运行以下形式的命令
ceph config set mgr mgr/balancer/upmap_max_deviation 1
对于大多数集群来说,这个值是合理且安全的。请注意,这是一个绝对的整数 PG 数量,而不是百分比。
均衡器在运行之间休眠。要设置此休眠间隔的秒数,请运行以下命令
ceph config set mgr mgr/balancer/sleep_interval 60
要设置自动均衡开始的时间(HHMM 格式),请运行以下命令
ceph config set mgr mgr/balancer/begin_time 0000
要设置自动均衡结束的时间(HHMM 格式),请运行以下命令
ceph config set mgr mgr/balancer/end_time 2359
自动均衡可以限制在特定的星期几。要将其限制为特定的星期几或更晚(与 crontab 一样,0 是星期日,1 是星期一,依此类推),请运行以下命令
ceph config set mgr mgr/balancer/begin_weekday 0
要将其限制为特定的星期几或更早(同样,0 是星期日,1 是星期一,依此类推),请运行以下命令
ceph config set mgr mgr/balancer/end_weekday 6
自动均衡可以限制在特定的池中。默认情况下,此设置的值为空字符串,因此所有池都会自动均衡。要将自动均衡限制为特定的池,请检索其数字池 ID(通过运行 ceph osd pool ls detail 命令),然后运行以下命令
ceph config set mgr mgr/balancer/pool_ids 1,2,3
模式
支持四种均衡器模式
crush-compat。此模式使用兼容性权重集功能(在 Luminous 中引入)来管理 CRUSH 层次结构中设备的替代权重集。当均衡器在此模式下运行时,正常权重应保持设置为设备的容量,以反映计划存储在设备上的目标数据量。然后,均衡器将优化权重集值,以小幅度向上或向下调整它们,以实现尽可能接近目标分布的分布。(因为 PG 放置是一个伪随机过程,它受到自然变异量的影响;优化权重有助于抵消这种自然变异。)
请注意,此模式与旧版客户端完全向后兼容:当 OSD Map 和 CRUSH map 与旧版客户端共享时,Ceph 会将优化的权重呈现为“真实”权重。
此模式的主要限制是,如果层次结构的子树共享任何 OSD,则均衡器无法处理具有不同放置规则的多个 CRUSH 层次结构。(这种 OSD 共享并不典型,并且由于管理共享 OSD 上的空间利用率很困难,通常不建议这样做。)
upmap。在 Luminous 及更高版本中,OSDMap 可以存储单个 OSD 的显式映射,作为正常 CRUSH 放置计算的例外。这些
upmap条目提供对 PG 映射的细粒度控制。此均衡器模式优化单个 PG 的放置,以实现均衡分布。在大多数情况下,生成的分布几乎完美:即,每个 OSD 上的 PG 数量相等(±1 PG,因为总数可能无法平均分配)。要使用
upmap,所有客户端必须是 Luminous 或更高版本。read。在 Reef 及更高版本中,OSDMap 可以存储单个主 OSD 的显式映射,作为正常 CRUSH 放置计算的例外。这些
pg-upmap-primary条目提供对主 PG 映射的细粒度控制。此模式优化单个主 PG 的放置,以实现集群中的均衡读取或主 PG。在read模式下,不执行 upmap 行为,因此此模式最适用于仅需要读取均衡的用例。要使用
pg-upmap-primary,所有客户端必须是 Reef 或更高版本。有关客户端兼容性的更多详细信息,请参阅 操作读取(主)均衡器。upmap-read。此均衡器模式结合了
upmap和read模式的优化优势。与read模式一样,upmap-read使用pg-upmap-primary。因此,只有 Reef 及更高版本的客户端兼容。有关客户端兼容性的更多详细信息,请参阅 操作读取(主)均衡器。强烈建议使用
upmap-read来实现upmap模式提供的均衡 PG 分布以及read模式提供的均衡读取。
默认模式是 upmap。可以通过运行以下命令将模式更改为 crush-compat
ceph balancer mode crush-compat
可以通过运行以下命令将模式更改为 read
ceph balancer mode read
可以通过运行以下命令将模式更改为 upmap-read
ceph balancer mode upmap-read
监督优化
均衡器的监督使用可以从三个不同阶段来理解
构建计划
评估数据分布的质量,无论是针对当前的 PG 分布还是针对执行计划后将产生的 PG 分布
执行计划
要评估当前分布,请运行以下命令
ceph balancer eval
要评估单个池的分布,请运行以下命令
ceph balancer eval <pool-name>
要更详细地查看评估,请运行以下命令
ceph balancer eval-verbose ...
要指示均衡器生成计划(使用当前配置的模式),请为计划起一个名称(任何有用的标识字符串),然后运行以下命令
ceph balancer optimize <plan-name>
要查看计划的内容,请运行以下命令
ceph balancer show <plan-name>
要显示所有计划,请运行以下命令
ceph balancer ls
要丢弃旧计划,请运行以下命令
ceph balancer rm <plan-name>
要查看当前记录的计划,请检查以下状态命令的输出
ceph balancer status
要更详细地查看状态,请运行以下命令
ceph balancer status detail
要启用 ceph balancer status detail,请运行以下命令
ceph config set mgr mgr/balancer/update_pg_upmap_activity True
要禁用 ceph balancer status detail,请运行以下命令
ceph config set mgr mgr/balancer/update_pg_upmap_activity False
要评估执行特定计划后将产生的分布,请运行以下命令
ceph balancer eval <plan-name>
如果计划预计会改善分布(即,计划的分数低于当前集群状态的分数),您可以通过运行以下命令执行该计划
ceph balancer execute <plan-name>