知识卡片
Backfill用多路归并指针对比全量对象列表
内容
[[Recovery与Backfill的适用场景区别|Backfill]] 没有日志可用,只能让主 OSD 和每个需要修复的从 OSD 各自按对象排序扫描出一段对象列表,用一个 check 指针(当前所有从 OSD 里最靠前的待处理对象)和主 OSD 自己的 begin 指针做多路归并式比较:check 落后于主 OSD 的 begin,说明这是主 OSD 已经没有的多余对象,通知对应从 OSD 删除;某个从 OSD 的 begin 恰好等于 check 但版本不同,说明数据过期需要更新;某从 OSD 完全没有这个对象(其 last_backfill 落后于 begin),直接标记为缺失去推送;某从 OSD 的进度反而超前于 check,说明它已经处理过这段,直接跳过。这本质是经典的多路归并算法在分布式副本比对场景的应用——利用”列表都已排序”这个前提,用几个移动指针的相对位置关系,把全量比对压缩成一次线性扫描,而不需要每次都做集合运算。
参考来源
《Ceph源码分析》第11章《Ceph数据修复》