Paxos算法学习总结1

一、PAXOS 算法解决的问题

1、PAXOS 算法解决的问题是一个分布式系统如何就某个值(决议)达成一致。一个典型的场景是,在一个分布式数据库系统中,如果各节点的初始状态一致,每个节点都执行相同的操作序列,那么他们最后能得到一个一致的状态。为保证每个节点执行相同的命令序列,需要在每一条指令上执行一个「一致性算法」以保证每个节点看到的指令一致。一个通用的一致性算法可以应用在许多场景中,是分布式计算中的重要问题。因此从20世纪80年代起对于一致性算法的研究就没有停止过。节点通信存在两种模型(Messages passing)共享内存(Shared memory)和消息传递(Messages passing)。Paxos 算法就是一种基于消息传递模型的一致性算法。

二、几个名称的说明

Proposal(议案),由proposer提出,被aceeptor批准或否决
Value译(决议),它是议案的内容,一个议案就是一个{编号,决议}对
Accept(批准),表示议案被acceptor批准
Choose(选择),表示议案“被选择”,也就是被多数acceptor批准

下面的文章中,”议案、决议、批准、选择“这4个词的含义就是按上面的解释定义的。

三、PAXOS 算法基本定义

3.1、算法中的参与者主要分为三个角色,同时每个参与者又可兼领多个角色:

1、proposer:提出提案(提案包括案编号和决议

2、acceptor :接受(accept)提案;

3、learner: 学习被批准的提案;


3.2、算法一致性的基本语义:

1、决议只有被提出后才可能被选择

2、一次Paxos算法的执行实例中,只选择一个value;PS:一次Paxos算法的实例是什么呢,这个一直困扰我

3、learners只能获得被选择的value;

算法的提出者根据上面的基本语义,推出了下面的结论

        P1. Acceptor必须批准它接收到的第一个决议。

        P2. 如果一个议案{n, v}被选择,那么所有被选择的议案(编号更高)包含的决议都是v 

        P2A. 如果一个议案{n, v}被选择,那么任何acceptor批准的议案(编号更高)包含的决议都是v (P2的进一步强化)

        P2B. 如果一个议案{n, v}被选择,那么此后,任何proposer提出的议案(编号更高)包含的决议都是v (P2A的进一步强化)

        P2C. 对于任意的vn,如果议案{n, v}被提出,那么存在一个由acceptor的多数派组成的集合S,要么S中没有acceptor批准过编号小于n的议案,要么S的任何acceptor批准的所有议案(编号小于n)中,v是编号最大的议案的决议。(P2B的进一步表达)

        P1A. acceptor可以批准一个编号为n的议案,当且仅当它没有回应过一个编号大于nprepare请求。(P1的进一步强化)


四、PAXOS 算法的提出(算法分为2个阶段:prepare阶段、accept阶段)

prepare阶段

a) Proposer:选择一个议案编号n,向acceptor的多数派发送编号为nprepare请求。
b) Acceptor:如果接收到的prepare请求的编号n,大于它已经回应的任何prepare请求编号,那么它就回应已经批准的编号最高的议案(如果有的话),并承诺不再回应任何编号小于n的议案;(PS:我认为这里已经批准的编号最高的议案是在特定的时间内产生的,至于是怎么产生的,我会在下面的举例中说明的,当不在这个特定的时间内,Acceptor就回应没有问题

accept阶段

a) Proposer:如果收到了多数acceptorprepare请求(编号为n)的回应,它就向这些acceptor发送议案{n, v}accept请求,其中v是所有回应中编号最高的议案的决议(Acceptor回应里议案中的决议),或者是proposer选择的值(如果回应说还没有议案)。
b) Acceptor:如果收到了议案{n, v}accept请求,它就批准该议案,除非它已经回应了一个编号大于n的议案。


五、PAXOS 算法示例

A1、A2A3A4A5五个议员,当前已经被选择的议案的最大编号都是n0,

有4个编号n0、n1、n5、n11,并且n0<n1<n5<n11


第一种假设(单个proposer提出议案)

    至始至终只有A1 提出议案P1{n1v1},那么很顺利,议案P1{n1v1}被选择了,A1A2A3A4A5的最新议案编号都是n1,这时A1A2A3A4A5被批准的议案为空(没有)

    A1的议案被学习之后,A5再发起议案P5,很顺利,议案P5{n5v5}选择了,A1A2A3A4A5的最新议案编号都是n5A1A2A3A4A5被批准的议案为空(没有)

第二种假设(多个proposer提出议案)

    A1提出议案P1{n1v1}A5提出议案P5{n5v5}    n1<n5  

    假设A1先提出P1,发送prepare请求给A2A3发给A2A3已经是多数派了),A2A3发现当前被prepare响应过的编号n0小于n1,并且当前没有被批准过的议案,所以A2A3就回复A1没有问题

    A1接收到A2A3的回复,就发送accept请求(请求为议案P1{n1,v1})A2A3

    1假设:A2A3批准了议案P1后,并且议案还没有被选择在多数派批准后到议案确认被选择这段时间内),这时A5发送编号为n5的prepare的请求给A4,A3(A5至少需要发送一个prepare请求给A2或者A3以形成多数派,这里选择A3)

    A4表现: 发现当前被prepare响应过的编号n0<n5,并且当前没有被批准过的议案,所以就回复A5没有问题

    A3表现:  发现当前被prepare响应过的编号n1<n5,并且当前有被批准过的议案,所以就回复议案P1{n1,v1}A5

 A5表现: 收到A4A3的请求,发现A3已经有回复过的议案了,A5的accpect请求就不会再发送议案P5,而是发送P1{n1v1}A3A4,最后P1被学习了,P5被抛弃了。如果要使A5被学习,只能再发启另一次prepare请求了。

 总结:这个例子中,我们看到A3回应了已经批准的编号最高的议案给A5,上面我说的特定的时间就是指:在多数派批准后到议案确认被选择这段时间我认为当议案P1被选择后,A3就不会在发送P1给A5了。即在上面的例子中,1假设改为A2A3批准了议案P1后,并且议案已经被选择了,那么这时A5在发送编号为n5的prepare的请求给A4,A3时,A3就不会回复P1给A5了,P5最后也就会被学习。

 

    2假设:A2A3批准议案P1之前,然后A5发送了prepare的请求给A4,A3

    A4表现:发现当前被prepare响应过的编号n0<n5,并且当前没有被批准过的议案,所以就回复A5没有问题

     A3表现:发现当前被prepare响应过的编号n1<n5,并且当前还没有有被批准过的议案,所以就回复A5没有问题

    之后,A1发送accept请求(请求为议案P1{n1,v1})给A2A3,结果A2批准了,A3会拒绝(因为A3响应过的最大编号已经是n5n5>n1,满足P1A条件,就被拒绝了),最后A1的议案没有被批准,A1可能会重新发送prepare请求(编号为n11,大于n5)。

    总结:这个例子,我们可以发现,paxos算法可能会导致算法循环,比如很容易构造这样一个场景,两个proposer轮流提出一系列编号递增的议案,但是都没有被选择。Propoer p选择议案的编号为n1,并结束阶段1。接着,另外一个proposer q选择了议案编号n2>n1,并结束阶段1。于是p在阶段2的accept请求将被忽略,因为acceptor已经承诺不再批准编号小于n2的议案。于是p再回到阶段1并选择了编号n3 > n2,这又导致q第二阶段的accept请求被忽略……,所以提出了leader的概念


关于一次Paxos算法的执行实例我认为以下找到的解析还是解释的很好的

    某些资料会把“实例”称为“轮”(round),每轮选择一个决议,但每轮可能会执行多次一致性算法,比如如果主proposer在阶段1提出的prepare请求被否决了,那么它将会选择新的议案编号,重新提出议案请求,直到议案被多数acceptor批准(消息发送失败也会导致重传请求)。引入轮(就是实例啦)这一概念后,可以做到各轮并行运行,同时批准多个决议,互不干涉,更有效率。



六、参考文档如下:

http://blog.csdn.net/xhh198781/article/details/10949697

http://my.oschina.net/cmffire/blog/11329

http://blog.csdn.net/sparkliang/article/details/5740882

http://blog.csdn.net/m_vptr/article/details/8014220



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风中情

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值