paxos算法 IV
文章目录
【注意】最后更新于 January 17, 2018,文中内容可能已过时,请谨慎使用。
上一篇我们说到了paxos协议的初始协议,可以满足paxos的三大定理。但是依然具有很大的弊端。所以Paxon人民砥砺前进,再创辉煌。
我们上文说到Paxon发现需要记录很多内容,对于协议做了进一步的约束,来保证效率的同时减少数据量。
基本协议
根据上文,我们知道初始协议具有弊端,每个牧师都需要记录他创建的$B_{bal}$,以及他所参与投票的每一个$vote$,还有,他给其他牧师发送的$LastVote$。这些产生的数据量都比较大,所以数学家们为了提升效率,对这个过程做了更多的限制,也使得效率得到了提升。
介绍
首先,牧师只需要记录以下几点信息 1. $lastTried[p]$议员上次尝试创建的投票,如果没有的话,就记录为$-\infty$ 2. $prevVote[p]$议员投票的$B{bal}$最大的投票,如果没有参与的话,就记录$-\infty$ 3. $nextBal[p]$议员p发送过的$lastVote(b,v)$中最大的b值,如果没有的话,就记录$-\infty$ 由于变成只需要记录这三点信息,因此议员p在创建新的投票的时候,只需要跟$lastTried[p]$对比就好了。 除此之外,原来的协议要求议员q不在$[B{bal},b]$之间产生新的投票,现在规则加强了,只要投票序号小于$b$就不会变更法案。
过程
废话少说,我们现在看下新的这几步变成了什么。
第一步
首先议员p创建一个新的投票,先定义出投票序号$b$,具体的内容先不确定,b要大于$lastTried[p]$,,然后更新$lastTried[p]=b$,发送$NextBallot[p]$给议员集合。
第二步
议员q收到了p发来的$NextBallot[b]$,如果$b>nextBal[q]$的话,q就把$lastVote(b,v)$发送给p,同时设置$nextBal[q]=b$,当然,发送给p的v就是$prevVote[q]$ 如果$b<nextBal[q]$的话,$NextBallot(b)$就直接忽略了。
第三步
议员p收到了$LastVote(b,v)$,这些回复的议员集合$B{qrm}$,b从$lastVote(b,v)$集合里面取出符合定理3的法案d,就向$B{qrm}$发送$BeginBallot(b,d)$. 符合$B_{3}$,就是从$LastVote(b,v)$中取出最接近b的法案。
第四步
议员q之前记录了$nextBal[q]$,如果等于b的话,就记录这个提案d,并设置$prevVote[q]=d$,向p发送$Voted(b,q)$。如果q之前回复过其他议员的提案,可能导致$b \neq nextBal[q]$,那么就直接拒接这个提案了。
第五步
议员p收到了议员q返回的$voted(b,q)$,如果$B{qrm} \subseteq B{vot}$,就证明全票通过,记录下提案并向$B_{qrm}$发送$Success(d)$信息。如果没有全部收到的话,就继续发送或者等待。
第六步
议员q收到了$Success(d)$的话,也记录下这个通过的法案。
结论
从这六步可以看出来,这个是对初始协议的限定版,所以原协议能通过的一致性,本基本协议更一定能通过。
完整协议
由于基本协议已经定义了主干内容,这一部分lamport大神并没再对步骤做进一步阐释,而是介绍了各种恶劣情况,论证了协议的各部分欠缺以及解决办法。 首先是投票的情况,如果没有人生成投票或者一直生成新的投票,会导致无法稳定,一直在等待,因此有了几种解决办法。
ballot创建
- 选举leader生成
新提案生成取决于超时或者有人提出了更高的投票选项。
leader的选举
选举leader主要目标是为了初始化ballot和创建ballot。 选举的条件是T分钟之内集合没有任何变化的话,议员推选自己为主席,然后向其他人广播,按照字母表进行排序,选择最后一个作为主席。
结论
相较于基本协议,增加了一些新的内容,比如及时相应步骤(2)-(6),以及推选主席的方式和创建ballot的时间。
神权消失了,牧师不再存在,议员诞生了。 我们下面就要开始接触多法案同时进行multi-paxos了。