共識演算法 Paxos

★★★★★Draft

FromDatabase Internals

📚 From the Books

共識演算法 PaxosConsensus

讓一群節點就某個值達成一致,即使有節點崩潰、訊息延遲。Paxos 是最廣為人知的共識演算法(Lamport 1998),以正確性為先——在任意數量故障下都保證安全,只要多數派存活就能繼續推進。它是一整個協議家族,Raft 則是後來為「好懂」而生的另一條路。

🧠 Intuition

TIP

Paxos = 「先問夠多人拿到承諾,再叫這夠多人把值記下來」。每次提案都帶一個單調遞增的號碼當身分證;靠「任兩個多數集合必定相交」這條幾何事實,保證一旦有值被決定,之後的提案者一定會看到它、只能沿用它——決定就不反悔。

⚖️ Tradeoffs

兩階段流程 — Prepare/Promise 與 Accept/Accepted
  • Phase 1(Propose):proposer 對多數 acceptor 送 Prepare(n)。acceptor 若沒回應過更高號碼,就承諾不再接受號碼更低的提案;若已接受過某提案,回 Promise 時附上已接受的值。
  • Phase 2(Replication):收集到多數 promise 後,proposer 送 Accept!(n, v)。這裡的 v 不是隨便挑的——若 promise 回應中有已接受的提案,必須採用其中號碼最高的那個值;沒有才用自己的值。
  • acceptor 收到 Accept!(n, v) 就接受,除非期間已對更高號碼的 Prepare 承諾過。
  • 一個值被多數 acceptor 接受即算決定;learner 收到多數 acceptor 的通知後得知結果。
提案號碼與多數決 — 安全性從何而來
  • quorum 只描述阻塞性質:每一步都要等到至少一個多數派回應才前進,但不必等全部。
  • 核心不變式:任兩個多數集合必相交。所以只要某值已被一個多數派接受,任何新的 proposer 在 Phase 1 一定會撞到「見過那個值」的 acceptor,於是被迫沿用它。
  • 這保證了一旦決定就不反悔:後續 proposer 即使用更高號碼開新輪次,也只能決定相同的值。
  • 容錯代價:要容忍 f 個故障,安全在任意數量故障下都成立,活性則需總共 2f + 1 個程序。
  • 活鎖風險:兩個 proposer 互相用更高號碼壓過對方、誰都跑不完 Phase 2,靠隨機退避 (random backoff) 化解。
Multi-Paxos — 穩定 leader 省掉 Phase 1
  • 經典 Paxos 每決定一個值都要跑一次完整 Prepare 輪次,昂貴。
  • Multi-Paxos 引入長期 leader(distinguished proposer):leader 一旦確立,後續複製可跳過 Phase 1、直接進 Accept,並連續複製多個值。
  • 常被描述為操作的複製日誌 (replicated log):單值 Paxos 像「一次性寫入暫存器」,Multi-Paxos 像「僅追加日誌」。
  • 部分實作用 lease:leader 週期性告知自己還活著,參與者承諾 lease 期間不接受別的 leader,藉此直接從 leader 讀而不必收 quorum。
  • 但 lease 是效能優化、不是正確性保證,且依賴有界時鐘同步——時鐘漂移過大時線性化保證會失守。
  • 日誌需定期做快照 (snapshot) 並截斷,否則無限增長。
變體家族 — Fast / EPaxos / Flexible
  • Fast Paxos:讓 proposer 直接聯繫 acceptor、繞過 leader 少一次往返,代價是 quorum 變大(需 3f + 1 個 acceptor);多個 proposer 同時搶 fast round 會碰撞,高請求率下延遲反而可能更差。
  • EPaxos:不設固定 leader,讓每個命令有自己的 leader,靠找出命令間的依賴關係建立順序而非靠提案號碼;只有真正互相干擾的命令才需排序,兼顧高可用與高吞吐。
  • Flexible Paxos:關鍵洞見是只需 Phase 1 的 quorum 與 Phase 2 的 quorum 有交集即可,即 Q1 + Q2 > N;於是可縮小較頻繁的 Phase 2 quorum、把票數挪到選舉階段,用可用性換延遲
  • 共通主題:都在動「要等多少人、由誰發起、如何排序」這三個旋鈕,換取延遲、吞吐或可用性。
與 Raft 對比 — 家族/正確性 vs 單一/可理解性
  • Paxos 是一個協議家族,論文以正確性為先,出了名地難懂、難正確實作;Raft 是單一演算法,設計目標明寫在標題:「尋找一個可理解的共識演算法」。
  • Raft 把 leader 設為一等公民、日誌不允許有洞、只從 leader 流向 follower,換取好懂好測;Paxos 較自由但更難推理(詳細內部見 raft 頁,此處不展開)。
  • 兩者解的是同一問題:原子廣播與共識在有崩潰故障的非同步系統中等價,replicated log 就是全序廣播的實作。
  • 工程現實:etcd / Consul / CockroachDB 等多選 Raft——好懂往往勝過理論優雅;但 Paxos 家族(尤其 Multi-Paxos)仍是許多正式系統的底層。

🔑 Takeaways

✍️ My Notes

No notes yet — jot your takeaways or Q&A here.

📖 Further Reading

🔗 Dive Deeper