知识卡片

Ceph故障恢复的peering与pglog版本比对

专业/工作 · 555.o

内容

每个PG的各个副本都维护一份pglog,记录对该PG内数据对象的每一次操作及其版本号,正常情况下同一PG不同副本的pglog应该完全一致,但节点重启、网络中断等故障发生后就会产生差异。Ceph用peering这个过程来处理:以PG为单位比对各副本pglog的差异,计算出缺失了哪些更新,构造出一份完整的对象缺失列表;peering期间该PG的I/O请求会被挂起,peering完成、进入激活状态后才恢复处理,其中命中缺失列表的对象会被优先修复。如果副本落后太多、pglog记录数不够覆盖差异(默认只保留3000条),就只能退化为backfill,直接全量复制整个PG的数据。发散:pglog的思路和数据库的WAL、[[去重系统崩溃恢复的WAL加NVRAM设计]]是同一类机制——通过记录”发生了什么操作”而不是仅仅记录”最终状态是什么”,故障恢复时才能精确定位差异而不必每次都做代价高昂的全量比对。

参考来源

《Linux开源存储全栈详解从Ceph到容器存储》第7章《分布式存储与Ceph》