分布式系統特性:CAP
上一節我們通過原始村落村民的例子來說明分布式系統中的三個要素的概念。本節,我將介紹分布式系統中應該解決的幾個特性。
CAP
1. Consistency(一致性)
2. Availability(可用性)
3. Partition tolarance (分區容錯性)
一致性是說,需要兩個或者多個節點共同完成一個業務邏輯,這個業務邏輯不可以將中間狀態存儲成永久的狀態。換句話說,這個業務邏輯應該要麼在每個節點都成功,要麼在每個節點都不成功。舉個例子,媒婆想促成一對姻緣,就先要到男女雙方家裡去做工作。只要雙方有一家不同意這門親事,整件事情就需要都作廢。如果都同意這門親事,媒婆的才能夠成功的促成這個姻緣。假設,男方家裡同意了,但是媒婆還沒有問過女方,媒婆一定不會告訴男方說,”你現在就布置新房吧“,而是會說“我再去女方家裡問問這個事”。等到了女方家裡問這個事,若是女方家裡同意,則媒婆就會讓雙方准備結婚。如果女方不同意,那麼媒婆就還需要到男方家裡把這個事說了,放棄這門婚事。
可用性是說,不管遇到了什麼樣的狀況,當我發送給你一條消息,你是否能夠給我回復一條,不管是成功或者失敗。這就像你給別人寫信,若是收信人有個好習慣,每一封信件都回復給你,你就會覺得這樣的人很靠譜,系統也是一樣。
分區容錯性是說,系統能夠繼續工作,即使是數據丟失或者是部分失敗。每個節點都有屬於自己的元數據信息或者集群的需要持久化的信息,但是系統是存在風險的,每一個節點都可能會因為特殊的情形而造成數據的丟失,那麼當某一個節點數據丟失,集群能否正確的將數據恢復,並且正常提供服務就是分區容錯性。(這裡要有一個思考,那就是如果有兩個節點同時出錯呢,如果有三個呢,如果有n個呢)。
曾經有外國大牛證明過,說過上述三者不能同時兼備,怎麼取捨,怎麼權衡是我們需要重視的。
以下為翻譯文章,主要講述CAP之間的組合以及適宜的場景
http://robertgreiner.com/2014/08/cap-theorem-revisited/
Consistency:讀請求能夠保證返回最新的數據。
Availability:一個沒有掛掉的節點能夠在有限的時間內返回一個合理的結果。
Partition Tolerance:當節點之間的網絡分裂,系統依然能夠提供服務。(The system will continue to function when network partitions occur)
在進一步解釋之前,我們需要將一件事情先說明。面向對象編程!=網絡編程。在編程的時候,我們假設的共享內存的幾個程序,很可能在網絡不穩定的情況下被分割成一個或者多個區域,也就是這幾個程序可能數據不一致。在分布式計算中,最不應該的事情是認為網絡是可靠的。網絡絕不是可靠的。網絡經常的會不可用,擁塞。網絡問題經常在你不經意之間就會出錯。由於網絡的不穩定性,在分布式系統中你必須要分區可容錯。下面就介紹在分區分裂的情況下,你的選擇是更加偏向Availability還是更加偏向Consistency。
CP:Consistency/Partition Tolerance- 在等待一個節點返回信息的時候,有可能會出錯。系統當然可以返回錯誤,也可以不返回錯誤,到另外一個副本工作。這時候需要根據業務邏輯來判斷,是需要選擇Availability還是Consistency。如果系統一定需要顯示的數據需要是最新的已經提交的數據,那麼就選擇Consistency模式。這時,就需要報錯而不是切換到副本。如下所示:
AP:Availability/Partition Tolerance - 在這種模式下,你返回的最新的數據很可能對於用戶來說也是陳舊的,選擇Availability而不是Consistency取決於你的業務需求,你的業務需要是更加注重於穩定,能夠容忍少量的不一致。系統希望的是運行,而不是一味的報錯。如下圖所示: