- Paxos算法——优雅解读与注释
基本介绍
Paxos算法是分布式系统中实现一致性(Consensus)最经典且基础的协议之一。它能保证即使出现节点故障、消息丢失或网络分割,只要多数节点可用,就可以安全地就某个值达成唯一决议。
整个流程分为“阶段一”(Prepare/Promise) 和 “阶段二”(Accept/Accepted),通过Proposer和Acceptor的相互协作驱动。
伪代码与流程注释
角色说明
- Proposer:发起提案编号,力图推动整个系统达成某个一致的决议值。
- Acceptor:响应接受或拒绝提案,保证整个协议的安全性。
- Quorum 半数原则:提案与接受均需获得超过一半成员响应方可安全推进。
阶段一:Prepare / Promise
# Proposer:初始化流程
function proposer_prepare():
N = next_unique_proposal_number() # 选择唯一递增编号N
broadcast Prepare(N) to majority_acceptors()
responses = collect_promises_from_majority()
# 进入阶段二前的决策分支如下:
# 如果多数Promise的accepted值均为空 -> 可选任意值
# 否则 -> 选取acceptedN最大的acceptedV作为后续提案值
# Acceptor:响应Prepare请求
function acceptor_on_prepare(N):
if maxN is None:
maxN = N
reply POK, acceptedN=None, acceptedV=None
return
if N < maxN:
# 已承诺更高编号,不响应
return
if N >= maxN:
maxN = N
if acceptedN is None:
reply POK, acceptedN=None, acceptedV=None
else:
reply POK, acceptedN, acceptedV
return
阶段二:Accept / Accepted
# Proposer:根据Promise结果,发起Accept请求
function proposer_accept(N, responses):
if majority responses are (POK, None, None):
V = pick_any_value() # 半数empty,任选值
else:
# 选取最大acceptedN对应的acceptedV作为提案值
V = value_with_largest_acceptedN(responses)
# 发起Accept(N, V)到多数Acceptor
broadcast Accept(N, V) to majority_acceptors()
accept_responses = collect_accepts_from_majority()
# 若多数AOK,则通知Learners已安全决议
if majority accept_responses are AOK:
notify_learners(V)
else:
# 本轮编号未被多数接受,需升高N重新Prepare
N = increase_proposal_number()
proposer_prepare()
# Acceptor:响应Accept请求
function acceptor_on_accept(N, V):
if N < maxN:
# 已承诺更高编号,不响应
return
if N >= maxN:
maxN = N
acceptedN = N
acceptedV = V
reply AOK, acceptedN, acceptedV
return
补充说明
1. 安全性如何保证?
- 编号(N)保证并发时不会互相覆盖历史决议。
- 在阶段一中收集到acceptedV时,Proposer必须选取已有多数派中最大编号的值,防止“旧值覆写新值”导致一致性损坏。
2. 为什么要有两个阶段?
- 阶段一用来“清理”可能的旧提案,使并发的proposer不会对系统一致性产生威胁。
- 阶段二才实际赋值,且必须承诺不违背阶段一获得的历史值。
3. 常见的实践与改进
- 多轮决议时,可用Multi-Paxos优化,减少网络交互。
- 引入Leader角色可简化proposer冲突。
- 持久化Acceptor状态,防止节点意外重启导致安全性丢失。
4. Learner角色
- Paxos基础流程未细化如何通知Learner,实际工程中通过汇聚Acceptors决议转发给Learners实现。
总结与参考
Paxos算法通过编号、半数原则和两阶段协议实现最小通信量的一致性决议,是分布式一致性算法奠基石。
建议深入阅读论文原文以及工程实践案例,加深理解。
参考文献:
- Lamport, L. "Paxos Made Simple." 2001.
- Distributed Systems textbook, Tanenbaum.