论文原文 https://www.jianshu.com/p/c7ae21809197
深入浅出理解版 https://my.oschina.net/u/150175/blog/2992187
腾讯开源实现 https://github.com/Tencent/phxpaxos/blob/master/README.zh_CN.md
源码解读 https://www.jianshu.com/p/9f1a874a39e5
注意:一个完整的提案由{编号n,提案值v}两部分组成。我们只关心最终的提案值,提案编号的唯一用途在于确定提案值。
- Proposer选择新的编号n,并发送到所有的Acceptor。
- Acceptor接收到请求后完成如下工作:
2.1 承诺(promise):承诺不再accept所有编号小于n的请求,即reject编号小于n的请求。
2.2 返回(reply):返回当前小于n的最大编号所对应的提议值v(如果存在)。 - 如果Proposer发起的提案编号被半数以上的Acceptor接受,此时它可以真正的发起提案值,否则回到步骤一重新确定提案编号。
- 发起的提案值不是Proposer随意确定的。确定规则如下:
4.1 如果步骤2.2中,一个或者多个Acceptor返回了已经被接受(accept)的提案值,新发起的提案值必须是最大编号返回的提案值。
4.2 如果步骤2.2中,没有任何Acceptor返回已被接受(accept)的提案值,由Proposer自行发起新的提案值。 - Proposer发起的提案值如果被接受则提案结束,否则重复上述过程,直到确定提案值。