區塊鏈兄弟社區,區塊鏈技術專業問答先行者,中國區塊鏈技術愛好者彙集地算法
做者:吳壽鶴數據庫
來源:區塊鏈兄弟編程
原文連接:http://www.blockchainbrother.com/article/6緩存
著權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。服務器
分佈式系統介紹網絡
長期以來學習掌握分佈式系統的知識很是龐雜混亂,要肯定分佈式系統算法的分類,主要依據是搞清楚算法的各類屬性。例如計時模型timing model; 進程間通信interprocess communication 和失敗模型failure model等等。app
涉及的主要概念包括:異步
1. 定時模型(Timing Model)分佈式
2. 進程間通訊(Interprocess Communication)ide
3. 失效模式(Failure Modes)
4. 失效檢測器(Failure Detectors)
5. 領導人選舉(Leader Election)
6. 共識(Consensus)
7. 法定人數(Quorums)
8. 分佈式系統中的時間
計時模型timing model
計時模型分同步,異步兩種,這幾種模型都有時間計時這個共同特色。
同步模型 在同步分佈式系統中消息傳遞時間的上限是已知的。
異步模型 異步分佈式系統中消息可能在任什麼時候間送達。
在同步分佈式系統中,因爲消息傳遞時間的上限已知,則能夠根據超時來檢測進程故障(非拜占庭故障),大大簡化了分佈式算法的設計,但遺憾的是,大部分實際的分佈式系統每每是異步的,好比互聯網就是異步分佈式系統,若是爲異步分佈式系統中設計分佈式算法,必須意識到消息可能延遲任意長的時間到達。
進程間通信
進程之間是如何通信的,這裏有消息傳遞模型和共享內存模型,前者是經過消息發送通信,後者是訪問內存中共享變量共享數據進行通信。這裏進程有服務器節點的意思,一個進程可能表明分佈式場景的一臺服務器。
消息傳遞最難的是不能發送重複消息,每次只能精確一次傳遞,這裏有不少設計,好比Perfect Links(能夠理解爲進程之間的信道) 抽象能夠保證,可是它不能正常反映現實世界,雖然不真實,可是有用,咱們可使用Perfect Links 證實一個問題不可能被解決,而後咱們就知道其餘相關問題也沒有答案。消息傳遞老是能夠被想象爲FIFO之類隊列或堆棧。
共享內存是咱們編程經常使用的方式,須要在一臺服務器內才能完成。咱們可使用消息傳遞算法完成分佈式狀況下的內存共享對象,好比讀寫註冊器,調用一個服務之間須要查詢這個服務在哪一個服務器上,負載平衡器也是一個讀寫註冊器,是一個全局共享的內存。
在理解基於消息傳遞模型的算法時,還必須弄清楚進程之間是哪種連接(能夠理解爲進程之間的信道)。不一樣種類的連接抽象爲算法提供的保證也不相同。例如,完美連接可以保證消息的可靠送達,不會重複發送消息;它保證消息會且只會一次送達。顯然,現實世界並不是如此。當算法設計者在設計儘可能接近真實的模型時,他們會使用其餘類型的連接抽象。請牢記,即便完美連接並不是那麼真實,它仍然有用。例如,若是咱們能證實,即便連接是完美的咱們也沒法解決某個問題,那麼全部的相關問題也將是不可解的。在討論連接時,研究者一般會假定消息順序是「先入先出」的, Zab 就是一個例子。
失敗模型
進程的失敗模型是分佈式系統模型的一個屬性,它是對進程失效種類的假設。
分佈式模型老是必須考慮進程失敗的狀況,在crash-stop失敗模型中,一個進程假設爲一直是正確,直至它崩潰,一旦它崩潰,就永遠不會恢復;也有crash-recovery 模型,進程可以在失敗之後恢復,在這種狀況下,一些算法來保證進程恢復到其失敗以前的狀態,這能夠經過從持久層讀取狀態完成,或者經過和一個集羣小組中的其餘進程通信方式完成。注意這裏有不一樣集羣組算法,一個進程崩潰後,恢復其狀態的進程不會再被認爲是以前一樣的進程,這取決於動態組仍是固定組這兩種算法。
失敗模型也包括:一個進程若是沒法接受和發送消息,被稱爲遺漏omission failure mode,遺漏模型也有不一樣種類,一個進程沒法接受和發送消息很重要嗎?想象一組進程實現一個分佈式緩存,若是一個進程沒法回覆同一組的其餘進程,即便可以接受來自它們的請求,這也意味着這個進程可以接受外部消息更新本身的狀態,其實也就意味着它能回覆來自客戶端的讀請求,也就是說,雖然它本身不能主動回覆客戶端的請求,可是能夠接受客戶端的主動讀取請求。
一個複雜失敗模型是拜占庭Byzantine 或稱爲任意失敗模型,進程會發送錯誤信息到對方,它們會模仿發送正確數據,可是實際已經篡改了本地數據庫的內容。
設計分佈式系統時,咱們須要對付這些失敗模型。
失敗探測
有了定時模型和進程失效模式的假設,咱們就能夠構建報告系統狀態的抽象——失敗檢測器,即檢測某個進程是否已經崩潰,或者懷疑這個進程已經崩潰。完美失效檢測器從不虛報進程失效。
咱們但願在進程崩潰失敗時及時發現,好比crash-stop失敗模型加上同步系統,咱們可以使用timeout;若是咱們按期讓進程ping到一個專門的失敗探測器,咱們就能精確知道那個進程是否正常,若是過了timeout時間沒有Ping訪問,那麼咱們就能夠認爲那臺進程服務器崩潰了。
更真實狀況是,假設一個消息到達目標須要肯定的時間,肯定好一個進程執行一個步驟須要多長時間,那麼就可使用timeout進行衡量計算。
失敗模型探測有兩個屬性策略:
1. Strong Completeness強完整性:每一個失敗的進程會永久被其餘正確進程懷疑。
2. Eventual Strong Accuracy最終強精確度,沒有一個進程被任何正確的進程懷疑。
失敗檢測器是異步模型中解決共識問題的關鍵。在 FLP 論文中,提出了不少著名的不可能性結果。這篇論文指出,在異步的分佈式系統中,若是進程有可能失效,那麼就不可能達成共識。要達成共識,就必須爲系統引入一個可以規避上述問題的失效檢測器。
當一個進程被其餘進程懷疑時,這些進程就不可能達成共識consensus ,而在分佈式系統中使用異步模型是必需要達成共識,也就是每一個進程內部狀態經過異步消息傳遞後,最終其餘進程的狀態會和最初發送消息的那個進程內部狀態一致,這稱爲達成共識,可是由於有進程存在失敗崩潰的可能,因此,在這個達成共識的消息傳遞過程當中,如何確保進程之間的信任,不懷疑對方,從而確保消息傳遞成功,那麼引入失敗探測器是能夠規避這個問題的。
領導人選舉LEADER ELECTION
與失敗檢測相反的一個問題是,如何斷定一個進程沒有崩潰,它所以可以正確地工做。網絡中其餘進程會信賴這個進程,把它看成可以協調分佈式行動的領導人。像 Raft 或者 Zab 這樣的協議就依賴領導人進程來協調行動。
這種機制會致使瓶頸集中在領導人那裏,並且以前還須要領導人選舉,這些多餘過程多是咱們不須要的。
一致共識CONSENSUS
共識(consensus 或 agreement)問題是由 Pease , Shostak 和 Lamport 在論文「在存在失效的狀況下達成一致」首先提出來的。他們是這麼描述的:
「容錯系統一般要求提供一種手段,使得獨立的處理器或者進程可以達成某種精確的相互一致。例如,一個冗餘系統的多個處理器可能須要按期同步它們的內部時鐘。或者每一個處理從某個時變的輸入傳感器讀取的數值都有稍微不一樣,它們須要肯定一個統一的值。」
共識是在獨立進程之間達成一致的統一意見,這些進程會就某個問題建議一個數值,基於這個推薦的值會贊成採起一致行動。
一個進程實現共識是經過暴露帶有推薦和決定功能的API實現的,一個進程會推薦數值,由此開始共識,而後它得基於一個數值決定,這個數值是在整個系統中被推薦了的,這些算法包括:Termination, Validity, Integrity 和Agreement.
1. Termination: 每一個正確的進程最終會決定某個數值。
2. Validity: 若是一個進程決定了v,那麼v會被其餘進程推薦。
3. Integrity: 沒有進程可以決定兩次
4. Agreement: 沒有兩個正確進程有不一樣的決定。
法定人數QUORUMS
Quorums 是一個設計失敗容錯分佈式系統的工具,當系統存在crash-failure模型時,老是有一個法定人數表明大多數意見從而進行決策的,由於崩潰失敗的老是少數。
好比有N個進程服務器,假設崩潰的進程是少數,好比N/2-1個進程崩潰,也就是49%的進程崩潰,咱們仍是有51%的會投同意票。Raft協議使用的是這種大多數策略,根據提交到系統的日誌來判斷,
分佈式系統的時間
理解時間和其致使的因果是分佈式系統的大問題,咱們一般用事件這個概念表明生活中發生的那些事實,使用happened before順序約束定義這些事件,可是咱們有不少進程交換信息,共同訪問共享資源等等,咱們如何告訴某個進程事件的happened before策略呢?也就是誰在前誰在後的順序呢?爲了回答這個問題,進程須要共享一個同步的時鐘,精確知道它在網絡間移動花費多長時間?包括CPU調度任務的時間等等,顯然這在真實世界是不可能實現的。
Time, Clocks, and the Ordering of Events in a Distributed System這篇論文引入了邏輯時鐘概念,邏輯時鐘是一個分配一個數字給事件的方式,也就是說,這些數字不是和實際時間有關,可是和一個節點的進程事件有關。
有各類邏輯時鐘,好比 Vector Clocks向量時鐘或 Interval Tree Clocks.
理解分佈式時間問題,必須理解一個重要概念:同時性這個想法有時咱們必須放棄(The idea of simultaneity is something we have to let go.),這是有關「絕對知識」等舊哲學信條的問題,他們認爲絕對知識是能夠到達的,其實人的認識是相對,永遠不可能到達真正事物本質,你覺得的同時性並非真正同時性,光線也是有速度的,即便最快的光線也是須要時間才從一個地方到達另一個地方。可見Inventing the Enemy發明敵人 一書中的「絕對與相對」。
文章發佈只爲分享區塊鏈技術內容,版權歸原做者全部,觀點僅表明做者本人,毫不表明區塊鏈兄弟贊同其觀點或證明其描述