Paxos协议
- 基本概念
- 角色
- 流程
- Proposer处理流程
- Acceptor流程
- Paxos协议示例
基本概念
- Paxos协议是少数在工程实践中证实的强一致性,高可用的去中心化分布式协议
- Paxos协议的流程较为复杂,但是基本思想类似投票过程
- Paxos协议中有一组完全对等的参与节点 :acceptor
- 这组节点各自就某一件事做出决议,如果某个决议获得了超过半数节点的同意则生效
- Paxos协议中只要有超过一半的节点正常,就可以工作,就能很好对抗宕机,网络分化等异常情况
角色
- Proposer: 提案者
- Proposer可以有多个
- Proposor提出议案value:
- value: 指在工程实践中的任何操作:
- 比如修改某个变量为某个值
- 设置当前primary为某个节点等等
- Paxos协议中统一将这些操作抽象为value
- 不同的Proposer可以提出不同甚至矛盾的value:
- 比如某个Proposer提议“将变量X设置为1”
- 另一个Proposer提议“将变量X设置为2”
- 但是对于同一轮Paxos过程,最多只有一个value被批准
- Acceptor: 批准者
- Acceptor可以有多个
- Proposer提出的value必须获得超过半数的Acceptor批准后才能通过
- Acceptor之间完全对等独立
- Learner: 学习者
- Learner学习被批准的value:
- 就是通过读取各个Proposer对value的选择结果
- 如果某个value被超过半数Acceptor通过,那么Learner就学习到了这个value
- 这三类角色只是逻辑上的划分,工程实践中一个节点可以同时充当这三类角色
流程
- Paxos协议一轮一轮进行,每轮都有一个编号.每轮Paxos协议可能会批准一个value. 如果某一轮Paxos协议批准了某个value, 那么以后各轮Paxos协议只能批准这个value
- 各轮协议流程组成一个Paxos协议实例: 一次Paxos协议实例只能批准一个value. 这也是Paxos协议强一致性的重要体现
- 每轮Paxos协议分为两个阶段:
- 准备阶段
- 批准阶段
- 这两个阶段Proposer和Acceptor有各自的处理流程
Proposer处理流程
- 向所有的Acceptor发送消息 “Prepare(b)”, 这里的b是Paxos的轮数,每轮递增
- 如果收到任何一个Acceptor发送的消息 “Reject(B)”, 对于这个Proposer而言,本轮Paxos失败,将轮数b设置为B+1后重新进行上一个步骤
- 在批准阶段,会根据收到的Acceptor的消息作出不同选择
- 如果收到的 “Promise(b, v)消息” 中 ,v都为空 ,Promise会选择一个value作为v, 向所有Acceptor广播消息Accept(b, v)
- 否则,在所有接收的 “Promise(b, v_i)消息” 中,选择i最大的value作为v, 向所有Acceptor广播消息 “Accept(b, v)”
- 如果接收到Nack(B), 将轮数b设置为B+1后重新进行第一步步骤
Acceptor流程
- 接收某个Proposer的消息Prepare(b). 参数B是该Acceptor收到的最大Paxos轮数编号 ,V是Acceptor批准的value, 可以为空
- 如果b > B, 回复Promise(b, V_B), 设置B = b. 表示不再接受编号小于b提案
- 否则,回复 “Reject(B)消息”
- 接受Accept(b, v):
- 如果b < B, 回复Nack(B), 表示Proposer有一个更大编号的提案被这个Acceptor接收了
- 否则设置V=v. 表示这个Acceptor批准的Value是v. 广播 “Accepted消息”
Paxos协议示例



- 在同一个Paxos实例中, 批准的value是无法改变的,即使后续Proposer以更高的序号发起Paxos协议也无法改变value
Paxos协议是被人为设计出来的,设计过程也是协议的推导过程:
- 协议就是Proposer更新Acceptor的过程,一旦某个Proposer成功更新了超过半数的Acceptor, 那么就更新成功
- Learner按照Quorum机制去读取Acceptor, 一旦某个value在超过半数的Proposer上被成功读取,则说明这是一个被批准的value
- 协议通过引入轮次,使得高轮次的提议抢占低轮次的提议来避免死锁
协议设计的关键点:
- 如何满足 “在一次Paxos算法实例过程中只批准一个value” 这一约束条件