在這篇論文之前 — 它所降落的世界
2001 年時 Paxos 已經問世十多年,但它的正典版本 The Part-Time Parliament 把演算法包裝成一座希臘小島議會的考古報告,用 Lamport 自己的話說,對許多讀者而言那簡直是天書。真正需要容錯複本的工程師,當時要嘛把系統建在單一中央伺服器上——伺服器一掛整個服務就跟著掛,要嘛依賴 two-phase commit——協調者當機時就整個卡住。來自 Time, Clocks, and the Ordering of Events in a Distributed System 的狀態機複製方法早已是分散式系統理論中被引用最多的想法,但它預設了一個沒有人能講清楚的前提:如何對指令序列達成一致。Fischer、Lynch 與 Paterson 在 1985 年已經證明,在非同步模型下只要有一個節點可能故障,就沒有決定性演算法能保證達成共識,因此任何可用的答案都必須把「永遠安全」和「通常會結束」這兩件事切乾淨。這篇筆記存在的理由,就是要讓那個答案能用平常的句子讀懂。
術語 — 依本篇論文的用法
- Acceptor
- 可以接受帶編號提案的角色之一,其持久狀態承載了整個演算法的記憶。只有當多數派 acceptor 接受了同一個帶編號的提案,該值才算被選定。
- Learner
- 唯一任務是查出哪個值被選定的角色,它的行為永遠不影響安全性。在實作中,選出的領導者同時兼任 distinguished learner,負責通知其他人。
- Proposal(提案)
- 由一個唯一的自然數提案編號與一個值組成的配對。編號是全序的,且取自各提案者互不相交的編號集合,因此兩個提案者絕不會發出編號相同的提案。
- Chosen(被選定)
- 當某個帶著值 v 的提案被多數派 acceptor 接受,該提案及其值就算被選定。前後可能有多個提案被選定,但 P2 保證它們必定帶著同一個值。
- Prepare request
- 第一階段送出、帶著編號 n 的訊息。它向每個 acceptor 索取一個承諾——今後不再接受編號小於 n 的提案——同時要求回報該 acceptor 已接受過的最高編號提案。
- Accept request
- 第二階段送出、要求 acceptor 接受編號 n、值為 v 之提案的訊息。這個值要嘛被第一階段的回覆逼定,要嘛在沒有人回報任何已接受提案時由提案者自由決定。
- P2c
- 提案者發出編號 n、值 v 的提案時必須維持的不變式:存在某個多數派 S,其中沒有 acceptor 接受過編號小於 n 的提案,或者 v 就是 S 內接受過的、編號小於 n 之提案中編號最高者的值。維持 P2c 是整個演算法唯一的安全性義務。
- Distinguished proposer
- 被選出來、唯一會嘗試發出提案的提案者,在實作中就稱為 leader(領導者)。它存在的目的純粹是確保進展,缺席或同時出現多個只會犧牲活性,絕不會破壞安全性。
- Instance(實例)
- 共識演算法的一次完整執行。狀態機實作會跑一連串實例,第 i 個實例選定的值就是第 i 個指令,序列中的空洞則用 no-op 指令填補。