分散式之CAP定理
總結自:
先說定義吧
一致性(Consistency):對於某次讀取返回的內容是該資訊的最新版本。
可用性(Availability):一個正常工作的節點,對於client的請求會在合理的時間內返回一個合理的響應,這個響應不應該是錯誤也不應該是請求超時。
分割槽容忍性(Partition Tolerance):當網路分割槽發生時,系統仍然工作正常。
說說一些注意事項以及認識
1.一致性
不一致並不是像行動通訊裡面的錯誤一樣,由於干擾的存在產生傳輸的資料都解碼出來錯誤了。
比如本來拷貝一個變數x,值為1,從node1拷貝到node2,發生錯誤變成了值為2。
(1)不一致主要是因為需要維護變數x的多個副本,在有些節點或者網路故障的時候,一些對於x變數的修改操作沒有在某些節點裡面進行,
導致了不同節點之內表示的同一個變數的值不一致。
(2)少數派在crash之後或者在被partition之後,recovery出來執行一些已經執行、沒有執行反正不一樣的動作。
2.可用性
可用性的概念就是上面提到的概念。值得注意的是,在分析系統的時候我們也經常會將具備可用性的概率也稱作可用性。
比如,如果對於單機系統,如果宕機的概率是p,那麼就有1-p的概率是具備可用性的,習慣上我們也說可用性是1-p
3.分割槽容忍性
要弄清分割槽容忍性,首先就要清楚什麼是network partition
network partition就是說,由於網路裝置的故障導致原來的網路分裂為2個,分裂出來的2個網路現在是不能互通的了。
而分割槽容忍性就是說,當network partition發生的時候,系統也能工作正常。
系統也能正常工作的意思是說,系統並沒有隨著network partition也表現出分裂為兩部分的現象,
系統對外仍然表現為彷彿只存在一個統一的整體,並對外提供服務。
4.可用性和分割槽容忍性的區別
其實在上面的3中,關於分割槽容忍性的概念還有一個比較模糊的地方,就是什麼是系統工作正常。
其實這個系統正常工作就是能不能正常對外提供服務,換句話說就是client來了一個請求,會是一個怎樣的結果。
從這個角度來說可用性和分割槽容忍性的確有很大的相似程度。
我們不妨將整個系統劃分為以下幾個部分:client、distributed system(node + network)
而我們又可以將distributed system劃分為:network和node部分,其中network是node之間通訊的網路,而node是對client提供服務的邏輯實體。
我現在的認識是,凡是node對於提供服務的影響就是可用性,凡是network對於提供服務的影響就是分割槽容忍性。
將這個概念帶入到網路程式設計(七):CAP原理推導和應用裡面提供的幾個模型中去分析,感覺還是比較清晰地。
特別要注意的是,其實可用性說穿了就是一個請求是否能夠順利達到目的,但是在分析的時候應該對於讀請求和寫請求分別對待。
因為正如網路程式設計(七):CAP原理推導和應用裡面所列舉的,同一個架構下讀請求和寫請求的可用性改變甚至是相反的。
5.幾種網路架構
(1)單機系統
(2)Sharding
(3)多副本讀寫
(4)Clustering--多副本同步
(5)Clustering--多副本非同步