目錄
一、一致性問題
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),
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/254800.html
標籤:區塊鏈
