简述Paxos算法

简述Paxos算法_第1张图片

paxos算法是一种基于消息传递且具有高度容错性的一致性算法,解决的问题是一个分布式系统如何就某个值或者某个协议达成一致,该算法的前提是假设不存在拜占庭将军问题。

在该算法中一共有三种角色:proposer、acceptor和learner。proposer负责提出提案,acceptor负责对该提案做出裁决,learner负责学习得到的提案。为了避免单点故障,会有一个acceptor集合,proposer向该集合发送提案,acceptor集合中的每一个成员都有可能同意该提案并且每个acceptor只能批准一个提案,当有一半以上的成员同意后,则同意该提案。

它主要分为两个阶段:分别是prepare阶段和accept阶段。

首先是prepare阶段,先由proposer提出编号为Mn的提案,向acceptor集合发送prepare请求。Acceptor作出反馈:保证不会再接受编号比Mn小的提案,如果acceptor已经批准过某个提案,会向proposer返回已经批准的编号最大的提案的value值。

如果acceptor收到一个编号为Mn的请求且编号大于acceptor已经响应的所有prepare请求的编号,那么它会将自己已经批准过的编号最大的提案值反馈给proposer,同时acceptor承诺不会再接受编号比Mn小的提案。(这里有个优化,就是acceptor会忽略编号小于已批准的提案的请求。)

如果proposer收到了集合超过一半的响应,就会向acceptor发送一个针对Mn Vn的accept请求。Vn为收到的所有响应中编号最大的提案的值。如果响应不包括值(即第一次发送编号Mn),则可以由proposer选择任意值。

然后就是accept阶段,accept阶段是接受提案的要求。当acceptor收到accept请求后,只要未收到任何编号大于Mn的prepare请求,则通过该提案。

为什么要设置成过半提交?比如一个acceptor集合有两个子集合,每个子集合元素都超过acceptor集合的一半元素,那么两个子集合的交集必然存在公共成员。然后acceptor最多只能批准一个提案,那么就能保证只有一个提案被选定了。这种方式是最终一致性。

优化:为了避免死循环,比如两个proposer一次提出一系列编号递增的提案,这时可以产生一个主proposer,提案只能由主proposer负责提出。

Paxos算法引入了“过半”的理念,通俗地讲就是少数服从多数的原则。同时,Paxos算法支持分布式节点角色之间的轮换,这极大地避免了分布式单点的出现,因此Paxos算法既能解决无限期等待问题,也解决了“脑裂”问题,是目前来说最优秀的分布式一致性协议之一。

paxos算法的应用:chubby(分布式锁服务、GFS中master的选举)

你可能感兴趣的:(ZooKeeper,1024程序员节)