分布式一致性协议——paxos算法
paxos算法到底干嘛用的?
目的:paxos算法是解决分布式系统中,如何对某个值(决议)达成一致的,用于解决达成共识性问题的方法。
Paxos算法需要解决的问题就是如何在一个可能发生上述异常的分布式系统中,快速且正确地在集群内部对某个数据的值达成一致。也可以理解成分布式系统中达成状态的一致性。
该算法的前提是不存在拜占庭将军问题:如下图所示
paxos算法角色划分:三种类型
提议者(Proposer):提议一个值;
接受者(Acceptor):对每个提议进行投票;
告知者(Learner):被告知投票的结果,不参与投票过程。
优势:为了避免单点问题:会有一个acceptor集合,proposer向该集合发送提案,acceptor集合中所有成员都有可能接受提案,并且只能批准一个提案,当有半数以上的成员同意,那么就同意批准该提案。
paxos算法过程
- 阶段一(prepare阶段):
(a) Proposer选择一个提案编号N,然后向半数以上的Acceptor发送编号为N的Prepare请求。Pareper(N)
(b) 如果一个Acceptor收到一个编号为N的Prepare请求,如果小于它已经响应过的请求,则拒绝,不回应或回复error。若N大于该Acceptor已经响应过的所有Prepare请求的编号(maxN),那么它就会将它已经接受过(已经经过第二阶段accept的提案)的编号最大的提案(如果有的话,如果还没有的accept提案的话返回{pok,null,null})作为响应反馈给Proposer,同时该Acceptor承诺不再接受任何编号小于N的提案
- 阶段二(accept阶段):
(a) 如果一个Proposer收到半数以上Acceptor对其发出的编号为N的Prepare请求的响应,那么它就会发送一个针对[N,V]提案的Accept请求给半数以上的Acceptor。注意:V就是收到的响应中编号最大的提案的value(某个acceptor响应的它已经通过的{acceptN,acceptV}),如果响应中不包含任何提案,那么V就由Proposer自己决定。
(b) 如果Acceptor收到一个针对编号为N的提案的Accept请求,只要该Acceptor没有对编号大于N的Prepare请求做出过响应,它就接受该提案。如果N小于Acceptor以及响应的prepare请求,则拒绝,不回应或回复error(当proposer没有收到过半的回应,那么他会重新进入第一阶段,递增提案号,重新提出prepare请求)。
paxos优缺点
优点:paxos算法的优点很明显,按照此方法可以对多个数据值达到一致,收敛较好。
缺点:paxos算法的缺点是会出现死循环:考虑到一种极端的情况下,有两个proposer依次提出了一系列编号递增的议案,但是最终paxos无法形成最终的议案。具体场景如下:
- 解决办法:
为了保持活性,避免上述的问题,就必须选择一个主Proposer,并规定只能由主Proposer才能提出议案,只有主能提出议案,那么就算主被抛弃了,下次也会提出更高议案,而其他非主不能再次提出更高的议案,这样就不会陷入死循环中,从而避免了上述的问题。
- 总结:
通过选择一个主Proposer,并规定只能由主Proposer才能提出议案,整个paxos算法就可以保持活性。
参考:
https://blog.csdn.net/u013679744/article/details/79222103
https://blog.csdn.net/u012414189/article/details/90084684