共识算法【Paxos】

2020-03-15  本文已影响0人  江海小流

Preliminary

系统包括:

Proposer生成一项提议,发送给AcceptorAcceptor如果接受该提议,那么系统所有成员达成共识(即:该提议生效),通过Learner获取共识的内容。

可能存在的问题:

PS: 下文中的接收是指收到一个请求,接受是指 accept 一项提议。

算法流程:

第一阶段

  1. Proposer 生成一个系统下唯一的ID:n;
  2. Proposer 向大多数 Acceptor 发送prepare请求(附带 n),目的是需要得到 Acceptor 的如下承诺:
    • Acceptor 需要忽略掉 ID 小于n 的请求
  3. Acceptor 如果接收到上述请求,如果 Acceptor 接收过其他 Proposer 发送的prepare请求且对应的ID如果大于 n,那么忽略该请求(不给出承诺),否则回复上述请求。回复的内容包括:
    • Acceptor 接受过的 ID 小于 n且最接近 n 的 某一项提议(抽象为一个值 v
    • 如果没有,则返回空

第二阶段

  1. Proposer 如果接收到大多数 Acceptor 的回复,Proposer 向大多数 Acceptor 发起 accept请求。请求的内容包括:
    • 这些回复的提议中 ID 最大的那项提议的值,如果没有则自拟一项提议
    • prepare请求中发送的 n
  2. Acceptor 接收到 accept 请求时,假设对应的提议ID为n。如果该 Acceptor 做过不接受ID小于m的提议的承诺,那么就忽略掉该请求,否则则接受这项提议。

第三阶段Learner 收集所有 Acceptor 接受的提议,完成共识算法。

分析

  1. 一旦系统达成共识,那么该共识就不会改变,比如:

    • Proposer 1 发送一项提议给大多数的 AcceptorProposer 1获得大多数 Acceptor 的回复后,拟定一项提议Proposal 1发送给 Acceptor达成共识;
    • Proposer 2 如果要发送另外一项提议给大多数 Acceptor,这些 Acceptor 中的部分已经接受了 Proposal 1,根据上述算法,Proposer 2 只能提出提议 Proposal 1Acceptor
  2. 存在不同的 Acceptor 接受不同的 Proposal,比如:

    • Proposer 1 发送一项提议Proposal 1给大多数的 Acceptor ,在一部分 Acceptor未接受这项提议时,另外一个 Proposer 2 发起了另一项提议Proposal 2 给这些 Acceptor
    • 因为 Proposal 2 的ID要比 Proposal 1 的ID要大,因此这部分既收到了 Proposer 1 发送的 prepare 请求又收到了Proposer 2发送的prepare请求的 Acceptor 肯定只会接受 Proposal 2
    • 这种情况只有在 Proposer 2 发送 prepare请求的 Acceptor都没有接受 Proposal 1时才成立 ;
  3. 少数 Acceptor 出现故障,不会影响系统的正常运行;

  4. 存在一个Acceptor接受多个提议的情况,此时这多个提议的值是一样的;

上一篇 下一篇

猜你喜欢

热点阅读