两阶段、三阶段提交算法,真的可靠吗?
保留所有版权,请引用而不是转载本文(原文地址 https://yeecode.top/blog/119/ )。
在前面的文章中,我们已经详细介绍了两阶段提交算法、三阶段提交算法。包括它们的具体实现流程、优劣等等。如果对这方面不了解的同学,可以再去温习以前的文章。
关于两阶段提交,我们知道它可能会出现提交不一致的情况。这种情况有两种:
- 假设前面各次通信均正常,但因为网络抖动导致部分参与者无法收到“Commit”消息,则会出现部分参与者提交了事务,部分参与者未提交事务这种不一致情况的发生。
- 假设前面各次通信均正常,如果协调者在发出“Commit”消息或者“Rollback”消息后宕机,部分参与者收到了这条消息后提交或者回滚了事务,部分参与者没有收到这条消息。则也会出现提交不一致的情况。
而三阶段提交,则出现提交不一致的情况更低。但是仍然存在:
- 假设前面各次通信均正常,如果协调者在发送“Rollback”消息后宕机,部分参与者收到了“Rollback”消息回滚了事务;部分参与者因为没有收到“Rollback”消息便会默认提交事务。此时便出现提交不一致的情况。
可见,两阶段提交、三阶段提交均不可靠。都可能会出现提交不一致的情况。
但我们也发现:三阶段提交算法则比两阶段提交算法要好,出现不一致提交的概率更低。这里不仅仅是说出现异常的情况少了一种。而是说三阶段提交的通信次数更多,那前面各次通信均正常且最后一次通信异常的事件,其出现概率也更低。
顺着这个思路走下去,阶段越多,则提交越可靠。那是不是说,继续引入更多的阶段,就可以实现可靠的一致性提交呢?
接下来,我们就来讨论这个问题。
要回答上述疑问,我们可以先了解两军问题(Two Generals’ Problem)。
如下图所示,山顶的两支蓝军将白军左右围困在山谷。两支蓝军必须派信使跨过白军驻守的山谷才能通信。信使在跨过山谷时,可能被白军俘虏导致信息丢失。
假设两支蓝军必须在同一天从两侧夹击白军才能成功,而任意一支蓝军单独发起进攻都会失败。那请问,蓝军能必胜吗?
我们现在思考蓝军怎样通信才能商定出一个进攻日期。
假设蓝军1派出信使,传递信息“第五天发起进攻!”
然后,第五天时,蓝军1能放心地发起进攻吗?
不能,因为蓝军1并不能确定蓝军2收到了自己的消息。
于是,需要蓝军2在收到消息后,派出一个信使告知蓝军1自己收到了消息。
这样,第五天时,蓝军2能放心地发起进攻吗?
不能,因为蓝军2并不能确定蓝军1收到了自己的确认消息。
于是,需要蓝军1在收到了蓝军2的确认消息后,再派出一个信使告诉蓝军2自己已经收到了蓝军2的确认消息。
这样,第五天时,蓝军1能放心地发起进攻吗?
不能,因为蓝军1并不能确定蓝军2收到了自己的确认消息。
于是,需要蓝军2在收到蓝军1的确认消息后,再派出一个信使告诉蓝军1……
这时我们发现,要想可靠地传递包含进攻日期的信息,互派信使的过程似乎要无穷无尽地进行下去。这意味着,两支蓝军无法实现信息的可靠传递。
我们可以使用反证法证明这个结论。
假设双方共派出n个必要的信使后,能够可靠地传递信息。双方在不派信使的情况下,显然无法可靠传递信息,故n≥1。由于信使可能会被俘,则第n个信使可能会被俘。而n个信使都是必要的,这意味着,信息无法可靠传递。
两军问题讨论的是在信道不可靠的情况下,能否可靠传递信息的问题。结论是:如果信道不可靠,则无法可靠传递信息。
举一反三,我们可以将两军算法的思路和结论迁移到一致性提交算法中,讨论能否在网络、节点均不稳定的分布式系统中实现可靠的一致性提交。
假设经过n个必要的阶段后,能够实现可靠的一致性提交。不经过任何阶段,显然无法完成提交,故n≥1。由于分布式系统的通信、节点均不稳定,则第n个阶段可能因为通信故障或节点宕机无法顺利完成。而n个阶段都是必要的,这意味着,无法实现可靠的一致性提交。
可见,即使引入更多的阶段,也无法在网络、节点均不稳定的分布式系统中实现可靠的一致性提交。无论我们增加再多的阶段,都不可能完全避免。
但是,确实,随着阶段的增加,出现不一致提交的概率降低。因为在前n-1次无异常且在第n次恰好异常的情况,会随着n的增加逐渐降低。
所以,一般来说,三阶段提交就够用了。已经可以将不一致提交降到一个极低的水平(因为通信异常本身就是一个小概率实践)。
说到这里,可能有人会说,还有一个重要的一致性算法——Paxos算法——我们没有讲!听说它是一个很棒的算法,能不能实现可靠地一致性提交?
如果问出这个问题,则说明他对一致性的概念是混乱的。因为:Paxos算法是一个共识算法,而不是一致性算法。虽然,确实很多网上的资料都讲Paxos算法当做一致性算法。这种错误的认识,应该就是大家在学习分布式系统时容易感到混乱的原因。
关于共识算法、一致性算法的区别,以及共识算法(包括Paxos算法、Raft算法)的详解,大家可以参考下面的书籍。会帮助大家对分布式系统的一致性建立更全面系统的认识。

书中对各种一致性算法都进行了详细的介绍。还详细阐述了共识算法,给出了Paxos算法的推导过程、理解分析、具体示例。应该是最简单易懂的Paxos讲解书籍了。
另外这本书对分布式系统相关的理论、实践、工程知识均进行了详细的介绍,层层递进,有助于大家建立完整的分布式系统知识体系。涉及一致性、共识、Paxos、分布式事务、服务治理、微服务、幂等、消息系统、Zookeeper等。并且还发行了繁体版!
再次提醒大家,在学习分布式系统时,因为涉及到的理论、框架很多。所以大家一定要理清知识脉络,否则容易学得越多越混乱。
别忘了点赞……
也欢迎关注我!
我是程序员易哥。
可以访问个人知乎阅读更多文章:易哥(https://www.zhihu.com/people/yeecode),欢迎关注。