分散式與網路作業系統

共識(consensus)

想像一個委員會必須敲定一個活動日期,但他們只能靠傳紙條溝通、而紙條有時會弄丟,還有些成員可能中途離席。無論如何,整個委員會最後仍必須一致同意同一個日期——不能是兩個不同的日期、也不能沒有日期。共識正是電腦版的這個問題:讓一群各自獨立的機器,即使在訊息可能延遲或遺失、且某些機器可能當掉的情況下,仍對單一個值(下一個要執行的指令、誰是領導者、某筆交易是否提交)取得一致。

一個好的共識協定必須同時保證幾件事:所有做出決定的人,決定的值必須相同(一致性/agreement);被決定的值必須是真的有人提議過的(有效性/validity);而系統最終必須做出決定、而非永遠卡住(終止性/termination)。達成這件事的著名協定有 Paxos(正確、但出了名地難懂)與 Raft(專為「好懂」而設計,如今廣為採用)。它們通常透過一個領導者加上多數投票來運作:一個被提議的值,只有在群組中的多數(一個法定人數/quorum)都接受之後,才成為決定。由於同一群組的任意兩個多數至少必有一個節點重疊,兩個互相衝突的決定不可能同時湊到多數——這個重疊,就是防止意見分歧的那個訣竅。

為什麼重要,以及誠實的極限:共識是可靠分散式系統賴以建立的那塊磐石——它撐起了複製式資料庫、上鎖服務、以及讓叢集保持一致的那些領導者選舉。但它不是魔法。它要花上好幾輪訊息,所以比「一台機器自己決定」慢。而且有一個深刻的理論結果(FLP 不可能性)指出:在一個連一個節點都可能當掉的完全非同步網路裡,沒有任何協定能保證它「總是」會終止——真實系統靠逾時與隨機性繞過這點,接受「它們在實務上會推進、而非在最壞的理論情況下」。共識需要一個「可達到的多數」,這正是它為何直接連到 CAP 定理:在一個把群組切開的分裂期間,少數那一側無法推進。

一個資料庫的五個副本,必須對寫入的順序取得一致。用 Raft 時,領導者提議「寫入 X = 7 是第 12 號項目」。只有在五個之中至少有 3 個(一個多數)儲存了它之後,它才算提交。如果領導者當掉,會選出一個新的繼續——但一個只握有五個中 2 個的分裂,永遠湊不到 3,於是它寧可安全地拒絕提交,也不冒意見分歧的險。

在訊息遺失與當機之下仍對一個值取得一致,靠的是要求互相重疊的多數。

共識並非免費:它要花上好幾輪訊息、且需要一個可達到的多數,所以一個被分裂的少數會刻意停止推進以保持安全。FLP 結果意味著在完全非同步的網路裡沒有任何協定能保證終止;真實協定靠逾時。

又称
agreement分散式共識共識PaxosRaft