别搞错了!Paxos不是一致性算法!
保留所有版权,请引用而不是转载本文(原文地址 https://yeecode.top/blog/120/ )。
说到一致性,大家都不陌生。随着分布式系统、微服务系统、区块链等技术的发展,“一致性”一词出现的频率也越来越高。
再说起一致性时,有人会联想到一个“一致性”算法——Paxos算法。
然而,这是错误的,因为:Paxos并不是一个一致性算法!
而正是上述误解,使得很多分布式的学习者陷入了混乱之中。给分布式的学习带来了很大的麻烦。
为了让大家明确这些概念,我们先温习下分布式一致性的概念。
分布式系统中的一致性是说,用户在分布式系统的某个节点上进行了变更操作,则在一定时间后,用户能从系统的任意节点上读取到这个变更结果。并且,一致性有强弱之分,如顺序一致性、线性一致性、最终一致性等等,都代表了特定的一致性级别。
而熟悉Paxos算法的同学知道,Paxos并不能够帮助系统实现一致性,更不用说帮助系统达到具体的哪种一致性级别了。所以,Paxos算法,并不是一致性算法。
Paxos算法,是个共识算法!
要想理清这一切,我们需要了解共识这一概念。
共识与一致性是两个紧密关联但又彼此独立的概念,然而,在日常的讨论中我们常将两者混淆。这在理解和使用上带来了许多麻烦。
共识(Consensus)是指分布式系统中各个节点对某个提议达成一致的过程。共识中提议的含义很广泛,可以是某个变量的值,可以某个节点的角色,等等。
一致性是指系统各个节点对外表现一致,而共识则是各个节点就某个提议达成一致的内部过程。因此,一致性(Consistency)和共识(Consensus)并不是同一个概念,它们在英文中也完全不是一个单词。但是两者却在很多工程领域的文章、书籍中被混淆,这一点我们要特别注意。
共识和一致性也有一定的关系。在一个分布式系统中,数据副本存放在不同节点上。用户修改了某个节点的数据后,经过一定时间,如果用户能从系统任意节点读取到修改后的数据,那我们就说该分布式系统实现了一致性。既然用户能从系统中读到修改后的数据,则说明分布式系统中所有节点对这次的数据修改提议达成了共识。因此,一致性是目的,而共识是实现一致性这一目的所要经历的一个过程。
此外一致性有强弱之分,而共识则没有。共识需要所有节点对某个提议达成一致,只要达成一致,就是实现了共识;只要达不成一致,就没有实现共识。
我们可以通过组织班级春游的例子来理解共识和一致性这两个概念的区别。
几个班委会成员在会议室讨论班级要去哪春游,讨论的过程就是一个共识过程。可能有的班委提议去西湖,有的班委提议去西溪湿地,有的班委提议去太子湾,最终大家不断讨论得出一个确定结果的过程就是共识。期间可能会涉及多轮的提议、投票等,这个过程和本节将要讨论的共识算法的实现流程也十分相似。
当班委会讨论并确定春游的地点之后,需要向全班同学公布这一结果。如何公布这一结果就是一个一致性问题。如果选择张贴班级公告栏,则同学们看到公告的时间有先后(这时其他班级的同学询问起来,可能有人会回答“不知道”,有人会回答“公告说了,我们班春游去西湖”),那这就不满足线性一致性;如果选择群发短信,则所有同学会同时收到通知(这时其他班级的同学询问起来,大家都会回答“短信通知过了,我们班春游去西湖”),那这就满足线性一致性。
可见,共识是一致性的基础。毕竟如果班委会无法就春游地点达成共识,那就无法向全班同学公布结果。但是,这两个概念并不相同,不能混为一谈。
Paxos算法提出者Leslie Lamport描述Paxos算法的论文《Paxos Made Simple》中写道“ At its heart is a consensus algorithm—the “synod” algorithm of.”而论文第二章的名字就叫“The Consensus Algorithm”1。甚至,论文通篇都没有出现过“consistency(一致性)”这一单词。
Paxos算法是一个比较完美的共识算法,以至于有人这样称赞它:“世上只有一种共识(consensus)算法,那就是Paxos”。它可以在存在故障节点但没有恶意节点的前提下保证系统中节点达成共识,这是一个完备的共识算法。Multi-Paxos算法、Fast-Paxos算法、Raft算法都是由Paxos演化来的。
关于共识算法、一致性算法的区别,以及共识算法(包括Paxos算法、Raft算法)的详解,大家可以参考下面的书籍。会帮助大家对分布式系统的一致性建立更全面系统的认识。

书中对各种一致性算法都进行了详细的介绍。还详细阐述了共识算法,给出了Paxos算法的推导过程、理解分析、具体示例。应该是最简单易懂的Paxos讲解书籍了。
另外这本书对分布式系统相关的理论、实践、工程知识均进行了详细的介绍,层层递进,有助于大家建立完整的分布式系统知识体系。涉及一致性、共识、Paxos、分布式事务、服务治理、微服务、幂等、消息系统、Zookeeper等。并且还发行了繁体版!
再次提醒大家,在学习分布式系统时,因为涉及到的理论、框架很多。所以大家一定要理清知识脉络,否则容易学得越多越混乱。
最后,我是高级架构师易哥。
真心希望本文能让大家有所收获,纠正大家的一些错误认知。
欢迎关注我们,我会偶尔出没分享软件架构和编程相关的干货知识。
- Lamport L. Paxos made simple[J]. ACM SIGACT News (Distributed Computing Column) 32, 4 (Whole Number 121, December 2001), 2001: 51-58. [return]
可以访问个人知乎阅读更多文章:易哥(https://www.zhihu.com/people/yeecode),欢迎关注。