NoSQL学习笔记(二)之CAP理论
1.CAP概述
CAP理論是由EricBrewer教授提出的,在設(shè)計(jì)和部署分布式應(yīng)用的時(shí)候,存在三個(gè)核心的系統(tǒng)需求,這三個(gè)需求之間存在一定的特殊關(guān)系。三個(gè)需求如下:
C:?Consistency?一致性
A:?Availability?可用性
P:Partition Tolerance分區(qū)容錯(cuò)性
CAP理論的核心是:一個(gè)分布式系統(tǒng)不可能同時(shí)很好的滿足一致性,可用性和分區(qū)容錯(cuò)性這三個(gè)需求,最多只能同時(shí)較好的滿足兩個(gè)。
?
2.CAP定義
(1)C:?Consistency?一致性
一致性又稱為原子性或者事務(wù)性。表示一個(gè)事務(wù)的操作是不可分割的,要不然這個(gè)事務(wù)完成,要不然這個(gè)事務(wù)不完成,不會(huì)出現(xiàn)這個(gè)事務(wù)完成了一半這樣的情況。這種事務(wù)的原子性使得數(shù)據(jù)具有一致性。
我們通常情況下在數(shù)據(jù)庫(kù)中存在的臟數(shù)據(jù)就屬于數(shù)據(jù)沒有具有一致性的表現(xiàn)。而在分布式系統(tǒng)中,經(jīng)常出現(xiàn)的一個(gè)數(shù)據(jù)不具有一致性的情況是讀寫數(shù)據(jù)時(shí)缺乏一致性。比如兩個(gè)節(jié)點(diǎn)數(shù)據(jù)冗余,第一個(gè)節(jié)點(diǎn)有一個(gè)寫操作,數(shù)據(jù)更新以后沒有有效的使得第二個(gè)節(jié)點(diǎn)更新數(shù)據(jù),在讀取第二個(gè)節(jié)點(diǎn)的時(shí)候就會(huì)出現(xiàn)不一致的問題出現(xiàn)。
傳統(tǒng)的ACID數(shù)據(jù)庫(kù)是很少存在一致性問題的,因?yàn)閿?shù)據(jù)的單點(diǎn)原因,數(shù)據(jù)的存取又具有良好的事務(wù)性,不會(huì)出現(xiàn)讀寫的不一致。
(2)A:?Availability?可用性
???????? 好的可用性主要是指系統(tǒng)能夠很好的為用戶服務(wù),不出現(xiàn)用戶操作失敗或者訪問超時(shí)等用戶體驗(yàn)不好的情況??捎眯酝ǔG闆r下可用性和分布式數(shù)據(jù)冗余,負(fù)載均衡等有著很大的關(guān)聯(lián)。
(3)P:Partition Tolerance分區(qū)容錯(cuò)性
???????? 分區(qū)容錯(cuò)性和擴(kuò)展性緊密相關(guān)。在分布式應(yīng)用中,可能因?yàn)橐恍┓植际降脑驅(qū)е孪到y(tǒng)無法正常運(yùn)轉(zhuǎn)。好的分區(qū)容錯(cuò)性要求能夠使應(yīng)用雖然是一個(gè)分布式系統(tǒng),而看上去卻好像是在一個(gè)可以運(yùn)轉(zhuǎn)正常的整體。比如現(xiàn)在的分布式系統(tǒng)中有某一個(gè)或者幾個(gè)機(jī)器宕掉了,其他剩下的機(jī)器還能夠正常運(yùn)轉(zhuǎn)滿足系統(tǒng)需求,這樣就具有好的分區(qū)容錯(cuò)性。
?
3.CAP理論的意義
???????? 隨著互聯(lián)網(wǎng)應(yīng)用的飛速發(fā)展,數(shù)據(jù)量與日俱增,傳統(tǒng)的ACID數(shù)據(jù)庫(kù)已經(jīng)不能滿足如此大的海量數(shù)據(jù)存儲(chǔ)了。這個(gè)時(shí)候需要設(shè)計(jì)出好的分布式數(shù)據(jù)存儲(chǔ)方式。而這些分布式數(shù)據(jù)存儲(chǔ)方式受到CAP理論的約束,不可能達(dá)到高一致性,高可用性,高分區(qū)容錯(cuò)性的完美設(shè)計(jì)。所以我們?cè)谠O(shè)計(jì)的時(shí)候要懂得取舍,重點(diǎn)關(guān)注對(duì)應(yīng)用需求來說比較重要的,而放棄不重要的,在CAP這三者之間進(jìn)行取舍,設(shè)計(jì)出貼合應(yīng)用的存儲(chǔ)方案。
???????? 目前眾多的分布式數(shù)據(jù)系統(tǒng)通過降低一致性來?yè)Q取可用性。下面是一個(gè)簡(jiǎn)單的例子:
兩個(gè)節(jié)點(diǎn)數(shù)據(jù)冗余,第一個(gè)節(jié)點(diǎn)先有一個(gè)寫操作,第二個(gè)節(jié)點(diǎn)后有一個(gè)讀操作。下面的圖中a是整個(gè)過程,要具有一致性的話需要等待a1進(jìn)行write,然后同步到a2,然后a2再進(jìn)行write,只有整個(gè)事務(wù)完成以后,a2才能夠進(jìn)行read。但是這樣的話使得整個(gè)系統(tǒng)的可用性下降,a2一直阻塞在那里等待a1同步到a2。這個(gè)時(shí)候如果對(duì)一致性要求不高的話,a2可以不等待a1數(shù)據(jù)對(duì)于a2的寫同步,直接讀取,這樣雖然此時(shí)的讀寫不具有一致性,但是在后面可以通過異步的方式使得a1和a2的數(shù)據(jù)最終一致,達(dá)到最終一致性。
4.BASE理論
BASE理論是CAP理論結(jié)合實(shí)際的產(chǎn)物。 BASE(Basically?Available,?Soft-state,Eventuallyconsistent)英文中有堿的意思,這個(gè)正好和ACID的酸的意義相對(duì),很有意思。BASE恰好和ACID是相對(duì)的,BASE要求犧牲高一致性,獲得可用性或可靠性。
?
5.CAP之間的取舍
滿足一致性,可用性的系統(tǒng),通常在可擴(kuò)展性上不太強(qiáng)大:
·????????Traditional RDBMSs like Postgres,MySQL, etc (relational)
·????????Vertica (column-oriented)
·????????Aster Data (relational)
·????????Greenplum (relational)
滿足一致性,分區(qū)容忍必的系統(tǒng),通常性能不是特別高:
·????????BigTable?(column-oriented/tabular)
·????????Hypertable?(column-oriented/tabular)
·????????Hbase?(column-oriented/tabular)
·????????MongoDB?(document-oriented)
·????????Terrastore?(document-oriented)
·????????Redis?(key-value)
·????????Scalaris?(key-value)
·????????MemcacheDB?(key-value)
·????????Berkeley DB?(key-value)
滿足可用性,分區(qū)容忍性的系統(tǒng),通常可能對(duì)一致性要求低一些:
·????????Dynamo?(key-value)
·????????Voldemort?(key-value)
·????????Tokyo Cabinet?(key-value)
·????????KAI?(key-value)
·????????Cassandra?(column-oriented/tabular)
·????????CouchDB?(document-oriented)
·????????SimpleDB?(document-oriented)
·????????Riak?(document-oriented)
?
6.CAP的反對(duì)聲音
Guy Pardon寫了一篇文章“A CAP Solution (Proving Brewer Wrong)”來反對(duì)CAP理論。他提出了一個(gè)同時(shí)滿足CAP的解決方案來反對(duì)Brewer的三者只能取其二的說法。
他設(shè)計(jì)的系統(tǒng)如下:
(1)程序如果能夠讀取數(shù)據(jù)庫(kù)的話讀取數(shù)據(jù)庫(kù),如果不能的話可以使用緩存代替。
(2)所有的讀取操作使用版本號(hào)或者其他可以使用樂觀鎖的機(jī)制。
(3)客戶端的所有更新操作全部放在隊(duì)列中順序處理。更新操作中要包括該更新的讀取操作時(shí)的版本信息。
(4)當(dāng)分區(qū)數(shù)量足夠少的時(shí)候,可以處理隊(duì)列中的更新操作。比較簡(jiǎn)單的方式是建立一個(gè)跨越所有分布式副本的事務(wù),對(duì)每個(gè)副本進(jìn)行更新操作(其他方式比如quorum等等也可以)。如果該更新的讀取操作時(shí)的版本信息不是當(dāng)前數(shù)據(jù)庫(kù)中數(shù)據(jù)的版本信息,則將失敗返回給客戶端,否則返回成功。
(5)數(shù)據(jù)庫(kù)操作結(jié)果(確認(rèn)或者取消)通過異步的方式發(fā)送到客戶端,可以通過郵件,消息隊(duì)列或者其他異步方式。
該系統(tǒng)符合CAP如下:
符合C(高一致性):讀取的數(shù)據(jù)都是基于快照的,而且錯(cuò)誤的更新操作不會(huì)執(zhí)行。
符合A(高可用性):讀取和更新都會(huì)返回?cái)?shù)據(jù)。
符合P(高分區(qū)容錯(cuò)性):允許網(wǎng)絡(luò)或者節(jié)點(diǎn)出錯(cuò)。
該設(shè)計(jì)是符合BASE理論的。
?
參考資料:
http://www.julianbrowne.com/article/viewer/brewers-cap-theorem
http://www.sigma.me/2011/06/13/NoSQL-CAP-Theorem.html
http://blog.nosqlfan.com/html/1112.html
http://guysblogspot.blogspot.com/2008/09/cap-solution-proving-brewer-wrong.html
總結(jié)
以上是生活随笔為你收集整理的NoSQL学习笔记(二)之CAP理论的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java中异常概述
- 下一篇: MySQL性能分析及explain的使用