Paxos算法可分为两二段:
阶段一:
1.Proposer选择一个提案号Mn,然后向Acceptor的某个超过半数的子集发送编号为Mn的Prepare请求。
2.如果一个Acceptor收到一个提案编号为Mn的Prepare请求,且Mn大于该Acceptor已响应过的所有编号,那么它会将它已经批准过的最大的编号提案相应给Proposer,同时承诺不会再批准任何编号小于Mn的提案。
阶段二:
1.如果Proposer收到来自半数以上的Acceptor对其发出的编号为Mn的Prepare请求的相应,那么它就会发送一个[Mn,Vn]提案的请求给Acceptor,Vn是一阶段中响应的最大编号的提案值,如果响应中不包含任何提案值,那么他就是任意值。
2.如果Acceptor收到[Mn,Vn]的提案请求,只要该Acceptor尚未对编号大于Mn的请求做出响应,他就可以通过这个提案。
提案的获取Acceptor将批准的提案发送给一个特定的Learner集合,该集合中的每个Learner都可以在一个提案被选定后通知所有其他的Learner。
通过选取主Proposer保证算法的活性:
如果两个Proposer交替向Acceptor发送Prepare请求,那么每次Acceptor都收到更大的Mn(Mn+1),就会在二阶段忽略上一个Proposer发送的[Mn,Vn]提案。这样交替忽略就是死循环,不会通过提案。
解决办法是选出一个主Proposer,只有主Proposer可以发出提案。