知识卡片
分块修复大对象靠临时空间保证原子可见性
内容
单次修复传输的数据量有上限(默认 8MB),如果一个对象比这个值大,修复就必须拆成多次 push/pull 才能传完。为了不让”修复到一半”的半成品对象在这期间被其他请求读到,数据先写入 PG 的临时存储空间,等这个对象的所有分块全部传输完成后,才整体移动到 PG 的正式存储位置。这和 [[日志与事务实现磁盘写入的原子性|日志机制保证写操作原子性]]是同一个思路在修复场景的重现:只要一个操作被拆成多个步骤执行,就必须有某种机制保证外部观察者只能看到”完全没开始”或”完全做完”这两种状态之一,不能让部分完成的中间态被误当作正确结果使用。
参考来源
《Ceph源码分析》第11章《Ceph数据修复》