知识卡片
EC回滚机制应对全局断电导致的部分写
内容
EC(N+M) 理论上能容忍最多 M 个 OSD 失效,但有一种场景超出这个假设:整个机房断电重启,可能出现”少于 N 个 OSD 成功写入、其余没写完”的中间状态——这既不满足新数据写成功的条件,连旧数据都读不出来了,必须回滚到上一次成功写入的版本。Ceph 针对每种支持的操作都设计了轻量回滚方案:创建对象直接删除即可;删除对象先不真正删、保留原对象以便回滚时恢复;write full 先保留旧对象、新数据写到新对象,回滚时丢弃新对象换回旧的;追加写则在 PG 日志里记下写之前的 size,回滚时对对象做一次 truncate 截断即可。这些方案的共同点是都避免了昂贵的”事先做全量快照再回滚”,而是针对每种操作单独设计一个足够小的可逆步骤。
参考来源
《Ceph源码分析》第8章《Ceph纠删码》