注意
本文档适用于 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.h
)AsyncReserver
将与构造函数提供的完成者中最高优先级队列中的下一个项关联的操作排队。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
消息从填充目标的主节点获取预留。该过程由Active
和ReplicaActive
的子状态管理(参见 PG.h 中Active
的子状态)。预留会在发生Backfilled
事件时被丢弃,该事件在主节点调用recovery_complete
之前发送,以及在副本收到BackfillComplete
进度消息时发送),或者在离开Active
或ReplicaActive
.
时被丢弃。重要的是在获取远程预留之前始终获取本地预留,以防止循环依赖。
我们通过优先考虑 PG 恢复的顺序来最小化数据丢失的风险。管理员可以通过使用force-recovery
或force-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. 如果您想支持这一点和我们的其他工作,请考虑加入现在加入.