知识卡片
Paxos的准备批准两阶段协议与三种节点角色
内容
Paxos把节点分成三类:提案节点(Proposer,提出对某个值的设置操作,这个 “设置”更接近日志记录而非变量赋值)、决策节点(Acceptor,决定提案是否 被接受,一旦被过半数决策节点接受即”批准”,批准后的值不可更改也不会 丢失)、记录节点(Learner,不参与决策,只学习已达成的共识)。分布式 环境下”给数据加锁”不能照搬普通并发控制的互斥锁思路——如果一个节点拿到 锁后崩溃失联,整个操作就会被无限期阻塞,所以分布式锁必须是可抢占的。 Paxos用两阶段实现这种可抢占锁:准备阶段(Prepare)里提案节点带着一个 全局唯一且单调递增的提案ID广播许可申请,决策节点承诺”不再接受ID更小的 Prepare/Accept请求”,并回复自己此前批准过的最大ID提案的值(如果有的话); 批准阶段(Accept)里,如果提案节点发现所有回应都没有已批准的值,就可以 自由决定要设置的值;但只要有任何一个回应带了值,提案节点就必须放弃自己 原本想设的值、无条件接受应答中ID最大的那个值,一并广播给全体决策节点。 只有拿到多数派决策节点的Accepted应答,协商才算真正结束。
结构图:
sequenceDiagram
participant P as 提案节点 Proposer
participant A as 决策节点们 Acceptor
P->>A: 准备阶段: Prepare请求(带全局唯一递增提案ID n)
A-->>P: 承诺不再接受ID≤n的Prepare/不再接受ID<n的Accept<br/>+ 回复此前批准过的最大ID提案的值(若有)
alt 多数派回应均无已批准的值
P->>A: 批准阶段: Accept请求(自己选定的值, id)
else 回应中已有值
P->>A: 批准阶段: Accept请求(改用ID最大的那个已有值)
end
A-->>P: Accepted应答(不违背承诺前提下持久化)
Note over P,A: 多数派Accepted后协商结束, 决议发送给Learner
参考来源
- 位置:《凤凰架构:构建可靠的大型分布式系统》第6章"分布式共识"6.1.2节
"算法流程"(源文件:_epub-src对应OEBPS/Text/chapter79.xhtml)
- 结论依据:原文定义Proposer/Acceptor/Learner三类角色,详述Prepare阶段
两个承诺一个应答、Accept阶段"无值可自由设定/有值必须接受最大ID值"的
具体规则,直接支撑本卡片的结构梳理。
- 原始内容:提案节点的Prepare请求中会附带一个全局唯一且单调递增的数字n
作为提案ID……如果提案节点发现响应的决策节点中已经有至少一个节点的
应答中包含值了,那它就不能够随意取值,而是必须无条件地从应答中找出
提案ID最大的那个值并接收。