您的位置:首页 > 其它

分布式一致性算法--Basic Paxos

2017-02-11 10:23 204 查看
Proposer:提议发起者

Acceptor:提议批准者

讨论分布式系统中多个Proposer,多个Acceptor 如何对一个值 v 达成一致的过程。

分布式一致性

1、v 达成一致的值是某个 Proposer 提出的。

2、一旦 v 就某个值达成一致,那么 v 就不能对另一个值达成一致,这个要求称为安全性。(达成一致值过半的Acceptor接受了该值)

3、一致总是能够被达成,即 v 总是会被决定为某个值。(不考虑概率条件下,理论上的无法达成一致)

每次协议达成都有过半的进程参与,保证了任何两次协议达成的Acceptor 之间都有交集。要求任一时刻集群都有过半的进程是正常状态,当一个进程从非正常状态进入正常状态,其需要补全之前达成的一些协议信息。

Paxos 进程之间是平等的。

消息是进程间通信的唯一手段。

消息内容不会被篡改。

proposal_id:每个提议都有一个编号,编号越高优先级越高

a_proposal_id:acceptor 接收到的最大的 proposal_id

Basic-Paxos 算法

阶段一:预提案阶段

1、Proposer 生成一个proposal_id,采用时间戳 + 节点编号方式生成,保证唯一性和递增性。向 Acceptor 广播,携带该 proposal_id。

2、Acceptor 收到提案后,更新 a_proposal_id = max(proposal_id, a_proposal_id),如果 proposal_id > a_proposal_id,通过该提案,Acceptor回复记录的接受过的 proposal_id 最大的提案,附带该提案的值,如果该提案的值还没有被置上,返回NULL。如果 proposal_id< a_proposal_id,拒绝该提案。

阶段二:提案阶段

1、Proposer:等待(应设置超时)直到收到大多数接受者对提案的回复,如果提案通过,从所有回复的消息中选取最大的已经被通过的最大 proposal_id 的提案,以该提案的值替代自己的值。如果为空,则可以设置任意值。然后把该提案广播给Acceptor,提案与预提案使用同一个 proposal_id。如果提案被拒绝,重新执行阶段一。

2、Acceptor:如果收到的提案 proposal_id >= a_proposal_id,接受这个提案,更新 a_proposal_id = max(proposal_id, a_proposal_id,更新记录的提案。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  分布式 一致性 Paxos