Paxos算法

Paxos算法


目录

  1. Paxos算法
  2. ZAB协议

1. Paxos算法

ZooKeeper 分布式一致性算法的原型,就是 Paxos 协议。下面简单分析一下 Paxos 协议。Paxos 中有三类角色 Proposer、Acceptor 及 Learner,相当于 ZooKeeper 集群中的 Leader、Follower 和 Observer。

  • 提议者(Proposer):提议一个值
  • 接受者(Acceptor):对每个提议进行投票
  • 告知者(Learner):被告知投票的结果,不参与投票过程

简单地说,Paxos 的原理是:Proposer 将发起提案(value)给所有 Accpetor,超过半数 Accpetor 获得批准后,Proposer 将提案写入 Accpetor 内,最终所有 Accpetor 获得一致性的确定性取值,且后续不允许再修改。

Paxos算法


执行过程

规定一个提议包含两个字段:[n,v],其中 n 为序号(具有唯一性),v 为提议值。

1. Prepare 阶段

下图演示了两个 Proposer 和 三个 Acceptor 的系统中运行该算法的初始过程,每个 Proposer 都会向所有的 Acceptor 发送 Prepare 请求。
Paxos算法
当 Acceptor 接收到一个 prepare 请求,包含的提议为 [n1,v1],并且之前还未接收过 Prepare 请求,那么发送一个 Prepare 响应,设置当前收到的提议为 [n1,v1],并保证以后不再接受序号小于 n1 的提议。

如下图,Acceptor 在收到 [n=2,v=8] 的 Prepare 请求时,由于之前没有接收过提议,因此就发送一个 [no previous] 的 Prepare 响应,设置当前接收到的提议为 [n=2,v=8],并保证以后不再接受序号小于 2 的提议。其他的 Acceptor 类似。
Paxos算法

如果 Acceptor 接收到一个 Prepare 请求,包含的提议为 [n2,v2],并且之前已经接收过提议 [n1,v1]。如果 n1 > n2,那么就丢弃该提议请求;否则,发送 Prepare 响应,该 Prepare 响应包含之前已经接收过的提议 [n1,v1],设置当前接收到的 [n2,v2],并保证以后不会再接受序号小于 n2 的提议。

如下图,Acceptor Z 收到 Proposer A 发来的 [n=2,v=8] 的 Prepare 请求,由于之前已经接收过 [n=4,v=5] 的提议,并且 n>2 ,因此就抛弃该提议请求;Acceptor X 收到 Proposer B 发来的 [n=4,v=5] 的 Prepare 请求,因为之前接收到的提议为 [n=2,v=8],并且 2<4,因此就发送 [n=2,v=8] 的 Prepare 响应,设置当前接收到提议为 [n=4,v=5],并且保证以后不再接受序号小于 4 的提议。Acceptor Y 类似。Paxos算法

2. Accept 阶段

当一个 Proposer 接受到超过一半的 Acceptor 的 Prepare 响应,就可以发送 Accept 请求。

Proposer A 接受到两个 Prepare 响应之后,就发送 [n=2,v=8] Accept 请求。该 Accept 请求会被所有的 Acceptor 丢弃,因为此时所有的 Acceptor 都保证不接受序号小于 4 的提议。

Proposer B 过后也收到了两个 Prepare 响应,因此也开始发送 Accept 请求。需要注意的是, Accept 请求的 v 需要取它接收到的最大提议编号对应的 v 值,也就是 8。因此它发送 [n=4,v=8] 的Accept 请求。
Paxos算法

3. Learn 阶段

Acceptor 接收到 Accept 请求时,如果序号大于等于该 Acceptor 承认的最小序号,那么就发送 Learn 提议给所有的 Learner。当 Learner 发现有大多数的 Acceptor 接收了某个提议,那么该提议的提议值就被 Paxos 选择出来。
Paxos算法


约束条件

  1. 正确性
    指只有一个提议值会失效。
    因为 Paxos 协议要求每个生效的提议被多数 Acceptor 接收,并且 Acceptor 不会接受两个不同的提议,因此可以保证正确性。

  2. 可终止性
    指最后总会有一个提议生效。
    Paxos 协议能够让 Proposer 发送的提议朝着能被大多数 Acceptor 接受的那个提议靠拢,因此能保证可终止性。


Paxos算法