本文是閱讀 http://book.mixu.net/distsys/abstractions.html 的筆記。html
第二章的題目是"Up and down the level of abstraction"。這一章裏面,做者主要介紹了分佈式系統裏面的一個重要概念:CAP理論。node
什麼是CAP理論呢?就是說在任何狀況下,分佈式系統只能知足下面三項中的兩個:算法
這三者不能同時知足。網絡
接下來是詳細內容。curl
--------------------下面是本次新聞聯播的詳細內容------------------------------異步
抽象(Abstraction)async
要討論理論,就不能不聊到抽象。做者在這裏文藝了一把。首先在哲學意義上討論了抽象。分佈式
當咱們說X比Y更加抽象,咱們在說什麼?ide
首先,和Y相比,X並無引入新的東西。X甚至可能移除了一些東西,顯得更加可控。性能
其次,X在某些程度上更容易理解。
做者開始掉書袋了。嘖嘖。尼采說過:
Every concept originates through our equating what is unequal. No leaf ever wholly equals another, and the concept "leaf" is formed through an arbitrary abstraction from these individual differences, through forgetting the distinctions; and now it gives rise to the idea that in nature there might be something besides the leaves which would be "leaf" - some kind of original form after which all leaves have been woven, marked, copied, colored, curled, and painted, but by unskilled hands, so that no copy turned out to be a correct, reliable, and faithful image of the original form.
這句話的大概意思,斗膽翻譯以下:
咱們從各異的事物中總結出其的共性,從而產生了概念。世界上沒有徹底相同的兩片樹葉,可是」樹葉「這個概念倒是咱們忽略世界上千萬的不一樣的葉子的差異,抽象而成的。這說明,有一些本質的東西讓樹葉成爲」樹葉「,而這些本質,原始的存在, 彷彿是被一雙技巧拙劣的雙手標記,扭曲,拷貝,上色,成爲咱們看到的一片片樹葉。它們面目全非,徹底不是本質存在的正確,可靠和可信的反映。
抽象,本質上,是假的。每一個具體的個體都是惟一的。可是抽象讓世界更加可控。因此若是咱們周圍看到的都是本質,那麼咱們從中推論出來的結果會普遍適用。反之,相似推論出來的不可能的結果(impossibility result)則代表,在一些限制和假設下,咱們是不能解決某些問題的。
因此抽象就是爲了讓事物等價,忽略某些現實生活中並不本質的東西。可是咱們怎麼知道該忽略那些呢?
咱們無法提早知道。
咱們在作系統設計的時候,每忽略一些事實,咱們就冒險引入一些錯誤和性能問題。而後咱們就不得不換一條路。那麼,對分佈式系統來講,那些本質咱們不得不考慮呢?這就是系統模型設計要解決的問題啦。
系統模型
分佈式系統的程序有下面幾個特色:
那麼,
系統模型就是:
對分佈式系統實現的環境和設施的基本假設。
一個強壯的系統模型作最少的假設,其算法容錯能力出衆。而較弱的系統模型,假設更多,可是實現起來可能更加容易理解。好比假設節點歷來不失靈,那麼算法不就很簡單咯,可是寫出來就沒考慮節點失靈的錯誤處理了。
系統模型中的節點(Nodes)
節點上提供了計算和儲存資源。
這裏的節點,通常系統都假設,要麼失靈(Fail),就是徹底crash;要麼正常。還有一種假設是拜占庭將軍問題。就是說節點失靈不是徹底crash,而是發送一些錯誤信息。後者比較少見,暫時假設不會發生。
節點之間的通訊的假設
通訊鏈路鏈接不一樣的節點,容許消息相互傳播。對通訊的假設很少。這裏主要是區分下節點失靈(Fail)和網絡分割(Network Partition)。
左邊是節點失靈,右邊是網絡分割。很好理解。
一些算法會假設網絡通訊老是可靠的。不過整體來講,咱們仍是認爲網絡不可靠,消息會丟失和延遲。
時間和序列的假設
不一樣節點接受到的消息序列多是徹底不一樣的。咱們能夠假設全部節點上的時間都徹底一致,或者,作以下假設。
顯然異步系統模型更加接近真實時間,同時更加難以實現。
-----------------------核心內容(必考,敲黑板)----------------------------
一致性問題(The Consensus problem)
多臺計算機(或者節點)達到一致代表:
FLP impossibility result
假設以下:
在上面的假設下,FLP 代表,
即便消息永遠不會丟失,即便最多隻有一個進程失效(Crash),在異步系統模型下,也不存在一個肯定性的分佈式算法。
假設存在這種算法,那麼任意延遲某消息(在異步系統模型中是容許的),在這段時間內該算法沒法讓進程肯定選擇某值。我也不是太理解這個解釋。因此放下原文。
This result means that there is no way to solve the consensus problem under a very minimal system model in a way that cannot be delayed forever. The argument is that if such an algorithm existed, then one could devise an execution of that algorithm in which it would remain undecided ("bivalent") for an arbitrary amount of time by delaying message delivery - which is allowed in the asynchronous system model. Thus, such an algorithm cannot exist.
FLP 不可能結果代表,咱們須要在異步系統模型中作折中。在解決一致性問題的時候,當消息沒辦法保證傳遞,算法須要放棄safety或者livness。 這裏原文中使用的safety多是指consistency,liveness 則是availability。
CAP理論
該理論有三個性質。
上面三個性質,只有兩個能夠同時知足。以下圖。
同時知足三個性質的系統是不存在的。
好比你要強一致,而且保證高可用性,任何節點失效系統都不失效,那麼對網絡分割就沒辦法容忍了,每條消息都不能丟失。
CA和CP都是強一致系統。差異是CA是沒有辦法handle網絡分割的。而CP在一個2n+1的系統中容忍n個節點失靈。
CA系統沒辦法區分是網絡問題仍是節點問題,因此遇到消息丟失就只有中止write,以防止divergence(一份copy四處不一樣)。
CP系統經過在Partition兩處構建不對稱node數,只保留節點多的那部分Partition,節點少的那部分就處於不可用狀態,不容許write。
另外一個角度來看CAP系統的話,咱們始終要保證對網絡分割的容錯,
那只有兩種選擇了。要麼實現強一致,放棄部分可用性(of minor partition);要麼實現弱一致,保證可用性(那麼在不一樣Partition,在同一時刻可能取到不一樣的值)
因此說,一致性和可用性是此消彼長的關係,是矛盾的統一體。強一致的設計要求,讓咱們不得不放棄可用性,由於在發生網絡分割的時候,咱們不可能在多個Partition還繼續write,使不一樣Partition出現不一致。
強一致也是性能的敵人。要求每一個節點都獲得update,那麼對普通操做,代價是很大的。
若是咱們在網絡分割發生時,堅持可用性,那麼強一致是不可能的。固然,一致性模型不是隻有強一致一種,咱們還能夠容許其餘選擇,好比: