注意

本文档适用于 Ceph 的开发版本。

回填预留

当一个新的 OSD 加入集群时,其 acting set 中的所有 PG 最终都必须进行回填。如果所有这些回填同时发生,它们将对 OSD 造成过大的负载:即“雷鸣般的羊群”效应。

osd_max_backfills 可调参数限制了给定 OSD 上活动的传出或传入回填的数量。请注意,此限制是分别应用于传入和传出回填操作的。因此,每个 OSD 上最多可以有 osd_max_backfills * 2 个回填操作在进行中。这种微妙之处常常被忽略,Ceph 运维人员可能会对为什么观察到的操作多于预期感到困惑。

每个 OSDService 现在都有两个 AsyncReserver 实例:一个用于从 OSD 出去的回填 (local_reserver),另一个用于进入 OSD 的回填 (remote_reserver)。AsyncReserver (common/AsyncReserver.h) 管理一个按优先级排列的等待项目队列和一组当前的预留持有者。当一个槽位空闲时,AsyncReserver 会将与最高优先级队列中下一个项目相关的 Context* 排入提供给构造函数的 finisher 中。

对于主 OSD 来说,要启动回填,它必须首先从自己的 local_reserver 获取预留。然后,它必须通过 MBackfillReserve 消息从回填目标的 remote_reserver 获取预留。这个过程由 ActiveReplicaActive 的子状态管理(参见 PG.h 中 Active 的子状态)。预留会在 Backfilled 事件发生时被释放(该事件在主 OSD 上调用 recovery_complete 之前发送,并在副本 OSD 上收到 BackfillComplete 进度消息时发送),或者在离开 ActiveReplicaActive 时被释放。

为了防止循环依赖,始终先获取本地预留,然后再获取远程预留非常重要。

我们通过优先恢复 PG 的顺序来最大限度地降低数据丢失的风险。管理员可以使用 force-recoveryforce-backfill 来覆盖默认顺序。一个优先级为 255force-recovery 操作将先于优先级为 254force-backfill 操作开始。

如果需要恢复是因为 PG 低于 min_size,则使用基本优先级 220。这个优先级会根据缺少池的 min_size 的 OSD 数量以及与池的 recovery_priority 相关的值递增。最终优先级上限为 253,以使其不会干扰如上所述的强制操作。在一般情况下,恢复操作的优先级设置为 180 加上与池的 recovery_priority 相关的值。最终优先级上限为 219

如果需要回填是因为 acting OSD 的数量少于池的 min_size,则使用优先级 220。缺少池的 min_size 的 OSD 数量以及与池的 recovery_priority 相关的值被添加。总优先级上限为 253

如果需要回填是因为 PG 容量不足 (undersized),则使用优先级 140。低于池大小的 OSD 数量以及与池的 recovery_priority 相关的值被添加。最终优先级上限为 179。如果需要回填操作是因为 PG 降级 (degraded),则使用优先级 140。与池的 recovery_priority 相关的值被添加。最终优先级上限为 179。在一般情况下,回填操作的优先级设置为 100。与池的 recovery_priority 相关的值被添加。总优先级上限为 139

回填和恢复操作优先级

描述

基本优先级

最大优先级

回填

100

139

降级回填

140

179

恢复

180

219

非活动状态恢复

220

253

非活动状态回填

220

253

force-backfill

254

force-recovery

255

由 Ceph 基金会为您呈现

Ceph 文档是由非营利性 Ceph 基金会 资助和托管的社区资源。如果您希望支持这项工作和我们的其他努力,请考虑 立即加入