C: Consistency一致性
A: Availability可用性
P: Partition-tolerance分區(qū)可容忍性
一、首先CAP理論是普遍被當(dāng)作是大數(shù)據(jù)技術(shù)的理論基礎(chǔ)。

二、三種不可忽視的CAP場景
(1)分布式系統(tǒng)中多個數(shù)據(jù)副本之間的讀寫一致性問題
數(shù)據(jù)在節(jié)點A、B、C上保留了三份,如果對節(jié)點A上的數(shù)據(jù)進行了修改,然后再讓客戶端通過網(wǎng)絡(luò)對該數(shù)據(jù)進行讀取。那么,客戶端的讀取操作什么時候返回呢?有這樣兩種情況:一種情況是要求節(jié)點A、B、C的三份數(shù)據(jù)完全一致后返回。也就是說,這時從任何一個網(wǎng)絡(luò)節(jié)點讀取的數(shù)據(jù)都是一樣的,這就是所謂的強一致性讀。很明顯,這時數(shù)據(jù)讀取的Latency要高一些(因為要等數(shù)據(jù)在網(wǎng)絡(luò)中的復(fù)制),同時A、B、C三個節(jié)點中任何一個宕機,都會導(dǎo)致數(shù)據(jù)不可用。也就是說,要保證強一致性,網(wǎng)絡(luò)中的副本越多,數(shù)據(jù)的可用性就越差;另一種情況是,允許讀操作立即返回,容忍B節(jié)點的讀取與A節(jié)點的讀取不一致的情況發(fā)生。這樣一來,可用性顯然得到了提高,網(wǎng)絡(luò)中的副本也可以多一些,唯一得不到保證的是數(shù)據(jù)一致性。當(dāng)然,對寫操作同樣也有多個節(jié)點一致性的情況,在此不再贅述。
(2)分布式系統(tǒng)系統(tǒng)的分布式事物問題
分布式事務(wù)一般采用兩階段提交策略來實現(xiàn),這是一個非常耗時的復(fù)雜過程,會嚴(yán)重影響系統(tǒng)效率,在實踐中我們盡量避免使用它。在實踐過程中,如果我們?yōu)榱藬U展數(shù)據(jù)容量將數(shù)據(jù)分布式存儲,而事務(wù)的要求又完全不能降低。那么,系統(tǒng)的可用性一定會大大降低,在現(xiàn)實中我們一般都采用對這些數(shù)據(jù)不分散存儲的策略。關(guān)系型數(shù)據(jù)庫,因為這個原因,擴展性(分區(qū)可容忍性P)受到了限制,這是完全符合CAP理論的。對NoSQL數(shù)據(jù)庫也是一樣的。如果NoSQL數(shù)據(jù)庫也要求嚴(yán)格的分布式事務(wù)功能,情況并不會比關(guān)系型數(shù)據(jù)庫好多少。只是在NoSQL的設(shè)計中,我們往往會弱化甚至去除事務(wù)的功能,該問題才表現(xiàn)得不那么明顯而已。在擴展性問題上,如果要說關(guān)系型數(shù)據(jù)庫是為了保證C、A而犧牲P,在盡量避免分布式事務(wù)這一點上來看,應(yīng)該是正確的。也就是說:關(guān)系型數(shù)據(jù)庫應(yīng)該具有強大的事務(wù)功能,如果分區(qū)擴展,可用性就會降低;而NoSQL數(shù)據(jù)庫干脆弱化甚至去除了事務(wù)功能,因此,分區(qū)的可擴展性就大大增加了。
(3)分布式環(huán)境中的關(guān)聯(lián)場景
初看起來,關(guān)系型數(shù)據(jù)庫中常用的多表關(guān)聯(lián)操作與CAP理論就更加不沾邊了。但仔細(xì)考慮,也可以用它來解釋數(shù)據(jù)庫分區(qū)擴展對關(guān)聯(lián)所帶來的影響。對一個數(shù)據(jù)庫來講,采用了分區(qū)擴展策略來擴充容量,數(shù)據(jù)分散存儲了,很顯然多表關(guān)聯(lián)的性能就會下降,因為我們必須在網(wǎng)絡(luò)上進行大量的數(shù)據(jù)遷移操作,這與CAP理論中數(shù)據(jù)副本之間的同步操作本質(zhì)上也是相同的。而NoSQL數(shù)據(jù)庫則干脆在設(shè)計上弱化甚至去除了多表關(guān)聯(lián)操作。那么,從這一點上來理解“NoSQL數(shù)據(jù)庫是為了保證A與P,而犧牲C”的說法,也是可以講得通的。當(dāng)然,我們應(yīng)該理解,關(guān)聯(lián)問題在很多情況下不是并行處理的優(yōu)點所在,這在很大程度上與Amdahl定律相符合。
三、總結(jié)
現(xiàn)在看來,如果理解CAP理論只是指多個數(shù)據(jù)副本之間讀寫一致性的問題,那么它對關(guān)系型數(shù)據(jù)庫與NoSQL數(shù)據(jù)庫來講是完全一樣的,它只是運行在分布式環(huán)境中的數(shù)據(jù)管理設(shè)施在設(shè)計讀寫一致性問題時需要遵循的一個原則而已,卻并不是NoSQL數(shù)據(jù)庫具有優(yōu)秀的水平可擴展性的真正原因。而如果將CAP理論中的一致性C理解為讀寫一致性、事務(wù)與關(guān)聯(lián)操作的綜合,則可以認(rèn)為關(guān)系型數(shù)據(jù)庫選擇了C與A,而NoSQL數(shù)據(jù)庫則全都是選擇了A與P,但并沒有選擇C與P的情況存在。這才是用CAP理論來支持NoSQL數(shù)據(jù)庫設(shè)計正確認(rèn)識。這種認(rèn)識正好與被廣泛認(rèn)同的NoSQL的另一個理論基礎(chǔ)相吻合,即與ACID對著干的BASE(基本可用性、軟狀態(tài)與最終一致性)。因為BASE的含義正好是指“NoSQL數(shù)據(jù)庫設(shè)計可以通過犧牲一定的數(shù)據(jù)一致性和容錯性來換取高性能的保持甚至提高”,即NoSQL數(shù)據(jù)庫都應(yīng)該是犧牲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