分布式系統(tǒng)經(jīng)常讓人覺得云山霧罩,主要是因為相關(guān)知識點比較零散不成體系。但別擔心,我很清楚這個有點尷尬的情況。我自學(xué)分布式計算的時候,就有很多次完全摸不著頭腦?,F(xiàn)在,經(jīng)歷過很多次嘗試和死磕之后,我終于有信心可以跟大家分享一下有關(guān)分布式系統(tǒng)的基礎(chǔ)知識了。
我還想討論一下區(qū)塊鏈技術(shù)給分布式相關(guān)的學(xué)術(shù)界和工業(yè)界已然帶來的深遠影響。區(qū)塊鏈促使工程師和科學(xué)家們重新審視和反思那些在分布式計算領(lǐng)域已經(jīng)根深蒂固的范式。也許在對這個領(lǐng)域的研究發(fā)展推動作用上,沒有什么比區(qū)塊鏈技術(shù)更強有力的了。
分布式系統(tǒng)肯定不能算新技術(shù)了??茖W(xué)家和工程師們過去數(shù)十年中一直在研究這個課題。那么區(qū)塊鏈跟分布式系統(tǒng)有什么關(guān)系呢?簡單地說,如果沒有分布式系統(tǒng),也就不可能有區(qū)塊鏈帶來的技術(shù)貢獻。
本質(zhì)上,一條區(qū)塊鏈就是一種新型的分布式系統(tǒng)。區(qū)塊鏈自起源于比特幣以來就一直對分布式計算領(lǐng)域持續(xù)產(chǎn)生影響。所以想真正搞明白區(qū)塊鏈的運行原理,深入理解分布式系統(tǒng)的原理就至關(guān)重要。
但不幸的是,大部分關(guān)于分布式計算的文獻資料,要么太晦澀艱深,要么散布在不計其數(shù)的學(xué)術(shù)論文中。更麻煩的是,分布式系統(tǒng)為了滿足不同的需求,可能有多達上百種不同的架構(gòu)。要把這些都歸納成一個統(tǒng)一且易于理解的框架的確很困難。
因為這個領(lǐng)域涉及知識點太廣,我必須很專注在我力所能及可以講明白的部分。而且我需要一些概括性的描述以便對系統(tǒng)復(fù)雜性進行簡化。請注意,我不會幫你成為這個領(lǐng)域的專家。但我會幫你快速入門分布式系統(tǒng)及其共識機制。
讀完這篇長文之后,你應(yīng)該會對以下內(nèi)容有更深刻的認識:
什么是分布式系統(tǒng),
分布式系統(tǒng)的特性,
分布式系統(tǒng)中的共識意味著什么,
基礎(chǔ)共識算法(比如 DLS 和 PBFT)以及
為什么中本聰共識非常重要。
嗯,不作過多解釋了,快上車。
什么是分布式系統(tǒng)?
一個分布式系統(tǒng)包括一組相互獨立的進程(比如計算機),它們互相傳遞消息并進行協(xié)作以完成一個共同的任務(wù)(比如解決一個計算問題)。
簡單的說,一個分布式系統(tǒng)就是一組計算機,它們互相協(xié)作以完成一個共同的任務(wù)。雖然組成分布式系統(tǒng)的進程是相互獨立的,但整個系統(tǒng)對于終端用戶而言可以看成只是一臺計算機。
像我之前提到的,分布式系統(tǒng)可以有上百種架構(gòu)。比如,一臺普通的計算機也可以看成是一個分布式系統(tǒng):中央處理器,內(nèi)存,輸入輸出都是獨立的進程,互相協(xié)作以完成共同的任務(wù)。
又比如飛機,下圖中的不同組件協(xié)同工作,載你從A點飛到B點:
-圖片來源:WEETECH -
在這篇文章中,我們將重點看看那些由空間上隔離的計算機組成的分布式系統(tǒng)。
-作者制圖-
請注意:我可能會使用若干術(shù)語表達與“”進程”相同的含義:“節(jié)點”(node、peer),“計算機”(computer),“組件”(component)。在這篇文章里它們都是同義詞。類似地,“網(wǎng)絡(luò)”(network)和“系統(tǒng)”(system)在本文中也是同義詞。
分布式系統(tǒng)的特性
每個分布式系統(tǒng)都有一組特性,如下:
A) 并發(fā)性
進程在系統(tǒng)中是并發(fā)運行的,即同一時刻有多個事件發(fā)生。換句話說,任一時刻,系統(tǒng)中每個節(jié)點的事件執(zhí)行都是相互獨立的。
這就需要協(xié)作。
-分布式系統(tǒng)中的時間,時鐘和事件排序,來自 Lamport, L (1978)-
B) 全局時鐘的缺失
分布式系統(tǒng)要能運轉(zhuǎn),我們就需要一個確定事件排序的方法。但是,由于分布式系統(tǒng)中的計算機是空間上隔離且并發(fā)運行的,有時候很難說清楚兩個事件中哪個先發(fā)生。換句話說,對于系統(tǒng)中所有計算機而言,沒有一個統(tǒng)一的全局時鐘來決定事件發(fā)生的順序。
Leslie Lamport 在他的論文《分布式系統(tǒng)中的時間,時鐘和事件排序》里,展示了如何通過以下事實來決定事件的先后順序:
消息總是先發(fā)送,而后被接收。
每臺計算機都有事件的排序。
通過確定事件之間的相對順序(哪個先發(fā)生,哪個后發(fā)生),我們就可以得到關(guān)于系統(tǒng)中事件的一個局部排序(partial ordering)。Lamport 的論文描述了一種算法,要求每臺計算機都監(jiān)聽其它計算機。這樣,所有事件就可以根據(jù)這個局部排序得到全局排序。
但是,如果完全基于每個獨立計算機監(jiān)聽到的事件進行排序,有可能會碰到這種情況:得出的排序與外部用戶的觀察不一致。所以,論文提到該算法仍然無法完全排除異常情況。最后,Lamport 討論了如何通過適當?shù)赝轿锢頃r鐘避免上述異常。
但是,等一下——這里有個很重要的前提:協(xié)調(diào)獨立的時鐘并使之同步是一個非常復(fù)雜的計算機科學(xué)問題。即使你一開始把一堆時鐘調(diào)成同步的狀態(tài),一段時間后它們的計時也會開始產(chǎn)生偏差。這被稱作“時鐘偏移”,是一種時鐘計時頻率發(fā)生細微差別的現(xiàn)象。
實質(zhì)上,Lamport 的論文證明了:在由空間上隔離的一組計算機組成的分布式系統(tǒng)中,時間和事件排序是導(dǎo)致系統(tǒng)可能出錯的障礙根源。
C) 單點可能出錯
理解分布式系統(tǒng)的一個關(guān)鍵點在于認識到,分布式系統(tǒng)中的組件是會出錯的。這也是分布式系統(tǒng)被稱作“容錯分布式計算”的原因。不出錯的系統(tǒng)是不可能存在的。現(xiàn)實當中的系統(tǒng)總是暴露在許多可能的錯誤和故障風(fēng)險之下,這些故障包括程序崩潰;消息丟失、實真、重放;網(wǎng)絡(luò)隔離導(dǎo)致的消息延遲或丟幀;甚至是進程完全失控、惡意發(fā)送消息。
錯誤可以被大致分為三類:
崩潰錯誤:組件沒有預(yù)警就停止工作(比如計算機崩潰了)。
遺漏錯誤:組件發(fā)了一個消息但沒有被別的節(jié)點收到(比如這條消息丟包了)。
拜占庭錯誤:組件不按既定規(guī)則工作。這種類型的錯誤在可控環(huán)境中不會發(fā)生(比如谷歌和亞馬遜的數(shù)據(jù)中心),因為一般認為那種環(huán)境中系統(tǒng)里不會發(fā)生惡意行為。與之相反,拜占庭錯誤會發(fā)生在所謂的“敵對環(huán)境”中。簡單來說,當一組去中心化的獨立參與者作為節(jié)點加入某個分布式網(wǎng)絡(luò)后,這些參與者可以完全不按既定規(guī)則行動,也就是說它們可以惡意地更改消息、攔截消息或者根本不發(fā)送任何消息。
了解上述概念后,那分布式系統(tǒng)的目標就可以定義為:為一個存在可能出錯組件的系統(tǒng)設(shè)計協(xié)議,期望該系統(tǒng)仍然能完成組件的共同任務(wù)并對用戶提供可用的服務(wù)。
考慮到所有的系統(tǒng)都可能會出錯,那我們建立一個分布式系統(tǒng)的核心考量就是,它是否可以在部分組件發(fā)生異常(無論是因為非惡意的行為比如崩潰-出錯或者遺漏錯誤,還是因為惡意行為比如拜占庭錯誤)的情況下繼續(xù)工作。
粗略地說,建立分布式系統(tǒng)有兩種可考慮的模式:
1) 簡單容錯
在一個簡單容錯系統(tǒng)中,我們假設(shè)系統(tǒng)中所有組件都會處于以下兩種狀態(tài)中的一個:要么嚴格遵循協(xié)議工作,要么不遵循。這種類型的系統(tǒng)可以處理節(jié)點下線或者宕機的情況。但是它沒法處理不按既定規(guī)則工作或者惡意工作的節(jié)點。
2A) 拜占庭容錯
簡單容錯系統(tǒng)在非可控環(huán)境中用處不大。在一個節(jié)點由獨立參與者控制,且通過無需權(quán)限的開放互聯(lián)網(wǎng)進行通信的去中心化網(wǎng)絡(luò)里,我們需要考慮到,網(wǎng)絡(luò)中可能出現(xiàn)惡意節(jié)點(或者說“拜占庭式”節(jié)點)。因此,在拜占庭容錯系統(tǒng)中,我們假設(shè)節(jié)點可能會宕機或者作惡。
2B) BAR容錯
盡管大多數(shù)現(xiàn)實系統(tǒng)都被設(shè)計成可以容忍拜占庭錯誤,有些專家認為,這些設(shè)計太過寬泛,并沒有考慮到所謂的“利己性”出錯,即節(jié)點可能因為出于合理的自身利益而采取惡意行為。換句話說,根據(jù)不同的激勵,節(jié)點可能誠實,也可能不誠實。所以如果激勵足夠多,甚至可能大部分節(jié)點都會不誠實。
更正式的定義一下,這就是 BAR 模式-同時考慮了拜占庭出錯和利己性出錯的情況。BAR 模式假設(shè)系統(tǒng)中有下列三種參與者:
拜占庭:這種節(jié)點是惡意的并且就是試圖讓你玩完。
利他:始終遵循系統(tǒng)協(xié)議的誠實節(jié)點。
利己:這類節(jié)點只在遵循協(xié)議有利于自身時才會遵循。
D) 消息傳遞
如我前述,分布式系統(tǒng)總的計算機通過互相之間的“消息傳遞”來溝通和協(xié)作。消息可以通過任何一種消息協(xié)議傳遞,比如 HTTP 或者 RPC,亦或是為特定系統(tǒng)實現(xiàn)的一套定制協(xié)議。有兩種消息傳遞的環(huán)境:
1) 同步
在同步系統(tǒng)中,我們假定消息會在一個固定且已知的時間范圍內(nèi)接收到。
同步消息傳遞在概念上更簡單,因為用戶會有一個時間上的保證:當他們發(fā)送某條消息后,接收方會在一定時間內(nèi)收到它。這就使得用戶可以為他們的協(xié)議設(shè)置一個消息傳遞的耗時上限。
但是,這種假設(shè)在現(xiàn)實生活當中的分布式系統(tǒng)中不切實際:因為組件計算機們可能會崩潰,或者下線,而且消息也可能丟包,重復(fù),延時或者沒有按照發(fā)送順序被接收。
2) 異步
在異步消息傳遞系統(tǒng)中,我們假定系統(tǒng)可能導(dǎo)致某條消息一直被延誤,導(dǎo)致消息重放,或者亂序發(fā)送消息。換句話說,在這種環(huán)境下,消息傳遞的預(yù)期耗時是沒有上限的。
-
分布式
+關(guān)注
關(guān)注
1文章
925瀏覽量
74618 -
分布式系統(tǒng)
+關(guān)注
關(guān)注
0文章
146瀏覽量
19299 -
區(qū)塊鏈
+關(guān)注
關(guān)注
111文章
15563瀏覽量
106739
發(fā)布評論請先 登錄
相關(guān)推薦
分布式軟件系統(tǒng)
分布式控制系統(tǒng)
如何設(shè)計分布式干擾系統(tǒng)?
分布式系統(tǒng)的優(yōu)勢是什么?
分布式軟總線子系統(tǒng)
如何對分布式天線系統(tǒng)(DAS)進行優(yōu)化?
如何高效完成HarmonyOS分布式應(yīng)用測試?
分布式電源分布式電源裝置是指什么?有何特點
分布式系統(tǒng)硬件資源池原理和接入實踐
分布式系統(tǒng)原理與范例 pdf
![<b class='flag-5'>分布式</b><b class='flag-5'>系統(tǒng)</b>原理與范例 pdf](https://file.elecfans.com/web2/M00/48/81/pYYBAGKhtAqALQgpAAAQolvNn3c755.jpg)
如何才能同步分布式系統(tǒng)中的所有時鐘
![如何才能同步<b class='flag-5'>分布式</b><b class='flag-5'>系統(tǒng)</b>中的所有時鐘](https://file.elecfans.com/web1/M00/85/3D/o4YBAFxuOxSAV8eaAABcPKHIINQ475.jpg)
評論