注意
本文档适用于 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 子状态。