分布式系統的模型
為了更容易理解分布式系統,我們先來構建一個模型。
- 武當派因為人口增長變成 11 個辦事處分散在地圖各地;
- 辦事處之間的通信只能依靠信鴿;
- 一只信鴿可能無法完全覆蓋所有辦事處,需要有中繼村落代為傳輸消息。
太極拳大會的舉辦權不僅會為武當派帶來巨大收益同時也會為辦事處帶來很多好處,為了產生合理的舉辦者,人們約定了幾條規則:
- 大會舉辦權從 A 和 B 兩個辦事處中產生,他們每一屆都是候選;
- 投票時所有辦事處僅能投 A 或 B;
- 用投票的方式產生舉辦者,少數服從多數。
所有辦事處會為了舉辦權都會使出渾身解數,比如延遲發送投票結果、篡改別人的投票結果、假裝沒有接收到通知等等。
其實這是一個典型的分布式系統,可以看成是我們簡化版的區塊鏈網絡環境,那么這個分布式系統會遇到什么樣的問題呢?
分布式系統面臨的問題
分布式系統面臨了幾個問題:一致性問題,可終止性問題、合法性問題。
可終止性可以理解為系統必須在有限的時間內給出一致性結果,合法性是指提案必須是系統內的節點提出。當然其中面對的最重要也是最基礎的問題,就是我們常說的一致性問題。
一致性是指在某個分布式系統中,任意節點的提案能夠在約定的協議下被其他所有節點所認可。
需要提醒你區分的一點是:這里的“認可”表示所有節點對外呈現的信息一致,而不是對信息的內容認可。
我們回到上面的例子,我們提到了所有的辦事處只能投 A 或 B,其實這個投票的動作可以理解為提案。
在“投票過程被大家所認可”這個語境下,“被大家所認可”表示某個辦事處投票的結果已經被記錄,用于最后統計結果,而不是認可投給 A 或者投給 B,這也是我在上述強調你要注意區分的一點。
一致性體現在那里呢?
非人為惡意的意外投票過程。 非人為惡意篡改可歸類為信鴿半路掛掉、信鴿迷路、信鴿送錯目的地、信鴿送信途中下雨導致信件內容模糊、接收信件的人不在家、天氣變化信鴿延遲送達等等。這些對應到分布式系統面臨的問題就是:消息丟包、網絡擁堵、消息延遲、消息內容校驗失敗、節點宕機等。
人為惡意篡改投票過程。 人為惡意篡改包括“精神分裂式投票”,中繼篡改上一個辦事處的投票信息。對應到分布式系統面臨的問題就是:消息被偽造、系統安全攻擊等等。發生的人為惡意篡改的過程就可以稱之為系統發生了拜占庭錯誤(Byzantine Fault),如果系統可以容忍拜占庭錯誤而不至于崩潰,也就是在發生系統被惡意篡改的情況下仍然可以達成一致,我們將這樣系統稱作為做拜占庭容錯系統。
有關分布式系統的定理
- 第一個是 FLP 不可能性,簡單來說是:即使網絡通信完全可靠,只要產生了拜占庭錯誤,就不存在一個確定性的共識算法能夠為異步分布式系統提供一致性。換句話來說就是,不存在一個通用的共識算法可以解決所有的拜占庭錯誤。
- 第二個是 CAP 定理,CAP 定理是分布式系統領域最重要的定理之一,這個我們在“理解區塊鏈的常見誤區”一文中稍微講到過。也就是在設計分布式系統的過程中,“一致性”“可用性”“分區容忍性”三者中,我們只能選擇兩個作為主要強化的點,另外一個必然會被弱化。
我們由 CAP 定理可以推導出嚴格一致性和最終一致性。嚴格一致性是指在約定的時間內,通常是非常短、高精度的時間內,系統達到一致性的狀態,這種系統很難實現,即使實現也很難有高的性能。
可用性其實是傳統技術后端架構上非常重要的指標,從單點到主備模式、從主備模式到異地多活,再到現在的 Paxos 和 Raft 協議。
分區容忍性在企業內部極少出現,尤其是中心化的服務性應用,所以很少考慮。然而區塊鏈的 P2P 網絡環境十分復雜,所以必須要保證很高的分區容忍性。
共識算法與分布式一致性算法
經典的分布式一致性算法
經典分布式一致性算法有 Raft 協議,Raft 協議是一種強 Leader 的一致性算法,它的吞吐量基本就是 Leader 的吞吐量,它無法抵御節點惡意篡改數據的攻擊。
稍微復雜一點的就是 Paxos 協議,Paxos 能提供不同場合不同種類的一致性算法,所以 Paxos 有很多變種,經典 Paxos 是 Leaderless 的,有變種是強 Leader 型的,叫做 Fast Paxos。
以上兩種都是不提供拜占庭容錯的系統,下面介紹一種具有拜占庭容錯的一致性算法。
區塊鏈共識算法
區塊鏈的共識算法,我在某些場合直接稱作基于經濟學的博弈算法,以區別于經典分布式一致性算法思路,它的整體思路就是讓攻擊者的攻擊成本遠遠大于收益。
區塊鏈中的共識算法目前具有工業成熟度的是 PoW,另外兩種比較成熟的是 PoS 和 DPoS,其次還有一些變種和單一幣種使用的共識算法。
在使用 PoW 共識算法的情況下,容錯閾值是 50%,而 PBFT 及其變種的容錯閾值是 33% 左右,這里的百分比是指作弊節點占全網節點的比例。
PoX 類的算法其實都延續了 PoW 的設計理念,相比較經典分布式一致性算法,PoX 類算法通過概率選擇記賬者降低了潛在的提案者,另外是延長了達成最終一致性的時間。