區(qū)塊鏈系統(tǒng)厘贼,首先是一個分布式系統(tǒng)界酒。首要面臨的問題就是一致性的保障。
一致性問題
定義
一致性(consistency)是指對于分布式系統(tǒng)中的多個節(jié)點嘴秸,給定一系列操作毁欣,在約定協(xié)議的保障下,試圖是的它們對結(jié)果處理達(dá)成"某種程度"的認(rèn)同。
理想情況下岳掐,各個服務(wù)節(jié)點嚴(yán)格遵循相同的處理協(xié)議凭疮,構(gòu)成相同的處理狀態(tài)機(jī)制,給定相同的初始狀態(tài)和輸入序列岩四,則可以保障在處理過程中每個環(huán)節(jié)的結(jié)果都是相同的(無論是對錯)哭尝。
一致性并不代表結(jié)果正確與否,而是系統(tǒng)對外呈現(xiàn)一致的狀態(tài)剖煌。
挑戰(zhàn)
節(jié)點間的通信網(wǎng)絡(luò)是不可靠的材鹦,包括消息延遲逝淹、亂序、內(nèi)容錯誤等
節(jié)點處理時間無法保障桶唐,結(jié)果會出現(xiàn)錯誤甚至自身宕機(jī)
采用同步可以簡化這一序列栅葡,但會嚴(yán)重降低分布式系統(tǒng)的可擴(kuò)展性,甚至退化為單點系統(tǒng)尤泽。
將可能引發(fā)不一致的并行操作進(jìn)行串行化也成為解決一致性問題的基礎(chǔ)思路
一致性要求
分布式系統(tǒng)達(dá)成一致需要滿足:
可終止性(termination): 一致結(jié)果需在有限時間內(nèi)完成欣簇;
約同性(agreement):不同節(jié)點最終完成決策的結(jié)果是相同的
合法性(validity):決策的結(jié)果必須是某個節(jié)點提出的提案。
可終止性:有限時間內(nèi)保障服務(wù)可用坯约,完成決策熊咽。
約同性:要么不給出結(jié)果,要么給出的結(jié)果必定是達(dá)成了共識的闹丐,保障安全性(safety)
合法性:達(dá)成的結(jié)果必須是節(jié)點執(zhí)行操作的結(jié)果横殴。
一般來說一致性包括:強(qiáng)一致性和最終一致性,對一致性要求越強(qiáng)往往會造成越弱的處理性能卿拴,以及越差的可擴(kuò)展性衫仑。
帶約束的一致性
順序一致性: 一種比較強(qiáng)的約束,保證所有進(jìn)程看到的全局執(zhí)行順序的一致堕花,并且每個進(jìn)程看到自身的執(zhí)行順序跟實際發(fā)生順序一致文狱。比如 A->B->C 不能出現(xiàn) A->C->B.
順序一致性限制了各個進(jìn)程內(nèi)指令的偏序關(guān)系,不同的進(jìn)程間按照物理時間進(jìn)行全局排序缘挽。
線性一致性:在順序一致性前提下加強(qiáng)了進(jìn)程間的操作排序瞄崇,形成全局唯一順序,通常依賴于全局的時鐘或鎖到踏,具有很強(qiáng)的原子性保證杠袱。
最終一致性(弱一致性)
由于強(qiáng)一致性比較難實現(xiàn),實際中會適當(dāng)放寬對一致性的要求窝稿,進(jìn)而降低系統(tǒng)實現(xiàn)的難度楣富。保證系統(tǒng)總會某一個時刻,達(dá)到一致的狀態(tài)。
共識算法
共識(consensus)經(jīng)常會和一致性(consistency)放在一起討論伴榔,但兩者含義嚴(yán)謹(jǐn)?shù)刂v并不相同纹蝴。
一致性:分布式系統(tǒng)中多個副本對外呈現(xiàn)數(shù)據(jù)的狀態(tài)。
共識:分布式系統(tǒng)中多個節(jié)點之間踪少,彼此對某個狀態(tài)達(dá)成一致結(jié)果的過程塘安。
一致性描述的是結(jié)果狀態(tài),共識則是達(dá)成結(jié)果的一種手段援奢;達(dá)成共識并不意味著保障了一致性兼犯。
含義
共識算法是對某個提案大家達(dá)成一致意見過程的解決方案。對分布式系統(tǒng)來說,各個節(jié)點通常是相同的確定性狀態(tài)機(jī)模型(又稱狀態(tài)機(jī)復(fù)制問題state-machine replication)切黔,從相同初始狀態(tài)開始接收相同順序的指令砸脊,則可以保證相同的結(jié)果狀態(tài)。
挑戰(zhàn)
不同節(jié)點之間通信存在延遲(光速物理限制纬霞,通信處理延遲)凌埂,并且任意環(huán)節(jié)都可能存在故障,比如網(wǎng)絡(luò)中斷诗芜、節(jié)點發(fā)生故障瞳抓、甚至惡意節(jié)點偽造信息等
常見算法
解決兩種類型問題:
1、非拜占庭錯誤(non-byzantine fault)或故障錯誤(crash fault): 出現(xiàn)故障(crash)/不響應(yīng)(fail-stop),但不會偽造信息的情況
2伏恐、拜占庭問題(Byzantine Fault): 偽造信息惡意響應(yīng)的情況孩哑,對應(yīng)節(jié)點稱為拜占庭節(jié)點。
根據(jù)上面解決錯誤情況(是否為拜占庭問題)翠桦,共識算法分為:Crash Fault Tolerance(CFT)類算法和Byzantine Fault Tolerance(BFT)類算法臭笆。
非拜占庭錯誤: Paxos、Raft及其變種秤掌,此類算法容錯往往比較好、處理較快鹰霍,容忍不超過一半的故障節(jié)點闻鉴。
容忍拜占庭錯誤: PBFT (Practical Byzantine Fault Tolerance ) 為代表的確定性系列算法、 PoW 為代表的概率算法等茂洒。確定性算法孟岛,一旦達(dá)成對某個結(jié)果的共識就不可逆轉(zhuǎn),共識即是最終結(jié)果督勺;概率類算法渠羞,共識結(jié)果是臨時的,隨時間推移或某種強(qiáng)化智哀,共識結(jié)果被推翻概率越來越小次询,成為事實上的最終結(jié)果。容錯性能比較差瓷叫,容忍不超過1/3的故障節(jié)點屯吊。
實踐中,一致性的結(jié)果往往還需要客戶端的額外支持摹菠,典型情況如通過訪 問 足夠多個服務(wù)節(jié)點來比對驗證盒卸,確保獲取共識后的正確結(jié)果 。