文章

MIT 6.824 学习记录:Paxos 论文阅读

本周 MIT 6.824 的课程任务聚焦于 Raft 协议,但在正式进入 Raft 论文前,我注意到题目描述中提及 Raft 是“一个比 Paxos 更易理解的共识算法”。出于对基础概念完整性的考虑,我选择先阅读 Leslie Lamport 的经典论文《Paxos Made Simple》,尝试理解 Paxos 共识协议的核心思想

Paxos 的问题背景

Paxos 要解决的是分布式系统中“多个节点如何就一个值达成一致”的问题。它的目标是在网络不可靠(消息可能延迟、重复、丢失)、节点可能崩溃的前提下,依然可以达成:

  1. 只有一个值被选中(Only one value is chosen)

  2. 被选中的值一定是某个节点提议过的(Only a proposed value may be chosen)

  3. Learner 学到的值必须是真的被选中的值(A process never learns that a value has been chosen unless it actually has been)

注意 Paxos 是 非拜占庭容错 的,它不考虑恶意节点,仅容忍“非恶意故障”如宕机、网络中断。

Paxos 协议结构

Paxos 中有三种逻辑角色:

  • Proposer:提出某个 value 的提议

  • Acceptor:投票是否接受某个提议,是“共识裁判”

  • Learner:学习最终达成共识的值,通常代表客户端或状态机

一个完整的 Paxos 提案需要两个阶段:

Phase 1: Prepare / Promise

  • Proposer 选择一个全局唯一的提案编号 n,发送 prepare 请求

  • Acceptor 接收到后:

    • 如果该编号 n 大于其已承诺的编号,回复 promise,承诺不再接受小于 n 的提案

    • 同时返回自己已接受的最大编号的提案(如有)

Phase 2: Accept / Accepted

  • Proposer 汇总 responses:

    • 如果有人返回曾接受过某个提案,则选择编号最大的那个值继续提议;否则可自由提议任意值

    • 发送 (accept, n, v) 到多数派 acceptors

  • Acceptor 若尚未承诺更大编号,会接受该提案并回复

若多数 acceptor 接受了该提案,称该值被 chosen,Learner 可据此学习。

编号机制与 higher-numbered proposal

论文中强调:“如果某个编号为 n 的值 v 被选中,那么任何更高编号(n'>n)的提案若被选中,其值也必须是 v。”这是 Paxos 保证一致性的核心不变量。

编号在 Paxos 中的作用类似于以太坊中交易的 nonce,用来解决并发 proposer 竞争的问题,确保不会出现两个提案都被选中。

和 2PC 的对比

我一度将 Paxos 的两阶段机制与 2PC 搞混。实际上,虽然两者都有 prepare + commit 的结构,但 Paxos 与 2PC 的区别如下:

比较项

Paxos

2PC

协调方式

多数派共识

中心化协调器

容错性

容忍部分节点失败

协调器故障会阻塞

是否阻塞

否(多数派活着即可)

是(需要全体参与)

应用场景

共识协议

分布式事务

Paxos 更像一个多数派赞成的议会机制,而 2PC 更像一个法官拍板的司法机制。

关于提案(proposal)的理解

刚开始我对 proposal 的理解较混乱,后来结合例子清晰了不少。

以一个分布式 kv 存储为例:

  • 用户想设置 x=42,这个操作就是一个 proposal(提案)

  • Proposer 发起该提案,希望 acceptors 多数接受

  • 若达成多数,proposal 被选中,该值被记录,Learner 学习该值,系统对外“提交”该操作

若有人后来想改为 x=100,必须发起新提案,Paxos 会确保不会同时接受两个值。

此外,我曾疑惑如何区分“更新旧值”和“发起新 slot 的提案”,这个涉及到 Multi-Paxos 的设计,它通过日志 slot 的编号(类似区块高度)区分每一轮共识的位置。

关键困惑与思考

  1. P1 与 P2 是否冲突?

    • 看似 Acceptors 必须接受第一个提案(P1),但同时又要确保继承旧提案的值(P2)

    • 实际上是通过 Phase 1 中返回已有值,再让 proposer 在 Phase 2 中决定“继承旧值”,从而解决

  2. 为何不直接选一个 leader 来决定一切?

    • Paxos 不禁止选 leader,Multi-Paxos 就是在此基础上优化(让 leader 重复提议多个 slot)

    • Leader 机制会带来单点问题,但换取性能;Paxos 保持基本安全机制即便没有 leader

  3. Paxos 是否是一个完整存储系统?

    • Paxos 是共识协议,不负责状态存储和应用逻辑;真正的分布式存储系统在 Paxos 基础上构建,比如 Google 的 Chubby、Spanner 使用 Paxos 做日志复制

总结

Paxos 虽然以“简单”为名,但初读依然颇为晦涩。它解决的问题高度通用且抽象,和实际系统之间还隔着一层架构实现。但理解 Paxos 的价值在于,它明确界定了 一致性达成的最小逻辑闭包,是任何分布式系统中关于“共识”的理论基线。

下一阶段我将进入 Raft 的学习,它在保留 Paxos 安全性的同时通过更清晰的 leader 驱动机制简化了工程实现,值得期待

参考资料:

Paxos Made Simple:https://css.csail.mit.edu/6.824/2014/papers/paxos-simple.pdf

License:  CC BY 4.0