知识卡片

写操作先打包事务再统一执行

专业/工作 · 513.c.1

内容

execute_ctx 阶段完成的只是把这次写操作要做的所有修改(包括快照相关的 COW 处理)封装进一个事务对象,此时磁盘上的数据完全没有变化;真正的落盘发生在更晚的 [[写操作三阶段流水线设计|PGBackend 分发]]阶段,主副本和所有从副本各自对这个事务对象调用本地存储引擎执行。这种”先描述要做什么、再统一执行”的设计(本质是命令模式)使得同一份事务可以原样发给多个副本,保证主从执行的是完全相同的操作序列,而不是各自独立决策可能产生分歧;也让”决策是否可以执行”和”真正执行”这两步可以分别加锁、分别处理失败重试。

参考来源

《Ceph源码分析》第6章《Ceph的数据读写》