参考链接:
https://www.zhihu.com/question/19787937/answer/107750652
http://www.importnew.com/24420.html
1.首先还是概念:
Paxos算法包含三个角色Proposor,Acceptor,Learner,Client。
Client : 发起请求
Proposor : 提出提案。
Acceptor : 接收或者拒绝提案,并返回相应内容。
Learner : 学习已经确定的提案。
2. 重要原则:
- 一共有两个阶段,第一个阶段是申请提案的权限(准备阶段),
第二个阶段才是真正提案(提交阶段)。以下用准备请求和提交请求区分。 - Proposor在多数Acceptor同意自己的准备请求的情况下,才能进入提交阶段。
- 如果Acceptor之前没有收到过任何准备请求,则直接同意请求。(下图,步骤1)
- 如果Acceptor接收到的准备请求的编号,大于上一次准备请求的编号,则同意新请求。否则,拒绝。(下图,步骤2中,同意编号2的新请求)
- 如果Acceptor已经接收了某个提交请求,再接收到准备请求时,告知Proposor已经接收的提交请求编号以及值。(下图,步骤5,Acceptor1告知已接受编号1、value=a, Acceptor2告知已接受编号2、value=b)
- 当Proposor发送准备请求,被一个或多个Acceptor告知,其已经接受某些提交请求时,则当前Proposor从所有被接受的提交请求中,找到编号最大的请求的值,进行下一次提交。 (下图,步骤6,)
3.图示
4. 文字说明:
参考上图, 假设2个Proposor, 3个Acceptor。 初始编号 Proposor1=1, Proposor2=2 。
以下按时间顺序进行:
-
Proposor1 把自己的编号(1)发送给所有Acceptor申请批准进行提案。
-
Proposor2 把自己的编号(2)发送给所有Acceptor申请批准进行提案。
-
Acceptor1,Acceptor2 先收到Proposor1的请求,由于之前没有接受过申请,所以都同意Proposor1。
-
Proposor1获得超过半数同意,准备提交。(此时还没向Acceptor3发送,或者已经发送还没有应答)。
-
Acceptor3接收到Proposor2的请求,由于之前没有接受过申请,所以同意Proposor2。
Acceptor2接收到Proposor2的请求,判断编号2大于之前的1,所以同意Proposor2。
-
Proposor2获得超过半数同意,准备提交。(此时还没向Acceptor1发送,或者已经发送还没有应答)。
-
Proposor1向Acceptor1,Acceptor2提交。
-
Acceptor1同意Proposor1,Acceptor2发现当前编号已经为2,所以拒绝Proposor1。
-
Acceptor3同意Proposor2,Acceptor2同意Proposor2。
-
Proposor2提交成功。
-
Proposor1增大编号,将编号(3)发送给所有Acceptor重新申请批准进行提案。
-
Acceptor2同意Proposor1,并且告知已经接受编号1(value=a)的提案。
Acceptor3同意Proposor1,并且告知已经接受编号2 (value=b) 的提案。
-
Proposor1选择上一步中编号大的值提交。所以,提交编号3,value=b;
-
达成一致。