Paxos算法
Paxos算法
目录
1. Paxos算法
ZooKeeper 分布式一致性算法的原型,就是 Paxos 协议。下面简单分析一下 Paxos 协议。Paxos 中有三类角色 Proposer、Acceptor 及 Learner,相当于 ZooKeeper 集群中的 Leader、Follower 和 Observer。
- 提议者(Proposer):提议一个值
- 接受者(Acceptor):对每个提议进行投票
- 告知者(Learner):被告知投票的结果,不参与投票过程
简单地说,Paxos 的原理是:Proposer 将发起提案(value)给所有 Accpetor,超过半数 Accpetor 获得批准后,Proposer 将提案写入 Accpetor 内,最终所有 Accpetor 获得一致性的确定性取值,且后续不允许再修改。
执行过程
规定一个提议包含两个字段:[n,v],其中 n 为序号(具有唯一性),v 为提议值。
1. Prepare 阶段
下图演示了两个 Proposer 和 三个 Acceptor 的系统中运行该算法的初始过程,每个 Proposer 都会向所有的 Acceptor 发送 Prepare 请求。
当 Acceptor 接收到一个 prepare 请求,包含的提议为 [n1,v1],并且之前还未接收过 Prepare 请求,那么发送一个 Prepare 响应,设置当前收到的提议为 [n1,v1],并保证以后不再接受序号小于 n1 的提议。
如下图,Acceptor 在收到 [n=2,v=8] 的 Prepare 请求时,由于之前没有接收过提议,因此就发送一个 [no previous] 的 Prepare 响应,设置当前接收到的提议为 [n=2,v=8],并保证以后不再接受序号小于 2 的提议。其他的 Acceptor 类似。
如果 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 类似。
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 请求。
3. Learn 阶段
Acceptor 接收到 Accept 请求时,如果序号大于等于该 Acceptor 承认的最小序号,那么就发送 Learn 提议给所有的 Learner。当 Learner 发现有大多数的 Acceptor 接收了某个提议,那么该提议的提议值就被 Paxos 选择出来。
约束条件
-
正确性
指只有一个提议值会失效。
因为 Paxos 协议要求每个生效的提议被多数 Acceptor 接收,并且 Acceptor 不会接受两个不同的提议,因此可以保证正确性。 -
可终止性
指最后总会有一个提议生效。
Paxos 协议能够让 Proposer 发送的提议朝着能被大多数 Acceptor 接受的那个提议靠拢,因此能保证可终止性。