Paxos

算法陈述

  • 阶段一
    1.Proposer选择一个提案编号Mn,然后向Acceptor的某个超过半熟的子集成员发送编号Mn的Prepare请求。
    2.如果一个Acceptor收到一个编号为Mn的Prepare请求,且编号Mn大于该Acceptor已经响应的所有Prepare请求的编号,那么它就会将它已经批准过的最大编号的提案作为响应反馈给Proposer,同时该Acceptor会承诺不会再批准任何编号小于Mn的提案。

举例来说,假定一个Acceptor已经响应过所有的Prepare请求对应的提案编号分别为1、2、...、5和7,那么该Acceptor在接收到一个编号为8的Prepare请求后,就会将编号为7的提案作为响应反馈给Proposer。

  • 阶段二
    1.如果Proposer收到来自半数以上的Acceptor对于其发出的编号为Mn的Prepare请求的响应,那么它就发送一个针对[Mn,Nn]提案的Accept请求给Acceptor。注意,Vn的值就是收到的响应中编号最大的提案的值,如果响应中不包含任何提案,那么它就是任意值。
    2.如果Acceptor收到这个针对[Mn,Vn]提案的Accept的请求,只要该Acceptor尚未对编号大于Mn的Prepare请求作出响应,他就可以通过这个提案。

算法角色及其作用

  • Proposer 生成提案
  • Acceptor 批准提案
  • Learner 获取提案

请求类型

  • Prepare 请求

Proposer向Acceptor发送的请求(可参见阶段一 1)

  • Promise 请求

Acceptor向Proposer发送的请求(可参见阶段一 2)

  • Propose 请求【带有提案的值】

Proposer向Acceptor发送的请求(可参见阶段二 1)

  • Accept 请求 【带有提案的值】

Acceptor向Proposer发送的请求(可参见阶段二 2)

参考资料

  • 《Implementing fault-tolerant services using the state machine approach: a tutorial》
  • 《从Paxos到Zookeeper分布式一致性原理与实践》
  • 《学习笔记:The Log(我所读过的最好的一篇分布式技术文章)》
  • 《paxos算法之粗浅理解》

你可能感兴趣的:(Paxos)