區塊鏈筆記(三)分佈式系統核心技術

目錄

一、一致性問題

1、定義

2、挑戰

3、一致性的要求

4、帶約束的一致性

二、共識算法

1、問題與挑戰

2、常見算法


區塊鏈系統是一個典型的分佈式系統,必然會存在分佈式架構面臨的問題與挑戰,涉及一致性、共識等方面。

一、一致性問題

隨着業務場景越來越複雜,計算規模越來越龐大,單點系統很難滿足可拓展性和高容錯兩方面的需求,此時就需要多臺服務器組成集羣系統,但集羣系統要實現一致性絕非易事。

1、定義

一致性(consistency)在分佈式系統領域指的是對於多個服務節點,給定一系列操作,在約定協議的保障下,使得它們對處理結果達成“某種程度”的協同。

傳統分佈式系統中討論一致性,往往是指在外部任意發起請求(如向多個節點發送不同請求)的情況下,確保系統內的大部分節點實際處理請求序列的一致,即對請求進行全局排序。

一致性關注的是系統呈現的狀態,並不關注結果是否正確。

2、挑戰

  • 節點完成請求的時間無法保障,處理結果可能是錯誤的,節點甚至可能隨時發生故障
  • 爲了實現可拓展性,集羣系統往往採用異步設計,依靠網絡消息交互,這意味着不可預測的通信延遲、丟失或錯誤

現代分佈式系統處理一致性問題的基礎思路中的核心思想,都是將可能引發不一致的並行操作進行串行化。

3、一致性的要求

  • 可終止性(termination),指一致的結果在有限時間內能完成。意味着可以保障提供服務(liveness),這是計算機系統可以被正確使用的前提。
  • 約同性(agreement),指不同的節點最終完成的決策的結果是相同的。這看似容易,實際上暗含了一些潛在信息,決策的結果相同,意味着算法要麼不給出結果,要麼給出的結果是已經達成共識的。真正的挑戰在於算法要考慮可能出現的任意情形。其中,事件發生的先後順序(邏輯時鐘)十分重要,確定了順序,就可以消除分歧,因此解決分佈式系統領域許多問題的核心祕訣就是:把不同時空發生的多個事件進行全局唯一排序,而且這個順序是大家認可的。然而,計算機系統的時鐘誤差比較大,不能夠據此來進行排序,這就造成了分佈式系統中達成一致順序非常困難。
  • 合法性(validity),指決策的結果必須是某個節點提出的提案,即達成的結果必須是節點執行操作的結果。

4、帶約束的一致性

實際上,越強的一致性要求往往意味着越弱的處理性能,以及越差的可拓展性。根據實際需求的不同,可以選擇不同強度的一致性,包括強一致性(strong consistency)和弱一致性(weak consistency)。

強一致性主要包括:

  • 順序一致性(sequential consistency),又叫因果一致性。所有的進程看到的全局執行順序(total order)一致(否則數據副本不一致);並且每個進程看自身操作的順序(local order)跟實際發生順序一致。它實際上限制了各進程內指令的偏序關係,但不在進程間按照物理時間進行全局排序,屬於實踐中可行的最強保證。
  • 線性一致性(linearizability consistency),是一種更強的保證,在順序一致性的前提下加強了進程間的操作排序,形成理想化的全局順序,性能差。

強一致性往往比較難實現,且很多場景對於一致性的需求沒有那麼強。例如在一定約束下實現所謂的最終一致性(eventual consistency),即總會存在一個時刻,讓系統達到一致的狀態。這種在某些方面弱化的一致性都籠統的稱爲弱一致性。

 

二、共識算法

共識算法解決的是分佈式系統中大部分節點對於某個提案(proposal)達成一致的過程,而一致性在分佈式系統領域中指的是多個副本對外呈現的狀態。因此,達成了某種共識並不意味着就保障了一致性。實踐中,要保障系統滿足不同程度的一致性,往往需要通過共識算法來達成。

提案可以指多個事件發生的順序、某個鍵對應的值、主節點的選取等,其含義非常寬泛。

1、問題與挑戰

達成共識需要解決兩個基本問題:

  • 如何提出一個待共識的提案?
  • 如何讓多個節點對該提案達成共識?

實際情況中,不同節點之間存在通信延遲,任意環節都可能存在故障,如網絡通信中斷、節點故障、信息僞造等。

通常,把出現故障(crash或fail-stop,即不響應)但不會僞造信息的情況稱爲“非拜占庭錯誤(non-byzantine fault)”或“故障錯誤(crash fault)”;僞造信息響應的情況稱爲“拜占庭錯誤(byzantine fault)”,對應節點爲拜占庭節點。

當存在一定信任的前提下(如介入節點可信、節點性能穩定等),達成共識相對容易,共識性能越高;反之,在不可信的場景下,達成共識的成本較高,性能也較差。

2、常見算法

根據解決的場景是否允許拜占庭錯誤情況,共識算法可以分爲 Crash Fault Tolerance (CFT) 和 Byzantine Fault Tolerance(BFT)兩類。

對於非拜占庭錯誤的情況,已經存在不少經典的算法,包括 Paxos(1990 年)、Raft(2014 年)及其變種等。這類容錯算法往往性能比較好,處理較快,容忍不超過一半的故障節點。

對於要能容忍拜占庭錯誤的情況,包括 PBFT(Practical Byzantine Fault Tolerance,1999 年)爲代表的確定性系列算法、PoW(1997 年)爲代表的概率算法等。確定性算法一旦達成共識就不可逆轉,即共識是最終結果;而概率類算法的共識結果則是臨時的,隨着時間推移或某種強化,共識結果被推翻的概率越來越小,最終成爲事實上結果。拜占庭類容錯算法往往性能較差,容忍不超過 1/3 的故障節點。

此外,XFT(Cross Fault Tolerance,2015 年)等最近提出的改進算法可以提供類似 CFT 的處理響應速度,並能在大多數節點正常工作時提供 BFT 保障。

Algorand 算法(2017 年)基於 PBFT 進行改進,通過引入可驗證隨機函數解決了提案選擇的問題,理論上可以在容忍拜占庭錯誤的前提下實現更好的性能(1000+ TPS)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章