Appearance
第5章:分布式事务与数据迁移
跨节点原子性
一个事务更新两个分片,要求双方同时提交或同时中止。单个分片内部有可靠共识日志,只能保证该分片自己的副本一致,不能独立完成跨分片原子决定。
两阶段提交中,协调者先请求准备。参与者将必要状态持久化并回答能否提交;若全部同意,协调者持久记录提交决定,再通知参与者,否则决定中止。
准备状态的约束
参与者答应准备后,可能已经把所需锁和恢复信息保留到最终决定。若此时联系不上协调者,它不能仅因超时就随意中止:另一个参与者可能已经收到并执行提交。
这解释了经典 2PC 的阻塞问题。复制协调者状态能提高可用性,但仍需在副本之间正确达成和恢复决定,不能把故障恢复简单交给一个没有记录的新进程。
原子提交只规定一起生效,不自动保证事务间隔离;还需锁、时间戳或其他并发控制。
时间戳与外部一致性
物理时钟有误差,直接按本地墙钟排序可能颠倒真实先后。某些系统显式维护时间不确定区间,并通过等待等手段,使提交时间与外部实时要求相容。
这类方案依赖时钟服务、误差界和协议规则。它不是“所有机器装 NTP 就得到严格可串行化”。逻辑时间戳能建立顺序,也不自动证明其符合真实时间。
分片迁移
把键范围从 A 迁到 B,需要处理复制已有数据、转发或记录迁移期间的新写、更新路由配置以及停止旧所有者接受过期写。
安全切换要回答:哪一配置负责请求,数据复制到哪个进度,旧请求如何去重,旧节点何时失去写权限。先改路由再慢慢复制,可能让读取看到缺失数据;先复制再直接改路由,可能遗漏复制期间的新写。
练习
- 列出 2PC 在协调者崩溃的不同时间点,各参与者允许做什么。
- 为什么 2PC 和两阶段锁名称相近却不能相互替代?
- 为分片迁移设计一个带配置版本和明确切换点的简化协议。