如何在分布式系統(tǒng)中實(shí)現(xiàn)容錯(cuò)
分布式系統(tǒng)是實(shí)現(xiàn)高可伸縮性,局部性和可用性的基本概念。然而,另一方面,當(dāng)從客戶端查看時(shí),整個(gè)系統(tǒng)需要很多獨(dú)創(chuàng)性才能看起來一致。另外,據(jù)說構(gòu)建具有完整特征的分布式系統(tǒng)幾乎是不可能的,并且有必要選擇應(yīng)用程序應(yīng)該強(qiáng)調(diào)哪些性能。
除了描述這些分布式系統(tǒng)的特性外,我們還描述了具有高性能的區(qū)塊鏈的特性。最后,通過總結(jié)容錯(cuò)屬性,我們將進(jìn)一步探索區(qū)塊鏈的更大潛力,并希望通過討論每個(gè)高級(jí)區(qū)塊鏈項(xiàng)目(如Tendermint)全面解釋MOLD應(yīng)該瞄準(zhǔn)的系統(tǒng)。
1. 簡(jiǎn)介(容錯(cuò)概述以及總體流程)
與單個(gè)系統(tǒng)不同,分布式系統(tǒng)存在部分故障。單個(gè)系統(tǒng)的整體故障往往會(huì)導(dǎo)致整個(gè)系統(tǒng)崩潰。另一方面,在部分故障中,系統(tǒng)可以在從部分故障中恢復(fù)的同時(shí)繼續(xù)操作而不會(huì)嚴(yán)重影響整體性能。
在本文中,按照以下順序,我們將解釋容錯(cuò);即使系統(tǒng)的一部分發(fā)生故障,系統(tǒng)也可以繼續(xù)處理。
?什么樣的屬性是容錯(cuò)的
?什么樣的失敗以及它們?nèi)绾伪环诸?/p>
?關(guān)于溝通失敗
?“可靠的多播”,增加了進(jìn)程的抵抗力
?關(guān)于分布式提交問題
2. 什么是容錯(cuò)?
容錯(cuò)
容錯(cuò)定義如下
即使發(fā)生故障也能夠忍受服務(wù)
另外,具有容錯(cuò)性的系統(tǒng)有時(shí)被稱為高可靠性系統(tǒng),并且與可靠性系統(tǒng)相關(guān)的要求分為以下四種。
失敗模型
分布式系統(tǒng)中進(jìn)程的典型故障如下:
通信鏈路的故障也是分類的。
例如,對(duì)于分布式的失敗,可能會(huì)發(fā)生虛假消息的傳遞,因此最難以處理。
冗余可以隱藏故障。這很容易理解,例如考慮到哺乳動(dòng)物有兩只眼睛,耳朵和肺。即使這些分布式器官中的一些失效,你也可以在隱藏故障的同時(shí)使用該系統(tǒng)。這稱為物理冗余。冗余有三種類型:信息冗余,時(shí)間冗余和物理冗余。
3. 流程彈性
在描述容錯(cuò)之后,我們考慮如何實(shí)現(xiàn)容錯(cuò)。
進(jìn)程復(fù)制
典型的方法是進(jìn)程復(fù)制。在組中創(chuàng)建(復(fù)制)相同的進(jìn)程稱為復(fù)制。通過在分布式系統(tǒng)中復(fù)制,即使在部分故障的情況下,也可以通過正常過程提供服務(wù)。我們將復(fù)制過程稱為副本。
復(fù)用(復(fù)制)有兩種方法如下。
?主基礎(chǔ)協(xié)議(被動(dòng)復(fù)制)
?重復(fù)寫入?yún)f(xié)議(PositiveReplicaTIon)
在前的中,只有主副本處理來自客戶端的消息,而其他副本備份主進(jìn)程。雖然復(fù)制品之間的處理結(jié)果沒有不一致,并且通信功能的實(shí)現(xiàn)更容易,但是主復(fù)制品的故障需要選擇算法,并且處理有些復(fù)雜。
在后一種情況下,所有副本都會(huì)從客戶端接收和處理消息。此時(shí),基于消息的處理需要總排序和原子性的兩個(gè)屬性。因此,原子多播需要更復(fù)雜的通信功能。
k容錯(cuò)
在重復(fù)寫入?yún)f(xié)議中,據(jù)說具有k個(gè)容錯(cuò),即使它們失敗,k個(gè)組件也能正常移動(dòng)。如果你有分布式故障,則至少需要2k+1個(gè)進(jìn)程才能具有k容錯(cuò)能力。
原子組播問題
作為上述復(fù)制模型的前提,存在所有請(qǐng)求必須以相同順序到達(dá)所有服務(wù)器的條件。這稱為原子多播問題。這將在第5章中詳細(xì)討論。
流程之間的協(xié)議
進(jìn)程之間協(xié)議的問題對(duì)于賦予分布式系統(tǒng)容錯(cuò)性是至關(guān)重要的。分布式協(xié)議算法的目的是在有限數(shù)量的步驟中達(dá)成共識(shí),以實(shí)現(xiàn)彼此之間沒有失敗的過程,并且在代表性過程中存在一般分布式的問題。
分布式的一般問題
在具有k個(gè)錯(cuò)誤進(jìn)程的系統(tǒng)中,僅當(dāng)存在2k+1個(gè)或更多正常進(jìn)程并且整體上存在N=《 3k+1個(gè)進(jìn)程時(shí)才達(dá)成協(xié)議。換句話說,只有超過三分之二的進(jìn)程正常工作才能達(dá)成協(xié)議。(如果小于該值,則可能會(huì)因失敗的過程而受到欺騙。)
附錄:關(guān)于容錯(cuò)所需的正常節(jié)點(diǎn)數(shù)
對(duì)于許多協(xié)議,具有分布式阻塞的最大允許節(jié)點(diǎn)數(shù)被稱為1/3。原因?qū)⒃谙旅婧?jiǎn)要描述。
設(shè)“N”為節(jié)點(diǎn)總數(shù),“F”為分布式節(jié)點(diǎn),“T”為正常共識(shí)所需的節(jié)點(diǎn)數(shù)。
例如,假設(shè)“N-F”的正常節(jié)點(diǎn)被分成相同的數(shù)字,并且數(shù)字表示如下。
(N-F) / 2
由于“F”的分布式節(jié)點(diǎn)具有任意行為,為了正常地達(dá)成共識(shí),必須滿足以下表達(dá)式。
T 》 (N-F)/2 + F ???①
此外,考慮到F的所有分布式節(jié)點(diǎn)都處于離線狀態(tài)的情況,其他正常節(jié)點(diǎn)可以采用共識(shí),因此以下表達(dá)式成立。
N-F ≥ T ???②
從①·②,
N?F 》 (N?F)/2 + F
∴F 《 N3
基于上述,當(dāng)總節(jié)點(diǎn)中分布式節(jié)點(diǎn)的數(shù)量小于1/3時(shí),可以正常地達(dá)成共識(shí)。
4.可靠的客戶端-服務(wù)器通信
到目前為止,我們討論了分布式系統(tǒng)中進(jìn)程的容錯(cuò)能力,并了解了復(fù)制。本章討論了通信鏈路上容錯(cuò)的介紹。
P2P通信
分布式系統(tǒng)中的通信基礎(chǔ)是連接一個(gè)進(jìn)程和另一個(gè)進(jìn)程的點(diǎn)對(duì)點(diǎn)通信(一對(duì)一通信)。
TCP
TCP:實(shí)現(xiàn)可靠通信的點(diǎn)對(duì)點(diǎn)通信
TCP具有序列號(hào),定時(shí)器,校驗(yàn)和,確認(rèn),重傳控制,擁塞控制等機(jī)制。例如,由于丟失消息而導(dǎo)致的遺漏失敗可以通過包括TCP序列號(hào)的確認(rèn)和基于確認(rèn)的重傳控制來處理。
發(fā)生故障時(shí)的RPC(遠(yuǎn)程過程調(diào)用)
RPC的目的是通過本地過程調(diào)用的形式實(shí)現(xiàn)進(jìn)程間通信而不需要意識(shí)到通信部分。在使用RPC的分布式系統(tǒng)中可能會(huì)發(fā)生五個(gè)障礙。
1. 客戶端無法找到服務(wù)器。
2. 從客戶端到服務(wù)器的請(qǐng)求消息將丟失。
3. 收到請(qǐng)求后服務(wù)器崩潰。
4. 從服務(wù)器到客戶端的響應(yīng)消息將丟失。
5. 在客戶端發(fā)送請(qǐng)求消息后發(fā)生故障。
作為對(duì)每個(gè)的對(duì)策,存在設(shè)置異常處理和計(jì)時(shí)器(時(shí)間限制)的方法。
5.可靠的團(tuán)隊(duì)溝通
我們?cè)谇耙徽轮袑W⒂谝粚?duì)一通信,因此我們?cè)诖私忉屢粚?duì)多多播通信的高可靠性。在分布式系統(tǒng)中,重要的是發(fā)送消息而不會(huì)泄漏,包括訂單到彼此的服務(wù)器。
在沒有故障的情況下可靠的多播
考慮按順序向每個(gè)成員發(fā)送消息。
發(fā)送方首先將多播消息保存在手頭的歷史存儲(chǔ)器中。此外,發(fā)送方從接收方接收傳輸確認(rèn)通知(ACK)。在ACK中,輸入并返回最后一個(gè)消息標(biāo)識(shí)符已完成傳輸。如果由于消息丟失等而無法接收到包含預(yù)期標(biāo)識(shí)符的ACK,則發(fā)送方重新發(fā)送該消息。
確保來自發(fā)件人的郵件以相同的順序傳遞給所有進(jìn)程。
在分布式系統(tǒng)中,不是“一個(gè)過程”
具有“何時(shí)”發(fā)送方“在消息傳遞期間失敗,該消息被傳遞到所有剩余進(jìn)程或被忽略”的屬性的可靠多播稱為虛擬同步。
此外,作為虛擬同步并以總順序執(zhí)行消息傳遞的通信稱為原子多播。
虛擬同步的一個(gè)實(shí)現(xiàn)示例是Isis。Isis保留并轉(zhuǎn)移mmessageM進(jìn)行處理,直到它知道所有成員都收到了消息M.
6.分布式提交
推廣原子多播問題的問題稱為分布式提交問題。
原子提交
有必要終始如一地判斷不同的類似站點(diǎn)的進(jìn)程是否一致地提交或中止。這種操作稱為原子提交。
6–1.兩階段提交協(xié)議(2PC)
兩階段提交協(xié)議(2PC)是實(shí)現(xiàn)原子提交的典型方法。顧名思義,每個(gè)階段包括兩個(gè)步驟,組織如下。
(第1階段【投票階段】)
組織者向所有參與者發(fā)送VOTE_REQUEST消息
2. 收到VOTE_REQUEST消息的參與者如果能夠提交其交易并通過發(fā)送VOTE_ABORT消息進(jìn)行投票(如果需要中止),則向組織者發(fā)送VOTE_COMMT消息。
(第2階段[提交階段])
3. 組織者收集所有參與者的投票。如果所有投票都是COMMIT,我們自己承諾并向所有參與者發(fā)送GLOBAL_COMMIT消息。如果ABORT甚至多于一個(gè),它決定中止交易并發(fā)送GLOBAL_ABORT消息。
4.參與者等待來自組織者的消息,如果它是GLOBAL_COMMIT本地,則提交,如果它是GLOBAL_ABORT則丟棄該交易。
在整個(gè)過程中,組織者和參與者進(jìn)行如下狀態(tài)轉(zhuǎn)換。
阻止提交協(xié)議
上述兩階段提交協(xié)議存在很大問題。當(dāng)組織者在階段3中失敗并且所有參與者都在等待來自組織者的消息時(shí)。,參與者不能合作決定應(yīng)該最終采取的行動(dòng)決定。據(jù)此,兩階段提交被稱為阻塞提交協(xié)議。
實(shí)際上,在兩階段提交中阻塞自身很少發(fā)生,因此它沒有被大量使用,但是設(shè)計(jì)了三階段提交協(xié)議作為避免阻塞的解決方案。
6–2.三階段提交
與兩階段提交協(xié)議不同,三階段提交協(xié)議滿足以下兩個(gè)條件。[Skeen和Stonebraker,1983]指出,這兩個(gè)條件對(duì)于沒有阻塞的提交協(xié)議是必要和充分的。
1. 沒有直接進(jìn)入COMMIT狀態(tài)或ABORT狀態(tài)的情況。
2. 沒有可能做出最終決定,也沒有轉(zhuǎn)換到COMMIT狀態(tài)的狀態(tài)。
SKEEN,D.andSTONEBRAKER,M”AFormalModelofCrashRecoveryinaDistributedSystem.”IEEETrans.Softw.Eng.,Mar.1983
具體地,在兩階段提交的兩個(gè)階段之間提供PRECOMMIT狀態(tài)。
整個(gè)參與者和組織者改變狀態(tài)如下。
兩階段提交的最大區(qū)別是所有進(jìn)程都返回INIT,ABORT,PRECOMMIT狀態(tài)。由于它永遠(yuǎn)不會(huì)處于READY狀態(tài),因此剩余的進(jìn)程始終做出最終決定,并且可以充當(dāng)非阻塞協(xié)議。
三階段提交僅僅是一個(gè)概念表示,即使組織者失敗,也沒有正常工作的機(jī)制。然而,在區(qū)塊鏈出現(xiàn)之后,它的歷史將會(huì)發(fā)生很大變化。Tendermint項(xiàng)目通過在區(qū)塊鏈中采用三階段提交來實(shí)現(xiàn)非阻塞協(xié)議。
7.區(qū)塊鏈中的容錯(cuò)
最后,基于上述內(nèi)容,我們還將參考分布式區(qū)塊鏈系統(tǒng)中的容錯(cuò)。
7–1.區(qū)塊鏈容錯(cuò)
區(qū)塊鏈的容錯(cuò)性很高。讓我們根據(jù)第2章中分類的四個(gè)可靠性要求,仔細(xì)研究區(qū)塊鏈的性質(zhì)。
區(qū)塊鏈系統(tǒng)停止運(yùn)行的時(shí)間和數(shù)量很少。特別是在比特幣網(wǎng)絡(luò)中,可以說很少有高可用性和可靠性,因?yàn)榧词鼓承┕?jié)點(diǎn)出現(xiàn)故障,它也能實(shí)現(xiàn)零停機(jī)并繼續(xù)正常運(yùn)行。
接下來,關(guān)于安全性,當(dāng)系統(tǒng)在區(qū)塊鏈網(wǎng)絡(luò)中不能正常運(yùn)行時(shí),將出現(xiàn)諸如“交易未被處理和阻塞”,“網(wǎng)絡(luò)中的節(jié)點(diǎn)之間不共享信息以及分叉的分塊”之類的問題。后者極有可能導(dǎo)致重大麻煩。
關(guān)于可維護(hù)性,可以說社區(qū)很容易劃分,比如像比特幣這樣的公共區(qū)塊鏈,并且難以從中恢復(fù)。比特幣網(wǎng)絡(luò)可以高度贊賞,因?yàn)樗哂懈呖捎眯院涂煽啃裕虼瞬恍枰謴?fù),但如果你希望具有可維護(hù)性,則應(yīng)考慮選擇私有鏈或聯(lián)盟鏈。
此外,區(qū)塊鏈非常有意義,因?yàn)樗鼮榉植际綌鄬犹峁┝擞行У慕鉀Q方案,這被認(rèn)為是最難處理的。具體來說,它是以PoW等為代表的一致性算法……通過形成激勵(lì)結(jié)構(gòu)來處理分布式的一般問題;通過維持/貢獻(xiàn)而不是基于博弈論破壞網(wǎng)絡(luò)的行動(dòng),礦工凸輪獲得更多利潤(rùn)的算法。應(yīng)該注意的是,諸如硬叉之類的新問題正在發(fā)生,然而,可以說它已經(jīng)取得了一定的成功。此外,
Hyperledger采用的PBFT也通過設(shè)置領(lǐng)導(dǎo)節(jié)點(diǎn)確認(rèn)投票來實(shí)現(xiàn)高分布式容錯(cuò)。
7–2.Blcokchain流程彈性
考慮如何在容錯(cuò)描述之后實(shí)現(xiàn)容錯(cuò)。
首先,有兩種處理復(fù)制的方法。
1.主要基礎(chǔ)協(xié)議
2.重復(fù)寫入?yún)f(xié)議
采用1的主基礎(chǔ)協(xié)議的主要協(xié)議是基于PoW一致性算法的區(qū)塊鏈。在PoW的情況下,它是主要基礎(chǔ)中的本地寫協(xié)議的規(guī)范。成功找到PoW的nonce值作為獨(dú)占控件(領(lǐng)導(dǎo)者選擇算法)的礦工獲得了將區(qū)塊添加為主服務(wù)器的權(quán)利。但是,當(dāng)有權(quán)成為主服務(wù)器的節(jié)點(diǎn)同時(shí)出現(xiàn)時(shí),區(qū)塊鏈會(huì)分叉。
另一方面,采用2的重復(fù)寫協(xié)議的是基于PBFT的區(qū)塊鏈。包括Tendermint在內(nèi)的各種基于PBFT的共識(shí)算法沒有主要服務(wù)器首先負(fù)責(zé)地執(zhí)行每個(gè)數(shù)據(jù)的更新,并且所有參與節(jié)點(diǎn)可以在同一時(shí)段執(zhí)行寫操作。也就是說,可以說PBFT類型一致性協(xié)議類似于重復(fù)寫入類型的活動(dòng)復(fù)制協(xié)議。
7–3.區(qū)塊鏈高可靠性通信
我已經(jīng)提到了區(qū)塊鏈的過程,但這次我將重點(diǎn)關(guān)注通信鏈接。
在區(qū)塊鏈中,參與網(wǎng)絡(luò)的每個(gè)節(jié)點(diǎn)執(zhí)行P2P通信并共享數(shù)據(jù)。另外,由領(lǐng)導(dǎo)者選擇算法選擇的主服務(wù)器執(zhí)行多播,以便例如在找到隨機(jī)數(shù)時(shí)將新添加的 區(qū)塊的信息共享給每個(gè)參與節(jié)點(diǎn)。此時(shí),考慮到在通信鏈路或節(jié)點(diǎn)中發(fā)生故障的情況,重要的是實(shí)現(xiàn)原子多播,其是虛擬同步并且以總的順序執(zhí)行消息傳遞。
那么,區(qū)塊鏈中的原子多播問題和分布式提交問題是如何解決的呢?
在采用比特幣等PoW的公共鏈中,原子多播尚未實(shí)現(xiàn)。因此,可能會(huì)發(fā)生頻繁的叉子。由于每個(gè)節(jié)點(diǎn)隨時(shí)間正確地共享數(shù)據(jù),因此建立了一致性,但確認(rèn)交易存儲(chǔ)在區(qū)塊中需要10分鐘以上。
在這里,我們要關(guān)注Tendermint一致性算法。通常,存在2PC(兩階段提交)作為實(shí)現(xiàn)原子提交的方法,并且已經(jīng)提出了作為改進(jìn)版本的3PC方法,但兩者都是不完整的。因此,Tendermint通過將區(qū)塊鏈與3PC方法混合并在循環(huán)方法下在節(jié)點(diǎn)上添加約束來實(shí)現(xiàn)原子提交。下一章將解釋這個(gè)創(chuàng)新分布式提交問題的方法。
7–4.Tendermint中的分布式提交(創(chuàng)新的三階段提交模型)
首先,Tendermint是PBFT類型。在Hyperledger中,作為領(lǐng)導(dǎo)者的驗(yàn)證者始終是相同的過程,但是Tendermint具有領(lǐng)導(dǎo)者選擇算法,并且通過循環(huán)法確定性地確定領(lǐng)導(dǎo)者。領(lǐng)導(dǎo)者共同提出存儲(chǔ)在mempool中的下一個(gè)交易塊。有了這個(gè)提議,Tendermint共識(shí)實(shí)現(xiàn)了3PC(三階段提交)并實(shí)現(xiàn)了原子組播。Tendermint一致性算法可以大致分為三種狀態(tài)。
1. PROPOSE
通過基于樁數(shù)的領(lǐng)導(dǎo)者選擇算法通過循環(huán)法確定性地選擇的驗(yàn)證器集的提議。在這種狀態(tài)下開始投票。
2. PRE-VOTE
擬議區(qū)塊的第一次投票。一旦獲得三分之二或更多的批準(zhǔn),我們將繼續(xù)進(jìn)行下一步,但要等到收集所有選票的限制時(shí)間。由于這個(gè)時(shí)間限制,可以說Tendermint是部分異步一致性算法。此外,該投票算法具有1/3k的容錯(cuò)能力。
3. PRE-COMMIT
在預(yù)投票中超過2/3的同意第二次投票。此時(shí),如下所述,當(dāng)未收集2/3或更多的投票時(shí),Tendermint的智能部分是一種衡量標(biāo)準(zhǔn)。
如前所述,通過為三階段提交設(shè)置PRECOMMIT階段,如果滿足以下條件,則可以實(shí)現(xiàn)阻塞協(xié)議。
1. 沒有直接轉(zhuǎn)換為COMMIT狀態(tài)或ABORT狀態(tài)的狀態(tài)
2. 沒有可能做出最終決定,也沒有轉(zhuǎn)換到COMMIT狀態(tài)的狀態(tài)。
在Tendermint中,在第二個(gè)投票階段投票的驗(yàn)證者Pre-Commit被鎖定,并且只能在預(yù)投票中投票獲得超過2/3票數(shù)的鎖定區(qū)塊或區(qū)塊。通過鎖定處理,滿足上述兩個(gè)條件。換句話說,由于每個(gè)驗(yàn)證器始終只能在預(yù)先提交中對(duì)一個(gè)塊進(jìn)行投票,因此它不會(huì)實(shí)現(xiàn)分叉機(jī)制。
換句話說,“Tendermint共識(shí)是確保添加區(qū)塊的操作在網(wǎng)絡(luò)中的所有節(jié)點(diǎn)上完成,或者根本沒有節(jié)點(diǎn)完成;實(shí)現(xiàn)最終結(jié)果的下一代共識(shí)協(xié)議。