注意

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

填充预留

当一个新的 OSD 加入集群时,所有包含该 OSD 在其活动集中的 PG 最终都必须进行填充。如果所有这些填充同时发生,它们将对 OSD 造成过度的负载:“雷鸣羊群”效应。

The osd_max_backfills可调节的参数限制了在给定 OSD 上活跃的出站或入站填充的数量。请注意,此限制分别应用于入站和出站填充操作。因此,每个 OSD 上可以有高达osd_max_backfills * 2填充操作

每个OSDService现在有两个 AsyncReserver 实例:一个用于从 OSD 发起的填充(local_reserver),一个用于向 OSD 发起的填充(remote_reserver)。一个AsyncReserver (common/AsyncReserver.hAsyncReserver将与构造函数提供的完成者中最高优先级队列中的下一个项关联的操作排队。Context* associated with the next item on the highest priority queue in the finisher provided to the constructor.

为了发起填充,主节点必须首先从自己的local_reserver获取预留。然后它必须通过remote_reserver via a MBackfillReserve消息从填充目标的主节点获取预留。该过程由ActiveReplicaActive的子状态管理(参见 PG.h 中Active的子状态)。预留会在发生Backfilled事件时被丢弃,该事件在主节点调用recovery_complete之前发送,以及在副本收到BackfillComplete进度消息时发送),或者在离开ActiveReplicaActive.

时被丢弃。重要的是在获取远程预留之前始终获取本地预留,以防止循环依赖。

我们通过优先考虑 PG 恢复的顺序来最小化数据丢失的风险。管理员可以通过使用force-recoveryforce-backfill。一个force-recovery并设置操作优先级255将在优先级为force-backfill的操作之前开始。如果因为 PG 的优先级低于254.

If recovery is needed because a PG is below min_size基础优先级220而需要恢复,将使用此优先级。这会根据池中缺少的 OSD 数量以及相对于池的min_size as well as a value relative to the pool’s recovery_priority的值。结果优先级被限制在253,以避免与上述强制操作混淆。在正常情况下,恢复操作的优先级为180加上相对于池的recovery_priority的值。结果优先级被限制在219.

。如果因为活动 OSD 数量少于池的min_size而需要填充,将使用优先级220。池中缺少的 OSD 数量以及相对于池的min_size is added as well as a value relative to the pool’s recovery_priority的值也会被添加。总优先级限制在253.

。如果因为 PG 规模不足而需要填充,将使用优先级140。池规模以下的 OSD 数量以及相对于池的recovery_priority的值也会被添加。结果优先级被限制在179。如果因为 PG 降级而需要填充操作,将使用优先级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 基金会资助和托管Ceph Foundation. 如果您想支持这一点和我们的其他工作,请考虑加入现在加入.