Paxos是所有分布式环境中关于某个值达成一致的协议,Paxos 一个节点同时包括提议者和接受者。顾名思义:提议者是发起投票;接受者接受投票请求,根据投票请求和自身状态进行响应的回复。为了防止异常丢状态,Paxos在内部持久化三个参数:当前已接受的提案号;当前达成共识的value的值;当前最小的提案号。按照两阶段模式进行操作:

阶段一:Prepare(n) 请求 阻塞新来的老的提案
为什么可以这样?因为 分布式日志进来的时候,Acceptor 会把日志里带的请求里的提案号n和自己的最小提案号进行比较。如果前者大,会更新自己的最小的提案号,向提案者响应同意请求。
这样就保证了提案号小的IO请求永远不会得到Acceptor的响应,由于Propasl 的提案号都是递增的,保证了前者服从后者的原则。

提案者接受到了上面的请求之后,如果同意的数量达成了多数,接着广播Accept(n,val) 到所有Acceptor.

阶段二:Accept(n,val)
Acceptor 在这个阶段,会把自己的最小提案号和请求中的提案号n 比较一次。原则同上面阶段一,同意之后:除了更新自己的最小提案号为n之外,还用n 更新自己的已接受提案号,向提议者返回自己当前的最小的提案号。如果不同意,也向提议者返回自己当前的最小的提案号,拒绝请求。

如果提案者收到任何关于Accept(n,val)的拒绝响应,就需要重新发起投票(可能会更新自己的提案号)。 否则,表示val 广播到分布式系统中去,并且被大家接受。