另一篇更详细的Paxos笔记:http://blog.csdn.net/m_vptr/article/details/8014220
每个议员手中有一本律簿
所有律簿上的法令都是一致的,也就是第x条法令的内容是一致的,当然可能有的律簿上还没有这条法令
律簿背面记录重要的笔记,不重要的笔记记在小纸条中,小纸条很有可能丢失。笔记代表机器在内存中的一些状态。
可能出现的问题:一拨人通过了一条法令,然后出去了。另一拨人回来了,对刚通过的法令一无所知,于是通过了另一条法令。
因此,必须有足够多的议员在会议室里。
神会协议
一开始要求所有牧师都出席,但是后来牧师都不愿一直待在会议室里,于是请数学家设计协议。
数学家首先证明了满足一定的约束下,可以保证一致性,并且可以进展下去(但是不保证进展性)。
于是得到了初级协议
对这个初级协议加上更严格的要求,保证进展性,得到了神会协议(synod protocol)
约束
神会协议从多轮带有编号的表决(ballot)中选择
一 轮表决是对一个单条法令的投票
Quorum:参与表决的牧师集合称为法定人数集(quorum),牧师只有投票/不投票两种选择。
Bvot:投赞成票的牧师集合
当且仅当法定人数集每个人赞成时,表决才算成功。Bqrm⊆Bvot,即法定人数集中每个人都投赞成票。
这里的quorum是提前选出来的,如果这个quorum中的每个人都投赞成票,则通过。
三个条件(β:表决集合)
B1(β):表决编号是唯一的
B2(β):β中任意两个表决的法定人数集至少有一个牧师是相同的。
B3(β):对β中任一表决B,如果B的法定人数集中有牧师在之前的表决投过赞成票,那么,表决B的法令的内容应与那些投票的表决中最近的那轮的法令一致。
MaxVote(b, p, β) = 集合{V ∈vote(β):(Vpst = p) ∧ (Vbal < b)} ∪{nullp}中的最大投票
b: 表决编号
p:牧师
β:表决集合
MaxVote(b, Q, β) = Max{ maxVote(b,p, β) | p∈Q}
可以证明,如果β中的B是成功的,那么β中最大编号的表决和B有相同的法令 一致性
(Bqrm <= Bvot) ∧ (B’bal > Bbal) => (B’bal = Bdec)
成功的 更大编号 一致
证明:ψ(B, β)定义为 {B’ β: (B’bal > Bbal) ∧ (B’dec != Bdec) }’
1.选择C,使Cbal = min {B’bal: B' ∈ ψ(B, β)}最小的那个
2.Cbal > Bbal,由ψ(B, β)的定义
3.Bvot ∩ Cqrm非空,因为Bqrm∩ Cqrm 非空 , Bqrm ⊆Bvot
4.Maxvote( Cbal, Cqrm, β)bal >= Bbal 因为交集不为空,交集部分投了B
5.Maxvote(Cbal, Cqrm, β)∈ votes(β)
6. Cdec = Maxvote(Cbal,Cqrm, β)dec, 由性质B3,Cdec是最小
7.Maxvote(Cbal,Cqrm, β)dec != Bdec
因为Bdec !=Cdec = Maxvote(Cbal,Cqrm, β)dec,ψ(B, β)定义及6
8.Maxvote(Cbal,Cqrm, β)bal > Bbal
由4 >=, 且7
9.Maxvote(Cbal, Cqrm, β) ∈ votes(ψ(B, β))
由7,8及ψ(B, β)的定义
10.Maxvote(Cbal, Cqrm, β)bal < Cbal 由定义
11.矛盾, 10:<Cbal, 1:Cbal最小,9:>=Cbal
=>任意两轮成功的表决,都是针对相同法令的表决。
定理2:b>Bbal, Q ∩qrm ,对于所有β中的B,若B1(β), B2(β), B3(β)成立,存在B’,B’bal=b,B’qrm=B’vot=Q,使得B1(β∪{B’}), B2(β∪{B’}), B3(β∪{B’})成立
初级协议(The Preliminary Protocol)
使B1成立:表决编号可以这样实现-> (13, a) <(13, b) < (15, a)
使B2成立: 选择法定人数集
使B3成立:p在发起表决前,需要找出Maxvote(b,Q,β)dec,也就是对于Q中的每一个q找出Maxvote(b,p,β)。
于是有了以下前两个步骤
(1) 牧师p选择一个新的表决编号b,并向某些牧师发送NextBallot(b)。
(2) Q回复Lastvote(b,v),其中v是Maxvote(b,q,β),因为β会改变,要保证p选择Maxvote(b,Q,β)之后Maxvote(b,Q,β)不变,q不再向vbal ~ b之间的表决投票
(3) 收到多数派Q每一个牧师的Lastvote(b,v)回复后,选择满足B3(β)的法令d,并向Q中每一个牧师发送BeginBallot(b,d)这一步不要重复
(4) Q投票,若投票则发送voted(b,q).如果在其它表决中发送了Lastvote(b’,v’),而投这一票会违背这个消息隐含的承诺,则不会投这一票‘
剩下的就是确定这轮表决的结果和宣布新法令的产生
(5) P收到Q中每一个牧师q的vote(b,q),则在律簿中写下法令d,并向每一个牧师发送success(d)
(6) 收到success(d)之后,将法令d记录在律簿上
每一步满足B1(β), B2(β), B3(β)
只有在一个法令是某个成功的法令时,才在律簿上记录下它。
基本协议(The basic protocol)
LastTried[p]:由p试图发起的最后一个表决的编号
Prevote[p]:编号最大的投票
NextBal[p]:p发出的所有Lastvote(b,v)消息中,表决编号b的最大值。
Lastvote(b,v)更强的承诺:不再对任何编号小于b的表决投票
协议变为
(1) p选择比LastTried[p]大的编号b,设置LastTried[p]为b,然后发送NextBallot(b)
(2) 收到大于nextBal[q]的NextBallot(b)消息后,牧师将nextBal[q]设置为b,然后发送一个Lastvote(b,v)消息给p,其中v等于prevote[q]
下面开始表决
(3) P发送BeginBallot(b,d)消息给Q中的每一个牧师
(4) 投票,设置prevote[q]为这一票,然后发送voted(b,q)
(5) P收到Q中每一个q的vote(b,q)之后,记录d到律簿上,发送success(d)给每个牧师
(6) 收到success(d),写d
完整的神会协议
基本协议 + 牧师及时处理步骤2-6 + 选择一个总统(可通过发送名字)发起表决
关键:什么时候发起一轮表决
P期望在22分钟之内执行步骤3,在另一个22分钟之内执行步骤5。如果没有,那么或者有人走开,或者另一个牧师发起了更大编号的表决。
=>p必须学习其它牧师使用的任何编号比LastTried[p]大的表决
一个总统的情况下,前2步执行完后,总统不需要再执行这2步,直接从第3步开始执行就可以。
实际的paxos议会协议
(1) NextBall(b) -> NextBall(b,n), n为总统律簿上的法令,q收到之后,将大于n的回复给p。
提议propos:在步骤3选择一个法令
通过passed:第一次写入到律簿
总统在提议任何新的法令之前,必须向一个多数集合中的每个议员学习已经投过票的法令。
任何已经通过的法令一定被至少一个多数集合中的议员投过票。
可以合并BeginBallot与上一轮Success
与计算机的关系
议会 –> 分布式数据库
议员 –> 服务器
公民 -> 客户端程序
当前法令 -> 数据库状态
The part-time parliament:
英文:http://research.microsoft.com/en-us/um/people/lamport/pubs/lamport-paxos.pdf
中文: http://rdc.taobao.com/team/jm/files/2010/12/1998The-Part-Time-Parliament_cn.pdf 中文是淘宝翻译的,但是有2处错误。