初遇分散式系統(二)
《好玩又實在的分散式系統理論》的第二部分主要分析抽象的分散式系統模型並提出問題.
抽象是為了得到能充分描述系統的最少元素,能夠排除干擾,分析本質的作用.
系統模型
程式在分散式系統中執行也就是,
- 在獨立節點併發執行
- 通過網路連線節點並伴隨著不確定性如資訊丟失等
- 無共享的儲存器與時鐘
以上這些也就意味著,
- 資訊是區域性的,很有可能其餘節點得到的資訊是過時的
- 獨立節點存在失效的情況以及需要恢復
- 傳輸的資訊可能丟失也可能延遲
- 節點點間的物理時鐘是不同步的
系統模型是分散式系統實現中對於環境和基本條件的假設,包括
- 節點的能力和可能失敗的原因
- 節點間通訊的方式及其失敗的原因
- 系統特性,例如時序的假設
一個健壯的系統應該有最弱的假設:可以在這樣一個系統中實現面向不同環境的演算法並良好執行.下面主要針對系統模型中的各個部分進行分析.
節點
節點作為計算和儲存的關鍵部件,主要提供計算能力、儲存能力以及非必須精確的節點本地時鐘.
關於節點的故障模型,其中,崩潰-恢復模型是其中一個假設模型,假設節點只會在崩潰宕機的時候失效(不再處理任何資訊),不存在其他失效的情況,在這種情況下,只需要恢復該節點即可.還有另外一類假設,即是節點任何錯誤的行為都算作失效,例如拜占庭問題(會一直傳遞錯誤資訊).
網路連線
時序
由於物理距離的不同及資訊傳輸速度有限導致節點看到的可能存在不一致
關於時序的模型主要有兩類:
- 同步系統
程序在lock-step內執行,有一個已知的資訊傳輸時間開銷上界,每個節點的時鐘都是精確同步的 - 非同步系統
沒有時間保證,每個程序都各自執行,沒有訊息傳輸上界,也沒有有效的時鐘資訊
一致性問題
關於多節點達成一致的形式化定義為:
- 協定:每個正常的節點必在同一個值上達成一致
- 完整:每個正常的節點最多隻能提出一個值,
- 終止:所有節點都達成共識
- 有效:如果所有正常的節點都提出相同的值,那麼這個值就是有效的
一致性問題是許多商業分散式系統中的核心問題,解決一致性問題能夠幫助解決一些更加深遠的問題,如原子性廣播?和原子性提交.
兩個不可能的結果
一個是FLP,與設計分散式系統相關,更偏學術意義,一個是CAP,與分散式實踐相關.
FLP
FLP的名字以這個理論的提出者組成(Fischer, Lynch and Patterson),重點考察非同步系統下的一致性問題,它假設節點只會因為宕機崩潰而失效並且網路是可靠的,當然沒有資訊傳輸時間上界的假設.
在以上假設下,FLP敘述為“在可靠網路的非同步系統中,即便只存在一個節點失效,也不可能存在一個解決一致性問題的確定演算法”,其理論上證明了不存在非同步分散式系統設計在任意場景下都能實現共識的演算法.
這裡是FLP的簡要證明.借鑑其他資料上的一個例子:
三個人在不同房間,進行投票(投票結果是 0 或者 1).三個人彼此可以通過電話進行溝通,但經常會有人時不時地睡著.比如某個時候,A 投票 0,B 投票 1,C 收到了兩人的投票,然後 C 睡著了.A 和 B 則永遠無法在有限時間內獲知最終的結果.如果可以重新投票,則類似情形每次在取得結果前發生.
當然了,在實際中,這是非常極端的情況,發生的概率沒有那麼大.Paxos/Raft演算法就是在實際中能夠使用的一致性保證演算法.
CAP也是類似的理論,但是在假設上做了改變(不是節點錯誤而是網路錯誤)
CAP
這是一個非常有效在系統設計中做出權衡的方法.這個理論中主要包含三個部分:
- 一致性(Consistency):所有節點在同一時間看到相同的資料值.
- 可靠性(Availability):失效節點能夠被恢復並繼續執行
- 分割槽容錯性(Partition tolerance):在節點間的網路通訊無法保障的時候系統依然能夠正常執行.
而三者不能同時滿足,最多隻能滿足其二.由此得到了三種類型的系統,如下圖所示.
- CA:嚴格的仲裁協議,例如兩階段提交.
- CP:多數裁定協議,這種情況少數分割槽不可用,例如Paxos.
- AP:衝突消解協議,例如Dynamo.
CA和CP系統設計都提供了強一致性,但是CA不能接受任何節點錯誤,CP系統能夠在2f+1個節點中容忍f個節點的非拜占庭式失效.CA系統不能區分節點失效和網路錯誤,因此會停止接受寫入,避免發生分歧(多份拷貝)
一致性模型
強一致性
- Linearizable consistency
- Sequential consistency
弱一致性
- Client-centric consistency models
- Causal consistency: strongest model available
- Eventual consistency models
強一致系統保證了事件的順序以及更新的可見性等價於非重複系統,而弱一致性模型則沒有這樣的保證。
強一致性模型
強一致性模型能夠被分為兩類相似卻又有些許不同的一致性模型。
- 線性一致性(Linearizable consistency):線上性一致性下,所有操作都按照與全域性實時操作順序一致的順序原子執行。(Herlihy & Wing, 1991)
- 順序一致性(Sequential consistency):在順序一致性下,所有操作都以某種順序原子地執行,這與在單個節點處看到的順序一致並且在所有節點處相等。(Lamport, 1979)
兩者的關鍵性區分在於,線性一致性需要操作生效的順序等價於操作的實時順序排序。順序一致性則允許操作重排序,只要在每個節點上觀察到的順序一致就行。唯一可以區分兩者的方法他們是否可以觀察進入系統的所有輸入和時間; 從客戶端與節點互動的角度來看,兩者是等價的。
這個區別看起來是不重要的,但值得注意的是順序一致性並不組成。
強一致性允許你在一個叢集中替換某個節點而不發生任何問題。
所有其他的一致性模型都會出現一場,因為他們的行為方式和非複製系統不同。但是在實際中這些異常都是可以接受的,或者由於我們並不在意這些偶然發生的問題或者是我們已經寫了程式碼以解決非一致性問題。