在這篇論文之前 — 它所降落的世界
到 1990 年,狀態機方法(state-machine approach)已經存在十多年:Lamport 1978 年的時鐘論文提出了第一個實作任意狀態機的演算法,1984 年的成果則能容忍任意固定數量 f 的任意型(Byzantine)故障。這些演算法換來了有界時間回應與惡意容錯,代價卻很高——f 越大,硬體冗餘、通訊頻寬與回應時間的成本就越高;而且兩台伺服器無法互相通訊等同於其中一台故障,一旦故障數超過 f,各伺服器的狀態複本就會不一致。資料庫界則有 three-phase commit,協調者與參與者之間同樣要交換五則訊息,但它只能在 commit 與 abort 之間二選一。Fischer、Lynch 與 Paterson 在 1985 年已證明非同步環境下沒有任何協定能保證達成一致,因此任何關於進展的宣稱都必須附上時序假設。這篇論文寫於 1990 年,直到 1998 年才刊出,並以一段編輯說明包裝:這份投稿是在 TOCS 編輯室的檔案櫃後面被發現的。
術語 — 依本篇論文的用法
- 帳冊(Ledger)
- 議員的持久化紀錄,以不褪色的墨水書寫,條目一旦寫下就不能更改;書後的註記可以劃掉,而寫在紙條上的東西則可能在離開議事廳時遺失。這正是論文對穩定儲存與揮發性記憶體的區分。
- 法令(Decree)
- 編號的法律條目,也是議會達成一致的單位;國家的法律就是已通過法令的序列。在電腦系統的對照中,一條法令就是一個狀態機命令,它的編號就是它在複本日誌中的位置。
- 投票(Ballot)
- 針對單一法令的一次編號表決,由法令、quorum、實際投票的祭司集合與投票編號組成。當 quorum 中每位祭司都投了票,這次投票才算成功,成功投票的法令就是被選定的法令。
- 投票編號(Ballot number)
- 取自無界有序集合的值,且被分割成各祭司專屬的無限供給,因此兩位祭司不可能用到相同編號。編號較大代表「較晚」,但完全不代表該次投票實際上比較晚進行。
- 多數集合(quorum)
- 使一次投票得以成功的祭司集合。真正被用到的性質只有一個:任兩個多數集合至少共有一位祭司,這也是簡單多數、加權多數與依出席紀錄加權的多數都行得通的原因。
- MaxVote(b, p, B)
- 祭司 p 所投、編號嚴格小於 b 的最大一票;若他從未投票,則為編號負無窮大的空票。對一組祭司則取其最大值,這正是主席在第一階段必須查明的量。
- 條件 B3
- 對每次投票 B 而言,若其 quorum 中有任何成員曾在較早的投票中投過票,則 B 的法令必須等於那些較早投票中最晚一次的法令。這條約束防止新一輪投票覆蓋掉可能已被選定的法令。
- 主席(President)
- 負責發動投票的單一祭司或議員,設立他的唯一理由是讓進展成為可能。同時存在多位主席只會拖慢進展,絕不會造成不一致,這也是領導者選舉不必做到精確的原因。
- 橄欖節法令(Olive-day decree)
- 一條對任何 Paxos 人都毫無影響的傳統法令,新任主席用它來填補帳冊中的空洞。它就是無作用(no-op)的日誌條目,讓法令序列保持連續,並維持法令排序性質。