注意

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

恢复预留

恢复预留扩展并包含回填预留。回填恢复中的预留系统用于本地和远程预留。

当一个 PG 变为 active 时,它首先确定是否需要恢复以及需要哪种类型的恢复。它可能需要基于日志的恢复、回填恢复、两者都需要,或者两者都不需要。

在基于日志的恢复中,主 OSD 首先从 OSDService 的 local_reserver 获取本地预留。然后,按照 OSD 编号的顺序向每个副本发送 MRemoteReservationRequest 消息。这些请求总是会被批准(即不能被拒绝),但如果远程 OSDs 已经授予了它们所有的远程预留槽位,则可能需要一些时间才能被批准。

获取所有预留后,基于日志的恢复按照没有预留系统时的方式进行。

基于日志的恢复完成后,主 OSD 释放所有远程预留。本地预留仍然被持有。然后,主 OSD 确定是否需要回填。如果不需要,主 OSD 释放其本地预留,并在 Recovered 状态下等待所有 OSDs 表示它们是 clean 的。

如果在基于日志的恢复之后发生回填恢复,则不需要重新获取本地预留,因为它仍然被持有。如果它在激活后立即发生(基于日志的恢复不可能/不需要),则按照典型过程获取本地预留。

一旦主 OSD 拥有了本地预留,它就会向回填目标请求远程预留。该预留可以被拒绝,例如,如果 OSD 太满(backfillfull_ratio osd 设置)。如果预留被拒绝,主 OSD 放弃其本地预留,等待(osd_backfill_retry_interval),然后重试。它将无限期地重试。

一旦主 OSD 拥有了本地和远程预留,回填照常进行。回填完成后,远程预留被放弃。

最后,在回填之后(或者如果不需要回填,则在基于日志的恢复之后),主 OSD 放弃本地预留并进入 Recovered 状态。一旦所有 PG 都报告它们是 clean 的,主 OSD 就会进入 Clean 状态并将其自身标记为 active+clean。

转储预留

一个 OSD 守护程序命令转储总的本地和远程预留

ceph daemon osd.<id> dump_recovery_reservations

注意事项

我们总是先获取本地预留,以防止循环依赖。出于同样的原因,我们按照 OSD 编号的顺序获取远程预留。

恢复预留状态图控制着报告给 monitor 的 PG 状态。状态图可以设置:

  • recovery_wait: 等待本地/远程预留

  • recovering: 正在恢复

  • recovery_toofull: 恢复停止,OSD(s) 超过 full ratio

  • backfill_wait: 等待远程回填预留

  • backfilling: 正在回填

  • backfill_toofull: 回填停止,OSD(s) 超过 backfillfull ratio

另请参阅

自动生成的 OSD 状态图的 Active 子状态。

由 Ceph 基金会为您呈现

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