天天看點

分布式共識的工作原理,Part-2:共識問題與 FLP 不可能定理

在分布式系統中,達成共識意味着什麼

目前,我們已經知道分布式系統有以下特性:

  • 程序的并發性
  • 全局時鐘缺失
  • 元件可能出錯
  • 消息需時傳遞

接下來我們會聚焦分布式系統中,“達成共識”究竟是什麼意思。首先有一件很重要的事情得重申一下,“分布式計算有數百種軟硬體架構”;而最常見的形式稱為複制狀态機。

複制狀态機

複制狀态機是一種确定性狀态機,它在許多計算機上存有副本,但整個系統就像單個狀态機那樣運作。任何一台計算機都有出錯的可能,但狀态機依然能正常運作。

分布式共識的工作原理,Part-2:共識問題與 FLP 不可能定理

-作者制圖-

在複制狀态機中,如果出現一個有效事務(transaction),則事務的輸入集會使得系統的狀态轉變為下一個狀态。事務對資料庫進行原子性的操作,這意味着操作要麼整個完成,要麼等于完全沒發生。在複制狀态機内維護的事務集合又稱為“事務日志”;從一個有效狀态轉變為下一個有效狀态的邏輯,稱為“狀态轉變邏輯”。

分布式共識的工作原理,Part-2:共識問題與 FLP 不可能定理

換言之,複制狀态機是一個分布式計算機的集合,這些計算機都有相同初值。每一次狀态的轉變方式、下個狀态是什麼,都由相關的程序決定。所謂“達成共識”,意思是全體計算機都同意某個輸出的值。

反過來說,“達成共識”也意味着讓系統中每一台計算機的事務日志保持一緻(也就是它們“達成了共同目标”)。合格的複制狀态機,即使發生以下情況,仍必須不斷将新的事務接收進日志(即“提供有效服務”):

  1. 有些計算機發生故障。
  2. 網絡不可靠,消息可能出現延遲、傳送失敗,或排序混亂。
  3. 沒有全局時鐘來确定事務順序。

朋友們,這就是所有共識算法的基本目标。

分布式共識的工作原理,Part-2:共識問題與 FLP 不可能定理

共識問題的定義

隻要能滿足以下條件,我們就說某算法可以實作分布式共識:

  1. Agreement(一緻性) :所有非故障節點,都會選擇相同的輸出值。
  2. Termination(可終止性):所有非故障節點,最終都標明了某些輸出值,不再反悔。

注意:不同的算法會滿足上述條件的不同變體。舉例來說,某些算法會将 Agreement 拆分為一緻性和總體性;一些算法還加入了有效性(validity)、完整性(integrity),或效率的概念。這些細微的差別不在本文讨論範圍。

廣義來說,共識算法一般會假設系統中有三種角色:

  1. 提案者(Proposers):常被稱為上司者或協調者。
  2. 接收者(Acceptors):程序,監聽提案者的請求并給出響應值。
  3. 學習者(Learners):系統裡的其他程序,接收最終決定的值。

是以,正常情況下,我們能通過三個步驟定義來共識算法:

第一步:選舉 Elect

  • 所有程序推舉出某個程序(上司者)來做決策。
  • 上司者提出下一個有效的輸出值。

第二步:投票 Vote

  • 非故障程序會監聽上司者程序提出的值,并驗證這個值。然後将它作為下一個有效值提出。

第三步:決定 Decide

  • 非故障節點必須就單個正确的值達成共識。如果這個值收到滿足某個門檻值條件的投票數,那麼全體程序就會同意這個值為最終共識值。
  • 如果沒有達到條件,則重新進行上面步驟。
分布式共識的工作原理,Part-2:共識問題與 FLP 不可能定理
分布式共識的工作原理,Part-2:共識問題與 FLP 不可能定理
分布式共識的工作原理,Part-2:共識問題與 FLP 不可能定理
分布式共識的工作原理,Part-2:共識問題與 FLP 不可能定理
分布式共識的工作原理,Part-2:共識問題與 FLP 不可能定理

值得注意的是,每個共識算法都會有些許不同,比如:

  • 術語(如,輪次(round)、階段(phase))
  • 投票如何進行的,以及
  • 決定最終值的标準(例如:驗證條件)。

盡管如此,如果我們能以通用的過程構造共識算法,并保證滿足上述的基本條件,那我們就有了一個能夠達成共識的分布式系統。

你以為非常簡單,對吧?

FLP 不可能定理

......并非如此,說不定你已經預見到了!

回想一下,我們是如何描述同步系統和異步系統之間的差別的:

  • 同步通信情況下,消息會在固定時間範圍内發送。
  • 異步通信情況下,無法保證消息的傳遞。

這個差異非常重要。

在同步通信環境下有可能達成共識,因為我們能夠假設消息傳遞需要的最長時間。是以在同步消息系統,我們允許不同的節點輪流成為提案者、進行多數投票,并跳過那些沒有在最長等待時間内送出提案的節點。

但正如我們前面提到的,跳脫出可控(即消息延時可以預測)的環境(比如,具有同步原子鐘的資料中心之類的可控環境),假設操作發生在同步通信環境裡是不切實際的。

事實上,多數時候我們無法假設同步通信,是以我們的設計必須面向異步通信環境。

在異步通信環境中,因為我們無法假設一個最大的消息傳遞時間,想要達成 termination 條件是非常困難的。回憶下,要達成共識的其中一項條件是“可終止性”,也就是說每個非故障節點最終都必須標明某組相同的輸出值,而不能永遠遲疑不決。

這也就是大家熟知的“ FLP 不可能性 ”。它是怎麼得到這個名字的?我很高興你這麼問了。

1985年,研究員 Fischer、Lynch 和 Paterson (FLP)中描述了為什麼在異步通信環境下,單個程序故障也會導緻共識無法達成。

簡單來說,因為程序可能在任何時間出錯,是以也有可能發生在正好會影響共識達成的時間點。

分布式共識的工作原理,Part-2:共識問題與 FLP 不可能定理

-亮點自尋-

這個結果對分布式計算領域帶來重大打擊,但即使如此,科學家仍在不斷嘗試避開 FLP 不可能性問題的方法。

抽象一點來說,有兩個方法能夠避開 FLP 不可能性問題:

  1. 使用同步性假設
  2. 使用非确定性機制

(未完)

繼續閱讀