The part-time parliament笔记

另一篇更详细的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处错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值