世界上只有一种共识协议,就是Paxos,其他所有共识算法都是Paxos的退化版本
---------------Mike Burrows,Google Chubby 作者
基础概念
Pxos是由Leslie Lamport提出的一种基于信息传递的协商共识算法,是当今分布式系统最重要的理论基础,几乎就是“共识”二字的代名词。
所谓的共识可以理解为是让一个系统不受局部的网络分区,崩溃故障,执行性能或其它因素影响,最终能表现出整体一致性的过程。共识和一致性的区别:一致性是指数据不同副本之间的差异,而共识是指达成一致性的方法与过程。
算法流程
Paxos算法将系统中的节点分为三类:
- 提案节点:称为Proposer,提出对某个值进行设置操作的节点,设置这个操作就被称为提案,值一旦被设置成功就不会丢失,也不会改变。(类比写日志)
- 决策节点:称为Accept,是应答提案的结点,决定该提案是否可被接受,提案一旦得到过半数决策节点的接受,即称该提案被批准。
- 记录节点:称为Learner,不参与提案,也不参与决策,只是单纯的从提案,决策节点中学习已经达成共识的提案。
Paxos算法包含两个阶段:
阶段一
第一个阶段“准备”(Prepae)就相当于一个抢占锁的过程。如果某个提案节点准备发起提案,必须向所有决策节点发起一个申请。提案请求中会携带一个全局唯一递增的数字n作为提案id,决策点在收到请求后会有两个承诺和一个应答。
两个承诺:
- 承诺不会再接受提案id小于或等于n的Prepare的请求。
- 承诺不会再接受提案id小于n的Accept请求。
一个应答:
- 在不违背以前的承诺的前提下,回复已经批准过的提案中id最大的那个提案所设定的值和提案id,如果该值从来没有被任何提案设定过,则返回空值。如果违反此前作出的承诺,即受到的提案id并不是决策节点收到的最大的id,那允许直接对此Prepare不予理会。
阶段二
第二阶段为“批准”(Accept)过程,这时有如下两种可能的结果:
- 如果提案节点发现所有响应的决策节点此前没有批准过任何值,那说明它是第一个设置的节点,将自己选定的值与提案id组成一个二元组(id,value),再次广播给所有决策节点。
- 如果提案节点发现响应的决策节点中已经有至少一个节点的应答中包含值了,那它就不能随意取值,而是必须无条件的从应答中找出提案id最大的那个对应的值并接收,组成一个二元组(id,max_accept_value),再次广播给所有决策节点。
决策节点在收到Accept请求时,在不违背承诺的前提下,会接收并持久化提案id和提案的值。
当提案节点收到多数派决策节点的应答后,协商结束,共识决议形成,然后将形成的决议发给所有记录节点学习。
具体的交互图,参考如下:
paxos最初的算法主要偏重于学术对于工业化并不友好,且存在活锁问题(两个提案反复横跳,不能达成共识,造成系统不可用),需要进一步优化。这时提出了一种算法叫Multi Paxos。
优化算法Multi Paxos
Multi Paxos的核心改进是增加了“选主”的过程。提案节点会通过定时轮询,确定当前网络的所有节点中是否存在一个主提案节点,一旦没有主提案节点,节点会按照前面提到的Paxos算法准备,批准交互流程,向其它节点广播自己要选主的请求,并最终协商一致,达成共识。之后所有客户端的请求都交给主提案节点处理,系统退化为一个无并发的环境,只需要一次批准操作即可。
i为任期编号,必须是严格的单调递增,主要是为了应付陷入网络分区后重新恢复,此时存在多个主提案节点,以任期编号大的为准。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。