分佈式之cap、base理論、flp不可能原理、一致性問題、共識算法

一、CAP理論

CAP理論:在一個分佈式系統中,最多隻能滿足C、A、P中的2個。

CAP含義:

C:Consistency 一致性:同一數據的多個副本是否實時相同。all nodes see the same data at the same time

A:Availability 可用性:一定時間內,系統能返回一個明確的結果 則稱爲該系統可用。Reads and writes always succeed

P:Partition tolerance 分區容錯性:分佈式系統在遇到某節點或網絡分區故障的時候,仍然能夠對外提供滿足一致性和可用性的服務。the system continues to operate despite arbitrary message loss or failure of part of the system

而通常情況下,我們都必須要滿足AP,所以只能犧牲C。

犧牲一致性換取可用性和分區容錯性。

犧牲一致性的意思是,把強一致換成弱一致。只要數據最終能一致就好了,並不要實時一致。

二、BASE理論

主要就是分佈式系統中最CAP怎麼取捨怎麼平衡的一個理論

BA:Basic Available 基本可用  

基本可用是指分佈式系統在出現故障的時候,允許損失部分可用性,即保證核心可用。

電商大促時,爲了應對訪問量激增,部分用戶可能會被引導到降級頁面,服務層也可能只提供降級服務。這就是損失部分可用性的體現。

基本可用BA和高可用HA的區別是:

1.響應時間可以更長。

2.給部分用戶返回一個降級頁面。返回降級頁面仍然是返回明確結果。

S:Soft State:柔性狀態。同一數據的不同副本的狀態,不用實時一致

E:Eventual Consisstency:最終一致性。 同一數據的不同副本的狀態,不用實時一致,但一定要保證經過一定時間後最終是一致的。

三、FLP

參考:https://zhuanlan.zhihu.com/p/70439273

1.FLP 不可能原理

FLP定理[1]是分佈式理論中最重要的理論之一,它指出在最小化異步網絡通信場景下,即使只有一個節點失敗,也沒有一種確定性的共識算法能夠使得在其他節點之間保持數據一致。

這裏的最小化異步通信網絡是對純粹的異步網絡做了限制,這裏的異步網絡與我們編程中的異步同步不是一個概念,具體可以參考[5] 分佈式網絡及故障模型

提出並證明該定理的論文《Impossibility of Distributed Consensus with One Faulty Process》是由 Fischer,Lynch 和 Patterson 三位科學家於 1985 年發表,該論文後來獲得了 Dijkstra(就是發明最短路徑算法的那位計算機科學家)獎。

一個正確的分佈式算法需要滿足兩條性質:

  • Safety:具備Safety性質的算法保證壞的事情絕對不會發生,例如對於滿足Safety性質的分佈式選主(Leader election)算法,絕對不會出現一個以上進程被選爲Leader的情況。
  • Liveness:具備Liveness性質的算法保證好的事情終將發生,即算法在有限的時間內可以結束。

綜上,一個正確的分佈式算法可以在指定的分佈式系統模型中保證SafetyLiveness屬性。

而FLP不可能原理則是在說,要保證Safety的話就一定會出現Liveness

2.針對這個定義,有幾個名詞解釋:

 在分佈式系統中的網絡模型,同步和異步這兩個術語存在特殊的含義

同步網絡(synchronous network): 這裏的同步網絡和編程中的同步阻塞io和異步非阻塞io是兩回事

i). 所有節點的時鐘漂移有上限,

ii). 網絡的傳輸時間有上限,

iii). 所有節點的計算速度一樣.

這意味着整個網絡按照round運行, 每個round中任何節點都要執行完本地計算並且可以完成一個任意大小消息的傳輸.

一個發出的消息如果在一個round內沒有到達, 那麼一定是網絡中斷造成的, 這個消息會丟失, 不會延遲到第二個round到達.

在現實生活中這種網絡比較少, 儘管很少, 同步網絡仍然是在計算機科學中是不可缺少的一個分析模型, 在這種模型下可以解決一些問題, 比如拜占庭式故障. 但我們每天打交道的網絡大多都是異步網絡.

異步網絡(asynchornous network)

i)節點的時鐘漂移無上限,

ii)消息的傳輸延遲無上限,

iii)節點計算的速度不可預料.

這就是我們打交道的網絡類型. 在異步網絡中, 有些故障非常難解決, 比如當你發給一個節點一個消息之後幾秒鐘都沒有收到他的應答, 有可能這個節點計算非常慢, 但是也可能是節點crash或者網絡延遲造成的, 你很難判斷到底是發生了什麼樣的故障.

 四、一致性問題

https://wohugb.github.io/blockchain_guide/distribute_system/problem/

1.定義:

在分佈式系統中,一致性(Consistency,早期也叫 Agreement)是指對於系統中的多個服務節點,給定一系列操作,在協議(往往通過某種共識算法)保障下,試圖使得它們對處理結果達成某種程度的一致。

如果分佈式系統能實現“一致”,對外就可以呈現爲一個功能正常的,且性能和穩定性都要好很多的“虛處理節點”。

注意:一致性並不代表結果正確與否,而是系統對外呈現的狀態一致與否,例如,所有節點都達成失敗狀態也是一種一致。

2.分佈式系統中一致性面臨的挑戰

在實際的計算機集羣系統中,存在如下的問題:

  • 節點之間的網絡通訊是不可靠的,包括任意延遲和內容故障;
  • 節點的處理可能是錯誤的,甚至節點自身隨時可能宕機;
  • 同步調用會讓系統變得不具備可擴展性。

3.滿足一致性需要達到的條件

共識算法的正確性要求是在運行中滿足以下條件:

  • 終止性(Liveness):所有正確進程最後都能完成決定。
  • 協定性(Safety):所有正確進程決定相同的值。
  • 完整性(Integrity):如果正確的進程都提議同一個值,那麼所有正確進程最終決定該值。

4.帶約束的一致性

做過分佈式系統的讀者應該能意識到,絕對理想的強一致性(Strong Consistency)代價很大。除非不發生任何故障,所有節點之間的通信無需任何時間,這個時候其實就等價於一臺機器了。實際上,越強的一致性要求往往意味着越弱的性能。

一般的,強一致性(Strong Consistency)主要包括下面兩類:

  • 順序一致性(Sequential Consistency):Leslie Lamport 1979 年經典論文《How to Make a Multiprocessor Computer That Correctly Executes Multiprocess Programs》中提出,是一種比較強的約束,保證所有進程看到的 全局執行順序(total order)一致,並且每個進程看自身的執行(local order)跟實際發生順序一致。例如,某進程先執行 A,後執行 B,則實際得到的全局結果中就應該爲 A 在 B 前面,而不能反過來。同時所有其它進程在全局上也應該看到這個順序。順序一致性實際上限制了各進程內指令的偏序關係,但不在進程間按照物理時間進行全局排序。
  • 線性一致性(Linearizability Consistency):Maurice P. Herlihy 與 Jeannette M. Wing 在 1990 年經典論文《Linearizability: A Correctness Condition for Concurrent Objects》中共同提出,在順序一致性前提下加強了進程間的操作排序,形成唯一的全局順序(系統等價於是順序執行,所有進程看到的所有操作的序列順序都一致,並且跟實際發生順序一致),是很強的原子性保證。但是比較難實現,目前基本上要麼依賴於全局的時鐘或鎖,要麼通過一些複雜算法實現,性能往往不高。

強一致的系統往往比較難實現。很多時候,人們發現實際需求並沒有那麼強,可以適當放寬一致性要求,降低系統實現的難度。例如在一定約束下實現所謂最終一致性(Eventual Consistency),即總會存在一個時刻(而不是立刻),系統達到一致的狀態,這對於大部分的 Web 系統來說已經足夠了。這一類弱化的一致性,被籠統稱爲弱一致性(Weak Consistency)。

5.常見共識算法(一致性算法)

故障(不響應)的情況稱爲“非拜占庭錯誤”

惡意響應的情況稱爲“拜占庭錯誤”(對應節點爲拜占庭節點)

針對非拜占庭錯誤的情況,一般包括 Paxos、Raft 及其變種。

對於要能容忍拜占庭錯誤的情況,一般包括 PBFT 系列、PoW 系列算法等。從概率角度,PBFT 系列算法是確定的,一旦達成共識就不可逆轉;而 PoW 系列算法則是不確定的,隨着時間推移,被推翻的概率越來越小。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章