Paxos--分布式一致性算法

来源:互联网 发布:网络用语cm是什么意思 编辑:程序博客网 时间:2024/05/18 03:40

相关概念

instance(实例):一次Paxos算法执行。
proposal(议案):未经批准的决议称为议案。
value(决议):被最终批准通过的议案中的value,也就是proposal提案对应的值
Proposer(提案者):提出议案
Acceptor(批准者):审批议案
Leaner(学习者):学习决议
minProposal(最小提案值):在一个Paxos Instance内,当前接收的最小提议值,会不断更新


Paxos选举的流程

Paxos Instance主要包括两个阶段:准备阶段(prepare phase)和提议阶段(accept phase)。如下图所示:

这里写图片描述

1. 准备阶段 prepare

1.获取一个Proposal ID,也就是n,为了保证Proposal ID递增,可以采用时间戳+server ID方式生成;
2.提议者向所有节点(提议者)广播prepare(n)请求;
3.接收者比较n和minProposal,如果n>minProposal,表示有更新的提议,更新最小提案值minProposal=n;否则将(acceptedProposal,acceptedValue)返回,即将acceptor内部保存的最小提案值返回到接受者,便于接受者根据提案值重新获取一个大于该提案值的Proposal ID;

if n > minProposal    then minProposal = n;// 有更新的提议;更新最小提案值else    return (acceptedProposal, acceptedValue);//将acceptor内部保存的最小提案值返回到提议者,便于提议者根据最小提案值重新获取一个大于该提案值的Proposal ID

4.提议者接收到过半数请求(多数派、法定集合)后,如果发现有acceptedValue返回,表示有比当前proposal更新的提议,保存acceptedValue到本地,然后跳转到步骤1,生成一个ID值更高的提议;

提议阶段 accpetor

5.到这里表示在当前paxos instance内,没有优先级更高的提议,可以进入第二阶段,广播accept(n,value)到所有节点;
6.接收者比较n和minProposal,如果n>=minProposal,则acceptedProposal=minProposal=n,acceptedValue=value,本地持久化后,返回;
否则,返回minProposal,表示在接受者里有比n更新的提议,需要重新进行提交提议;
7.提议者接收到过半数请求后,如果发现有返回值>n,表示有比n更新的提议,跳转到步骤1;否则value达成一致。
从上述流程可知,并发情况下,可能会出现第4步或者第7步频繁重试的情况,导致性能低下,更严重者可能导致永远都无法达成一致的情况,就是所谓的“活锁”,如下图所示:

这里写图片描述

1.S1作为提议者,发起prepare(3.1),并在S1,S2和S3达成多数派;
2.随后S5作为提议者 ,发起了prepare(3.5),并在S3,S4和S5达成多数派;
3.S1发起accept(3.1,value1),由于S3上提议 3.5>3.1,导致accept请求无法达成多数派,S1尝试重新生成提议
4.S1发起prepare(4.1),并在S1,S2和S3达成多数派
5.S5发起accpet(3.5,value5),由于S3上提议4.1>3.5,导致accept请求无法达成多数派,S5尝试重新生成提议
6.S5发起prepare(5.5),并在S3,S4和S5达成多数派,导致后续的S1发起的accept(4.1,value1)失败

……


prepare阶段有两个目的:

1)检查是否有被批准的值,如果有,就改用批准的值;
2)如果之前的提议还没有被批准,则阻塞掉他们,从而不让它们与其自身发生竞争(由提议ID的大小决定)。


Paxos协议对于如何决定变量v的值的流程。
提议者:
询问:询问法定集合的进程自身v的值;
预提议:发送包含自身proposer-id的预提案给法定集合接受者;
提议:发送的预提案得到一个法定集合接受者的回复后,如果询问的结果是法定集合的接受者均未给v赋予值,那么提议者拥有自由赋值的权利,不然提议者从中选择一个值赋予给v。假定自由赋予或者选择的值为c,发送包含c和proposer-id的提案给接受者。

接受者:
处理询问:回复自身v的值 处理预议案:如果收到的预提案ppq.proposer-id>自身a-proposer-id,那么更新自身a-proposer-id=ppq.proposer-id,接受这个预提案,否则拒绝这个预提案。
处理提议:如果收到的提案的pq.proposer-id>=自身a-proposer-id,那么更新a-proposer-id=pq.proposer-id,接受这个提案,记录v的值为提案中的值,即v=pq.c。

 >无论是提案还是预提案,接受者只接受proposer-id比它自身的a-proposer-id更大的消息。
原创粉丝点击