區(qū)塊鏈系統(tǒng),首先是一個(gè)分布式系統(tǒng)。首要面臨的問(wèn)題就是一致性的保障。
一致性問(wèn)題
定義
一致性(consistency)是指對(duì)于分布式系統(tǒng)中的多個(gè)節(jié)點(diǎn),給定一系列操作,在約定協(xié)議的保障下,試圖是的它們對(duì)結(jié)果處理達(dá)成"某種程度"的認(rèn)同。
理想情況下,各個(gè)服務(wù)節(jié)點(diǎn)嚴(yán)格遵循相同的處理協(xié)議,構(gòu)成相同的處理狀態(tài)機(jī)制,給定相同的初始狀態(tài)和輸入序列,則可以保障在處理過(guò)程中每個(gè)環(huán)節(jié)的結(jié)果都是相同的(無(wú)論是對(duì)錯(cuò))。
一致性并不代表結(jié)果正確與否,而是系統(tǒng)對(duì)外呈現(xiàn)一致的狀態(tài)。
挑戰(zhàn)
節(jié)點(diǎn)間的通信網(wǎng)絡(luò)是不可靠的,包括消息延遲、亂序、內(nèi)容錯(cuò)誤等
節(jié)點(diǎn)處理時(shí)間無(wú)法保障,結(jié)果會(huì)出現(xiàn)錯(cuò)誤甚至自身宕機(jī)
采用同步可以簡(jiǎn)化這一序列,但會(huì)嚴(yán)重降低分布式系統(tǒng)的可擴(kuò)展性,甚至退化為單點(diǎn)系統(tǒng)。
將可能引發(fā)不一致的并行操作進(jìn)行串行化也成為解決一致性問(wèn)題的基礎(chǔ)思路
一致性要求
分布式系統(tǒng)達(dá)成一致需要滿(mǎn)足:
可終止性(termination): 一致結(jié)果需在有限時(shí)間內(nèi)完成;
約同性(agreement):不同節(jié)點(diǎn)最終完成決策的結(jié)果是相同的
合法性(validity):決策的結(jié)果必須是某個(gè)節(jié)點(diǎn)提出的提案。
可終止性:有限時(shí)間內(nèi)保障服務(wù)可用,完成決策。
約同性:要么不給出結(jié)果,要么給出的結(jié)果必定是達(dá)成了共識(shí)的,保障安全性(safety)
合法性:達(dá)成的結(jié)果必須是節(jié)點(diǎn)執(zhí)行操作的結(jié)果。
一般來(lái)說(shuō)一致性包括:強(qiáng)一致性和最終一致性,對(duì)一致性要求越強(qiáng)往往會(huì)造成越弱的處理性能,以及越差的可擴(kuò)展性。
帶約束的一致性
順序一致性: 一種比較強(qiáng)的約束,保證所有進(jìn)程看到的全局執(zhí)行順序的一致,并且每個(gè)進(jìn)程看到自身的執(zhí)行順序跟實(shí)際發(fā)生順序一致。比如 A->B->C 不能出現(xiàn) A->C->B.
順序一致性限制了各個(gè)進(jìn)程內(nèi)指令的偏序關(guān)系,不同的進(jìn)程間按照物理時(shí)間進(jìn)行全局排序。
線性一致性:在順序一致性前提下加強(qiáng)了進(jìn)程間的操作排序,形成全局唯一順序,通常依賴(lài)于全局的時(shí)鐘或鎖,具有很強(qiáng)的原子性保證。
最終一致性(弱一致性)
由于強(qiáng)一致性比較難實(shí)現(xiàn),實(shí)際中會(huì)適當(dāng)放寬對(duì)一致性的要求,進(jìn)而降低系統(tǒng)實(shí)現(xiàn)的難度。保證系統(tǒng)總會(huì)某一個(gè)時(shí)刻,達(dá)到一致的狀態(tài)。
共識(shí)算法
共識(shí)(consensus)經(jīng)常會(huì)和一致性(consistency)放在一起討論,但兩者含義嚴(yán)謹(jǐn)?shù)刂v并不相同。
一致性:分布式系統(tǒng)中多個(gè)副本對(duì)外呈現(xiàn)數(shù)據(jù)的狀態(tài)。
共識(shí):分布式系統(tǒng)中多個(gè)節(jié)點(diǎn)之間,彼此對(duì)某個(gè)狀態(tài)達(dá)成一致結(jié)果的過(guò)程。
一致性描述的是結(jié)果狀態(tài),共識(shí)則是達(dá)成結(jié)果的一種手段;達(dá)成共識(shí)并不意味著保障了一致性。
含義
共識(shí)算法是對(duì)某個(gè)提案大家達(dá)成一致意見(jiàn)過(guò)程的解決方案。對(duì)分布式系統(tǒng)來(lái)說(shuō),各個(gè)節(jié)點(diǎn)通常是相同的確定性狀態(tài)機(jī)模型(又稱(chēng)狀態(tài)機(jī)復(fù)制問(wèn)題state-machine replication),從相同初始狀態(tài)開(kāi)始接收相同順序的指令,則可以保證相同的結(jié)果狀態(tài)。
挑戰(zhàn)
不同節(jié)點(diǎn)之間通信存在延遲(光速物理限制,通信處理延遲),并且任意環(huán)節(jié)都可能存在故障,比如網(wǎng)絡(luò)中斷、節(jié)點(diǎn)發(fā)生故障、甚至惡意節(jié)點(diǎn)偽造信息等
常見(jiàn)算法
解決兩種類(lèi)型問(wèn)題:
1、非拜占庭錯(cuò)誤(non-byzantine fault)或故障錯(cuò)誤(crash fault): 出現(xiàn)故障(crash)/不響應(yīng)(fail-stop),但不會(huì)偽造信息的情況
2、拜占庭問(wèn)題(Byzantine Fault): 偽造信息惡意響應(yīng)的情況,對(duì)應(yīng)節(jié)點(diǎn)稱(chēng)為拜占庭節(jié)點(diǎn)。
根據(jù)上面解決錯(cuò)誤情況(是否為拜占庭問(wèn)題),共識(shí)算法分為:Crash Fault Tolerance(CFT)類(lèi)算法和Byzantine Fault Tolerance(BFT)類(lèi)算法。
非拜占庭錯(cuò)誤: Paxos、Raft及其變種,此類(lèi)算法容錯(cuò)往往比較好、處理較快,容忍不超過(guò)一半的故障節(jié)點(diǎn)。
容忍拜占庭錯(cuò)誤: PBFT (Practical Byzantine Fault Tolerance ) 為代表的確定性系列算法、 PoW 為代表的概率算法等。確定性算法,一旦達(dá)成對(duì)某個(gè)結(jié)果的共識(shí)就不可逆轉(zhuǎn),共識(shí)即是最終結(jié)果;概率類(lèi)算法,共識(shí)結(jié)果是臨時(shí)的,隨時(shí)間推移或某種強(qiáng)化,共識(shí)結(jié)果被推翻概率越來(lái)越小,成為事實(shí)上的最終結(jié)果。容錯(cuò)性能比較差,容忍不超過(guò)1/3的故障節(jié)點(diǎn)。
實(shí)踐中,一致性的結(jié)果往往還需要客戶(hù)端的額外支持,典型情況如通過(guò)訪 問(wèn) 足夠多個(gè)服務(wù)節(jié)點(diǎn)來(lái)比對(duì)驗(yàn)證,確保獲取共識(shí)后的正確結(jié)果 。