注意
本文档适用于 Ceph 开发版本。
恢复预留
恢复预留扩展并涵盖了回填预留。回填恢复的预留系统用于本地和远程预留。
当一个 PG 变为活跃时,首先它会确定需要何种类型的恢复,如果有的话。它可能需要基于日志的恢复、回填恢复、两者都需要或都不需要。
在基于日志的恢复中,主节点首先从 OSDService 的 local_reserver 获取一个本地预留。然后按 OSD 编号顺序向每个副本发送一个 MRemoteReservationRequest 消息。这些请求总会被批准(即,不能被拒绝),但如果远程节点已经批准了它们所有的远程预留槽位,批准这些请求可能需要一些时间。
在获取所有预留后,基于日志的恢复会像没有预留系统一样继续进行。
在基于日志的恢复完成后,主节点释放所有远程预留。本地预留仍然被持有。然后主节点确定是否需要回填。如果不需要,主节点释放其本地预留并等待在 Recovered 状态下,直到所有 OSD 都表明它们是干净的。
如果在基于日志的恢复之后发生回填恢复,则不需要重新获取本地预留,因为它之前仍然是被持有的。如果它立即在激活之后发生(基于日志的恢复不可能/不需要),则本地预留将根据典型过程进行获取。
一旦主节点拥有其本地预留,它会向回填目标请求一个远程预留。这个预留可能会被拒绝,例如如果 OSD 太满了(backfillfull_ratio osd 设置)。如果预留被拒绝,主节点会放弃其本地预留,等待(osd_backfill_retry_interval),然后重试。它会无限重试。
一旦主节点拥有本地和远程预留,回填就会像平常一样进行。回填完成后,远程预留会被放弃。
最后,在回填(或者在回填不是必要的情况下,基于日志的恢复)之后,主节点会放弃本地预留并进入 Recovered 状态。一旦所有 PG 都报告它们是干净的,主节点会进入 Clean 状态并标记自己为活跃+干净。
导出预留
一个 OSD 守护进程命令输出总的本地和远程预留:
ceph daemon osd.<id> dump_recovery_reservations
注意事项
我们总是首先获取本地预留,以防止循环依赖。我们按 OSD 编号顺序获取远程预留,原因相同。
恢复预留状态图控制向监视器报告的 PG 状态。状态图可以设置:
recovery_wait:等待本地/远程预留
recovering:正在恢复
recovery_toofull:恢复停止,OSD(s) 超过满配比
backfill_wait:等待远程回填预留
backfilling:正在回填
backfill_toofull:回填停止,OSD(s) 超过回填满配比
参见
自动生成的 OSD 状态图的 Active 子状态。
由 Ceph 基金会带给您
Ceph 文档是一个社区资源,由非盈利的 Ceph 基金会资助和托管Ceph Foundation. 如果您想支持这一点和我们的其他工作,请考虑加入现在加入.