Paxos算法《The Part-Time Parliament》译文

Leslie Lamport大神在《Paxos make simple》一文中说到:

The Paxos algorithm, when presented in plain English, is very simple.

确实,Paxos算法简单来看,就是几轮消息交流的事。但是,真正理解Paxos算法的设计思路以及设计选择,却并非易事。

本文结合个人理解,对《The Part-Time Parliament》一文进行翻译,以帮助大家更好地理解Paxos。(纯原创,手码。转载请注明出处)

 


                                               兼职议会

1. 问题

1.1. Paxos小岛

19世纪初,位于爱琴海的Paxos小岛是一个繁荣的商业中心。繁荣的商业导致政治复杂化,岛上的居民用议会形式的政府取代了之前采用的民主。但是谋生要比公民责任重要,岛上没有人愿意终生献身于议会。在议员时不时地离开议会厅的情况下,如何保证Paxos岛上的议会发挥作用?

兼职议会处理的问题与今天容错分布式系统中的问题明显相关,议员对应于进程,离开议会厅对应于故障。计算机学家或许对Paxos岛上的解决方案有兴趣。本文将展示Paxos议会协议的简短历史,同时也包括它和分布式系统相关性的一个简短的讨论。

Paxos文明由于异邦入侵被毁灭,考古学家最近才开始研究它的历史。因此,关于Paxos议会的了解是不完整的。尽管知道基本的Paxos协议,对于许多细节我们并不知道。这些细节令人感兴趣,本文将自由地推测Paxos居民可能做了什么。

1.2. 需求

议会主要的任务是决定本地的法律,法律由议会通过的一系列法令组成。现代议会会雇佣秘书来记录行为,但在Paxos,没有人愿意在整个议会期间留在议会厅当秘书。但在Paxos议会中,每个议员有一个“分类账”,议员会在分类账中按顺序记下通过的法令。例如,议员Λ˘ινχ如果了解到议会通过的第155条法令是将橄榄税设置为每吨3德拉马克(古希腊货币单位),则她会在分类账中记录下:

155:橄榄税是每吨3德拉克马

分类账用永不褪色的墨水书写,并且分类账中的内容不会改变。

Paxos议会协议的第一个需求就是分类账需要保证一致性,即:没有两个分类账包含了矛盾的信息。如果ΦισΦρ在分类账中有以下条目:

132:灯只能使用橄榄油

那么,所有议员的分类账不可以包括一个不一样的132法令条目。然而,如果存在议员不知道132法令的话,那么他的分类账中可以没有132法令条目。

分类账的一致性可以通过保持所有分类账空白来简单地实现,所以只实现分类账的一致性是不够的,还需保证最终能通过法令并且法令被纪录在分类账上。在现代议会中,议员的分歧会阻碍法令的通过。在Paxos小岛,并不会这样,这里的人相互信任。Paxos议员乐于通过任何被提出法令。然而,他们时不时地离开和加入议会厅产生了一个问题。如果一组议员通过了以下法令:

37:禁止在寺庙墙壁上画画

然后,这组议员由于要参加宴会离开了议会厅,这时另一组议员进入了议会厅,并不知道刚刚通过的法令,并且通过了冲突的法令:

37:艺术表达自由得到保障

这样,分类账的一致性就会丢失。

除非足够多的议员待在议会厅足够长的时间,否则,进展(有法令通过)不能被保证。因为Paxos岛上的议员不愿意缩短他们外出活动的时间,所以确保任何法令被通过是不可能的。然而,议员乐于保证,在议会厅的时候,他们以及他们的助手会及时处理所有的议会问题。这个保证使得Paxos居民可以设计一个满足下列进展条件的议会协议:

如果大多数的议员待在议会厅,并且没有人进入或者离开议会厅长达足够长的时间,那么,议会厅里的议员提出的任何法令都会被通过,并且每个通过的法令都会被记录在议会厅里每个议员的分类账中。

1.3 假设

只有给议员提供必要的资源,议会协议的需求才能被实现。每个议员会拥有一个记录法令的分类账,一支钢笔,以及永不褪色的墨水。如果议员离开议会厅,可能会忘记他们在议会里做了什么,所以他们会在分类账后面记下笔记来提醒自己重要的议会任务。分类账中的法令永远不会改变,但是笔记可以被划掉。实现进展条件需要议员可以知道时间的流逝,所以他们会收到一个简单的滴漏计时器。

议员时刻携带他们的分类账,总是能查分类账上的法令以及没有被划掉的笔记。分类账用最好的羊皮纸制作,只用来记下最重要的笔记。议员会在一张纸上写下其他的笔记,当他离开议会厅时,这些纸可能被丢失。

议会厅里的音响很差,不可能在里面发表演说,所以议员之间的交流只能通过信使,并且议会有足够多的经费雇佣所需的信使。信使不会混淆消息,但是可能会忘记他已经传送了一条消息,会再次传送该条消息。就像他们所服务的议员一样,信使也只能花费部分的时间在议会中。在传送一条消息之前,信使可能会离开议会厅去做生意,或许去度6个月的假。或许信使会永久离开,信息将永远不能被送达。

尽管议员和信使能随时进入或者离开议会厅,但当他们在议会厅时,他们会全神贯注在议会事情上。当信使在议会厅的时候,他们会及时传送消息。当议员在议会厅时,他们会对收到的消息立即响应。

Paxos官方记录表明,议员和信使都是诚实的并严格服从议会协议。大多数的学者认为这只是一个宣传,为了让Paxos在道德上比邻国优越。不诚实的行为,尽管很少,但也存在。然而,因为在官方的文件中没有提及不诚实的行为,我们并不知道议会如何处理不诚实的议员或者信使。在3.3.5中,我们会讨论发现的证据。

2. 单法令议会

Paxos议会从早期的每19年举行一次的牧师祭祀会发展而来,牧师祭祀会会产生单个标志性的法令。数百年来,会议需要所有牧师都在场以选择法令。但随着商业繁荣,在会议举行期间,牧师开始时不时地离开去做生意。最后,牧师祭祀会失败了,会议结束,没有产生选中的法令。为了防止这次灾难的重复,Paxos的宗教领导者要求数学家重新制定一个协议来选择一个法令。协议的需求和假设在本质上和第3节多法令议会协议是一样的,除了只产生单个法令,而不是一系列法令,也就是:一个分类账最多只有一个法令。这部分描述单法令议会协议,多法令议会协议将在第三节描述。

数学家从几个步骤开始,派生出单法令议会协议。首先,他们证实了一个结论,结论表明:满足特定约束的协议将会保证一致性以及进展需求。一个初步的协议直接从这些约束中产生。在初步协议上加一些限制,随后产生了基本协议,基本协议只保证一致性,不满足进展需求。完整的会议协议满足一致性以及进展需求,通过在基本协议的基础上产生。

2.1部分描述了数学结论,2.2-2.4部分通俗地描述了协议。基本协议的正式描述和正确性证明在附录中描述。

2.1 数学结论

通过一系列含有编号的投票,议会最终可以选中一个法令。一次投票是针对单个法令的全体投票。在每次投票中,牧师只有投票和不投票的选择。和一次投票相关的是一个牧师群体(集合),称为法定人数。当且仅当法定人数中的每个牧师都为法令投票,才可以说一次投票是成功的。正式点说,一次投票B包括下列四个部分(除非另有说明,牧师集合是指有限集):

B(dec):一个法令(被投票的对象);

B(qrm):一个非空的牧师集合(投票的法定人数);

B(vot):投票牧师的集合(为法令投票的牧师集合);

B(bal):投票编号。

当且仅当B(qrm)\subseteqB(vot),才能说一次投票B是成功的,所以一次成功的投票就是每个法定人数都投票了。

投票的编号从一组无界有序的数集中选择。如果B1(bal)>B(bal),那么投票B1晚于投票B。然而,这并不表示投票被执行的顺序,较晚的投票可能在较早投票之前进行。

Paxos的数学家在投票集合b上定义了三种条件,并且表明如果进行的投票集合满足这些条件,一致性将会得到保证,进展也会有可能。前两个条件很简单,他们可以被描述如下:

B1(b):b中的每次投票都有一个独一无二的投票编号

B2(b):b中的任意两次投票的法定人数的交集不为空,即:任意两次投票的法定人数至少有一个共同的牧师。

第三个条件要复杂一些,一个手稿纪录了关于第三个条件的陈述,这是个令人困惑的陈述:

B3(b):对于b中的每次投票B,如果B法定人数中的牧师在集合b早期的投票中进行了投票,那么,B的法令等于这些早期投票中最晚投票的法令。

条件B3(b)的解释在手稿中以图1的形式给出,图1中的会议包含了5个牧师A, B, Γ, ∆, E,投票集合b包括5次投票。集合b包含的5次投票中,每次投票的投票者集合都是法定人数的子集,法定人数中牧师的名字被放在封闭的箱子里。例如,投票编号14的法令为a,法定人数包括3个牧师,其中两个牧师进行了投票。条件B3(b)的形式是“对于b中的每次投票B,如果……”,“如果.…..”是投票B的条件。图1中5次投票的条件如下:

B3示意图

图1  集合b包括5次投票,满足条件B1(b)-B3(b)

5:编号为5的投票中四个法定人数没有牧师在之前的投票中进行过投票,所以投票5的条件为真。

14:编号为14的投票中,法定人数中只有∆在编号为2的投票中进行了投票。所以B3(b)要求编号为14的投票的法令一定要等于编号为2的投票法令。

27:(这是一次成功的投票)编号为27的投票的法定人数含有A, Γ和∆。牧师A在早期的投票中没有进行投票,牧师Γ只在编号为5的投票中进行了投票,牧师∆只在编号为2的投票中进行了投票。这两次投票中比较晚的一次是编号为5的投票,因此条件B3(b)要求编号为27的投票的法令一定要等于编号为5的投票的法令。

29:编号为29的投票的法定人数的成员有B, Γ和∆。牧师B只在编号为14的投票中进行了投票,牧师Γ在编号为5和编号为27的投票中进行了投票,牧师∆在编号为2和编号为27的投票中进行了投票。这些投票中较晚的一次投票是编号为27的投票,因此B3(b)要求编号为29的投票的法令一定要等于编号为27的投票的法令。

较为正式地描述条件B1(b)-B3(b)需要更多的数学符号。选票v包含三个部分:一个牧师v(pst),一个投票编号v(bal)以及一个法令v(dec)。它表示牧师v(pst)在投票编号为v(bal)的投票中为法令v(dec)进行了投票。Paxos居民也定义了null选票,null选票的v(bal)=负无穷,v(dec)=BLANK,其中BLANK不是法令,对于任何投票编号b,满足负无穷<b<正无穷。对于任何牧师p,定义null(p)是v(pst)=p的null选票。

Paxos的数学家在所有的选票集合上定义了全局顺序,但是定义部分的手稿有部分丢失了。残留的碎片显示,对于选票v以及v’,如果v(bal)<v’(bal),那么v<v’。但并不清楚当v(bal)=v’(bal)时,v和v’的相对顺序如何定义。

对于任何投票集合b,选票集合Votes(b)表示所有的选票v,对于投票B

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值