Paxos算法是基于消息传递且具备高度容错特性的一致性算法,是目前公认的解决分布式一致性问题最有效的算法之一,其解决的问题就是在分布式系统中如何就某个值(决议)达成一致。算法
在常见的分布式系统中,总会发生诸如机器宕机或网络异常(包括消息的延迟、丢失、重复、乱序,还有网络分区)(也就是会发生异常的分布式系统)等状况。Paxos算法须要解决的问题就是如何在一个可能发生上述异常的分布式系统中,快速且正确地在集群内部对某个数据的值达成一致。也能够理解成分布式系统中达成状态的一致性。网络
Paxos算法运行在容许宕机故障的异步系统中,不要求可靠的消息传递,可容忍消息丢失、延迟、乱序以及重复。它利用大多数 (Majority) 机制保证了2F+1的容错能力,即2F+1个节点的系统最多容许F个节点同时出现故障。异步
一个或多个提议进程 (Proposer) 能够发起提案 (Proposal),Paxos算法使全部提案中的某一个提案,在全部进程中达成一致。系统中的多数派同时承认该提案,即达成了一致。最多只针对一个肯定的提案达成一致。分布式
Paxos将系统中的角色分为提议者 (Proposer),决策者 (Acceptor),和最终决策学习者 (Learner):学习
在多副本状态机中,每一个副本同时具备Proposer、Acceptor、Learner三种角色。spa
阶段一(prepare阶段):
(a) Proposer选择一个提案编号N,而后向半数以上的Acceptor发送编号为N的Prepare请求。Pareper(N).net
(b) 若是一个Acceptor收到一个编号为N的Prepare请求,若是小于它已经响应过的请求,则拒绝,不回应或回复error。若N大于该Acceptor已经响应过的全部Prepare请求的编号(maxN),那么它就会将它已经接受过(已经通过第二阶段accept的提案)的编号最大的提案(若是有的话,若是尚未的accept提案的话返回{pok,null,null})做为响应反馈给Proposer,同时该Acceptor承诺再也不接受任何编号小于N的提案。blog
阶段二(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请求)。it
参考:https://blog.csdn.net/u013679744/article/details/79222103
https://zhuanlan.zhihu.com/p/31780743