什么是 3PC
三阶段提交(Three-Phase Commit, 3PC)是一种的分布式事务协议,它是 两阶段提交(2PC) 协议的改进版本,旨在减少阻塞并提高系统的容错能力。三阶段提交协议将 2PC 的准备阶段进一步细分为两个阶段,以解决协调者故障导致的参与者长期阻塞问题。下面是三阶段提交的三个关键阶段。
1. 询问阶段(CanCommit)
协调者向所有参与者发送 CanCommit 请求,询问它们是否可以提交事务。参与者在收到请求后,会评估自身是否有能力执行事务(比如检查资源是否冲突),如果可以,则回复 Yes,并进入预备状态;如果不能,则回复 No。
2. 准备阶段(PreCommit)
- 协调者
- 如果协调者在 CanCommit 阶段收到所有参与者的 Yes响应,它会向所有参与者发送 PreCommit 请求,要求它们做事务提交前的准备工作,比如写入 redo/undo 日志。
- 参与者
- 参与者在收到 PreCommit 后,会执行预提交操作,但此时事务还未对外界可见。完成预提交后,参与者会回复 ACK 给协调者表示已准备好提交。
3. 提交阶段(DoCommit)
- 协调者
- 如果协调者收到所有参与者的 ACK 响应(或超时未收到响应),它会发送 DoCommit 命令给所有参与者,指示它们正式提交事务。
- 如果在 PreCommit 阶段有任何参与者回复 No 或协调者在此阶段崩溃,则协调者会发送 Abort 命令,要求所有参与者回滚事务。
- 参与者
- 参与者在收到 DoCommit 后会提交事务并释放资源;收到 Abort 则会回滚事务。
注意
当参与者响应 ACK 后,即使在指定时间内没收到 doCommit 指令,也会进行事务的最终提交;
一旦进入提交阶段,即使因为网络原因导致参与者无法收到协调者的 doCommit 或 Abort 请求,超时时间一过,参与者也会自动完成事务的提交。
3PC 的优缺点
优点:
- 增加了询问阶段,确保尽早发现无法执行操作的参与者节点,提升效率。
- 在准备阶段成功以后,协调者和参与者执行的任务中都增加了超时,一旦超时,参与者都会继续提交事务,默认为成功,降低了阻塞范围。
缺点:
- 如果准备阶段执行事务后,某些参与者反馈执行事务失败,但是由于出现网络分区,导致这些参与者无法收到协调者的中止请求,那么由于超时机制,这些参与者仍会提交事务,导致出现不一致。
- 性能瓶颈,不适合高并发场景。
总结
所以无论是 2PC 还是 3PC,当出现网络分区且不能及时恢复时, 都不能保证分布式系统中的数据 100% 一致。
三阶段提交通过增加预提交阶段,减少了参与者在等待提交决策时的阻塞时间,并且增强了系统对于协调者故障的恢复能力。然而,3PC 依然存在协调者单点问题,且在某些情况下可能引入额外的复杂性和延迟。因此,在现代分布式系统中,还有其他如 Paxos、Raft 等更强健的一致性算法被广泛使用。
Reference