你真的理解CAP嗎?

  • C: Consistency一致性

  • A: Availability可用性

  • P: Partition-tolerance分區(qū)可容忍性

一、首先CAP理論是普遍被當作是大數(shù)據(jù)技術的理論基礎。

image.png

二、三種不可忽視的CAP場景

(1)分布式系統(tǒng)中多個數(shù)據(jù)副本之間的讀寫一致性問題
數(shù)據(jù)在節(jié)點A、B、C上保留了三份,如果對節(jié)點A上的數(shù)據(jù)進行了修改,然后再讓客戶端通過網絡對該數(shù)據(jù)進行讀取。那么,客戶端的讀取操作什么時候返回呢?有這樣兩種情況:一種情況是要求節(jié)點A、B、C的三份數(shù)據(jù)完全一致后返回。也就是說,這時從任何一個網絡節(jié)點讀取的數(shù)據(jù)都是一樣的,這就是所謂的強一致性讀。很明顯,這時數(shù)據(jù)讀取的Latency要高一些(因為要等數(shù)據(jù)在網絡中的復制),同時A、B、C三個節(jié)點中任何一個宕機,都會導致數(shù)據(jù)不可用。也就是說,要保證強一致性,網絡中的副本越多,數(shù)據(jù)的可用性就越差;另一種情況是,允許讀操作立即返回,容忍B節(jié)點的讀取與A節(jié)點的讀取不一致的情況發(fā)生。這樣一來,可用性顯然得到了提高,網絡中的副本也可以多一些,唯一得不到保證的是數(shù)據(jù)一致性。當然,對寫操作同樣也有多個節(jié)點一致性的情況,在此不再贅述。

(2)分布式系統(tǒng)系統(tǒng)的分布式事物問題
分布式事務一般采用兩階段提交策略來實現(xiàn),這是一個非常耗時的復雜過程,會嚴重影響系統(tǒng)效率,在實踐中我們盡量避免使用它。在實踐過程中,如果我們?yōu)榱藬U展數(shù)據(jù)容量將數(shù)據(jù)分布式存儲,而事務的要求又完全不能降低。那么,系統(tǒng)的可用性一定會大大降低,在現(xiàn)實中我們一般都采用對這些數(shù)據(jù)不分散存儲的策略。關系型數(shù)據(jù)庫,因為這個原因,擴展性(分區(qū)可容忍性P)受到了限制,這是完全符合CAP理論的。對NoSQL數(shù)據(jù)庫也是一樣的。如果NoSQL數(shù)據(jù)庫也要求嚴格的分布式事務功能,情況并不會比關系型數(shù)據(jù)庫好多少。只是在NoSQL的設計中,我們往往會弱化甚至去除事務的功能,該問題才表現(xiàn)得不那么明顯而已。在擴展性問題上,如果要說關系型數(shù)據(jù)庫是為了保證C、A而犧牲P,在盡量避免分布式事務這一點上來看,應該是正確的。也就是說:關系型數(shù)據(jù)庫應該具有強大的事務功能,如果分區(qū)擴展,可用性就會降低;而NoSQL數(shù)據(jù)庫干脆弱化甚至去除了事務功能,因此,分區(qū)的可擴展性就大大增加了。

(3)分布式環(huán)境中的關聯(lián)場景

初看起來,關系型數(shù)據(jù)庫中常用的多表關聯(lián)操作與CAP理論就更加不沾邊了。但仔細考慮,也可以用它來解釋數(shù)據(jù)庫分區(qū)擴展對關聯(lián)所帶來的影響。對一個數(shù)據(jù)庫來講,采用了分區(qū)擴展策略來擴充容量,數(shù)據(jù)分散存儲了,很顯然多表關聯(lián)的性能就會下降,因為我們必須在網絡上進行大量的數(shù)據(jù)遷移操作,這與CAP理論中數(shù)據(jù)副本之間的同步操作本質上也是相同的。而NoSQL數(shù)據(jù)庫則干脆在設計上弱化甚至去除了多表關聯(lián)操作。那么,從這一點上來理解“NoSQL數(shù)據(jù)庫是為了保證A與P,而犧牲C”的說法,也是可以講得通的。當然,我們應該理解,關聯(lián)問題在很多情況下不是并行處理的優(yōu)點所在,這在很大程度上與Amdahl定律相符合。

三、總結

現(xiàn)在看來,如果理解CAP理論只是指多個數(shù)據(jù)副本之間讀寫一致性的問題,那么它對關系型數(shù)據(jù)庫與NoSQL數(shù)據(jù)庫來講是完全一樣的,它只是運行在分布式環(huán)境中的數(shù)據(jù)管理設施在設計讀寫一致性問題時需要遵循的一個原則而已,卻并不是NoSQL數(shù)據(jù)庫具有優(yōu)秀的水平可擴展性的真正原因。而如果將CAP理論中的一致性C理解為讀寫一致性、事務與關聯(lián)操作的綜合,則可以認為關系型數(shù)據(jù)庫選擇了C與A,而NoSQL數(shù)據(jù)庫則全都是選擇了A與P,但并沒有選擇C與P的情況存在。這才是用CAP理論來支持NoSQL數(shù)據(jù)庫設計正確認識。這種認識正好與被廣泛認同的NoSQL的另一個理論基礎相吻合,即與ACID對著干的BASE(基本可用性、軟狀態(tài)與最終一致性)。因為BASE的含義正好是指“NoSQL數(shù)據(jù)庫設計可以通過犧牲一定的數(shù)據(jù)一致性和容錯性來換取高性能的保持甚至提高”,即NoSQL數(shù)據(jù)庫都應該是犧牲C來換取P,而不是犧牲A??捎眯訟正好是所有NoSQL數(shù)據(jù)庫都普遍追求的特性。

摘自原文:http://www.jdon.com/bigdata/how-to-understand-cap.html

理解參考:https://www.cnblogs.com/shanyou/archive/2012/06/11/2545536.html

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容