//
分布式基礎(chǔ)(1):CAP原理、BASE思想和最終一致性-freshera-ChinaUnix博客
http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=29126521&id=3868927
BASE模型反ACID模型秸歧,完全不同ACID模型葬凳,犧牲高一致性,獲得可用性或可靠性: Basically Available基本可用嗅榕。最終數(shù)據(jù)是一致的就可以了顺饮,而不是時(shí)時(shí)一致。
CAP凌那,BASE和最終一致性是NoSQL數(shù)據(jù)庫(kù)存在的三大基石兼雄。CAP
C: Consistency 一致性
A: Availability 可用性(指的是快速獲取數(shù)據(jù))
P: Tolerance of network Partition 分區(qū)容忍性(分布式)
在足球比賽里,一個(gè)球員在一場(chǎng)比賽中進(jìn)三個(gè)球帽蝶,稱之為[帽子戲法](http://baike.baidu.com/view/1148.htm)([HAT-TRICK](http://baike.baidu.com/view/501580.htm))赦肋。在分布式數(shù)據(jù)系統(tǒng)中,也有一個(gè)帽子原理(CAP THEOREM),不過(guò)此帽子非彼帽子佃乘。CAP原理中囱井,有三個(gè)要素:
CAP原理指的是,這三個(gè)要素最多只能同時(shí)實(shí)現(xiàn)兩點(diǎn)趣避,不可能三者兼顧庞呕。因此在進(jìn)行分布式架構(gòu)設(shè)計(jì)時(shí),必須做出取舍鹅巍。而對(duì)于分布式數(shù)據(jù)系統(tǒng)千扶,分區(qū)容忍性是基本要求料祠,否則就失去了價(jià)值骆捧。因此設(shè)計(jì)分布式數(shù)據(jù)系統(tǒng),就是在一致性和可用性之間取一個(gè)平衡髓绽。對(duì)于大多數(shù)WEB應(yīng)用敛苇,其實(shí)并不需要強(qiáng)一致性,因此犧牲一致性而換取高可用性顺呕,是多數(shù)分布式數(shù)據(jù)庫(kù)產(chǎn)品的方向枫攀。
當(dāng)然,犧牲一致性株茶,并不是完全不管數(shù)據(jù)的一致性来涨,否則數(shù)據(jù)是混亂的,那么系統(tǒng)可用性再高分布式再好也沒(méi)有了價(jià)值启盛。犧牲一致性蹦掐,只是不再要求關(guān)系型數(shù)據(jù)庫(kù)中的強(qiáng)一致性,而是只要系統(tǒng)能達(dá)到最終一致性即可僵闯,考慮到客戶體驗(yàn)卧抗,這個(gè)最終一致的時(shí)間窗口,要盡可能的對(duì)用戶透明鳖粟,也就是需要保障“用戶感知到的一致性”社裆。通常是通過(guò)數(shù)據(jù)的多份異步復(fù)制來(lái)實(shí)現(xiàn)系統(tǒng)的高可用和數(shù)據(jù)的最終一致性的,“用戶感知到的一致性”的時(shí)間窗口則取決于數(shù)據(jù)復(fù)制到一致?tīng)顟B(tài)的時(shí)間向图。
最終一致性(EVENTUALLY CONSISTENT)
對(duì)于一致性泳秀,可以分為從客戶端和服務(wù)端兩個(gè)不同的視角。從客戶端來(lái)看榄攀,一致性主要指的是多并發(fā)訪問(wèn)時(shí)更新過(guò)的數(shù)據(jù)如何獲取的問(wèn)題嗜傅。從服務(wù)端來(lái)看,則是更新如何復(fù)制分布到整個(gè)系統(tǒng)航攒,以保證數(shù)據(jù)最終一致磺陡。一致性是因?yàn)橛胁l(fā)讀寫(xiě)才有的問(wèn)題,因此在理解一致性的問(wèn)題時(shí),一定要注意結(jié)合考慮并發(fā)讀寫(xiě)的場(chǎng)景币他。
從客戶端角度坞靶,多進(jìn)程并發(fā)訪問(wèn)時(shí),更新過(guò)的數(shù)據(jù)在不同進(jìn)程如何獲取的不同策略蝴悉,決定了不同的一致性彰阴。對(duì)于關(guān)系型數(shù)據(jù)庫(kù),要求更新過(guò)的數(shù)據(jù)能被后續(xù)的訪問(wèn)都能看到拍冠,這是強(qiáng)一致性尿这。如果能容忍后續(xù)的部分或者全部訪問(wèn)不到,則是弱一致性庆杜。如果經(jīng)過(guò)一段時(shí)間后要求能訪問(wèn)到更新后的數(shù)據(jù)射众,則是最終一致性。最終一致性根據(jù)更新數(shù)據(jù)后各進(jìn)程訪問(wèn)到數(shù)據(jù)的時(shí)間和方式的不同晃财,又可以區(qū)分為:
因果一致性(CAUSAL CONSISTENCY)
如果進(jìn)程A通知進(jìn)程B它已更新了一個(gè)數(shù)據(jù)項(xiàng)叨橱,那么進(jìn)程B的后續(xù)訪問(wèn)將返回更新后的值,且一次寫(xiě)入將保證取代前一次寫(xiě)入断盛。與進(jìn)程A無(wú)因果關(guān)系的進(jìn)程C的訪問(wèn)遵守一般的最終一致性規(guī)則罗洗。“讀己之所寫(xiě)(READ-YOUR-WRITES)”一致性。當(dāng)進(jìn)程A自己更新一個(gè)數(shù)據(jù)項(xiàng)之后钢猛,它總是訪問(wèn)到更新過(guò)的值伙菜,絕不會(huì)看到舊值。這是因果一致性模型的一個(gè)特例命迈。會(huì)話(SESSION)一致性贩绕。這是上一個(gè)模型的實(shí)用版本,它把訪問(wèn)存儲(chǔ)系統(tǒng)的進(jìn)程放到會(huì)話的上下文中躺翻。只要會(huì)話還存在丧叽,系統(tǒng)就保證“讀己之所寫(xiě)”一致性。如果由于某些失敗情形令會(huì)話終止公你,就要建立新的會(huì)話踊淳,而且系統(tǒng)的保證不會(huì)延續(xù)到新的會(huì)話。單調(diào)(MONOTONIC)讀一致性陕靠。如果進(jìn)程已經(jīng)看到過(guò)數(shù)據(jù)對(duì)象的某個(gè)值迂尝,那么任何后續(xù)訪問(wèn)都不會(huì)返回在那個(gè)值之前的值。單調(diào)寫(xiě)一致性剪芥。系統(tǒng)保證來(lái)自同一個(gè)進(jìn)程的寫(xiě)操作順序執(zhí)行垄开。要是系統(tǒng)不能保證這種程度的一致性,就非常難以編程了税肪。上述最終一致性的不同方式可以進(jìn)行組合溉躲,例如單調(diào)讀一致性和讀己之所寫(xiě)一致性就可以組合實(shí)現(xiàn)榜田。并且從實(shí)踐的角度來(lái)看,這兩者的組合锻梳,讀取自己更新的數(shù)據(jù)箭券,和一旦讀取到最新的版本不會(huì)再讀取舊版本,對(duì)于此架構(gòu)上的程序開(kāi)發(fā)來(lái)說(shuō)疑枯,會(huì)少很多額外的煩惱辩块。
從服務(wù)端角度,如何盡快將更新后的數(shù)據(jù)分布到整個(gè)系統(tǒng)荆永,降低達(dá)到最終一致性的時(shí)間窗口废亭,是提高系統(tǒng)的可用度和用戶體驗(yàn)非常重要的方面。對(duì)于分布式數(shù)據(jù)系統(tǒng):
N — 數(shù)據(jù)復(fù)制的份數(shù),W — 更新數(shù)據(jù)是需要保證寫(xiě)完成的節(jié)點(diǎn)數(shù),R — 讀取數(shù)據(jù)的時(shí)候需要讀取的節(jié)點(diǎn)數(shù)如果W+R>N具钥,寫(xiě)的節(jié)點(diǎn)和讀的節(jié)點(diǎn)重疊豆村,則是強(qiáng)一致性。例如對(duì)于典型的一主一備同步復(fù)制的關(guān)系型數(shù)據(jù)庫(kù)氓拼,N=2,W=2,R=1你画,則不管讀的是主庫(kù)還是備庫(kù)的數(shù)據(jù)抵碟,都是一致的桃漾。
如果W+R<=N,則是弱一致性拟逮。例如對(duì)于一主一備異步復(fù)制的關(guān)系型數(shù)據(jù)庫(kù)撬统,N=2,W=1,R=1,則如果讀的是備庫(kù)敦迄,就可能無(wú)法讀取主庫(kù)已經(jīng)更新過(guò)的數(shù)據(jù)恋追,所以是弱一致性。
對(duì)于分布式系統(tǒng)罚屋,為了保證高可用性苦囱,一般設(shè)置N>=3。不同的N,W,R組合脾猛,是在可用性和一致性之間取一個(gè)平衡撕彤,以適應(yīng)不同的應(yīng)用場(chǎng)景。
如果N=W,R=1猛拴,任何一個(gè)寫(xiě)節(jié)點(diǎn)失效羹铅,都會(huì)導(dǎo)致寫(xiě)失敗,因此可用性會(huì)降低愉昆,但是由于數(shù)據(jù)分布的N個(gè)節(jié)點(diǎn)是同步寫(xiě)入的职员,因此可以保證強(qiáng)一致性。如果N=R,W=1跛溉,只需要一個(gè)節(jié)點(diǎn)寫(xiě)入成功即可焊切,寫(xiě)性能和可用性都比較高扮授。但是讀取其他節(jié)點(diǎn)的進(jìn)程可能不能獲取更新后的數(shù)據(jù),因此是弱一致性专肪。這種情況下糙箍,如果W<(N+1)/2,并且寫(xiě)入的節(jié)點(diǎn)不重疊的話牵祟,則會(huì)存在寫(xiě)沖突BASE
說(shuō)起來(lái)很有趣深夯,BASE的英文意義是堿,而ACID是酸诺苹。真的是水火不容啊咕晋。Basically Availble --基本可用
Soft-state --軟狀態(tài)/柔性事務(wù)
"Soft state" 可以理解為"無(wú)連接"的, 而 "Hard state" 是"面向連接"的
Eventual Consistency --最終一致性
最終一致性, 也是是 ACID 的最終目的收奔。
BASE模型反ACID模型掌呜,完全不同ACID模型,犧牲高一致性坪哄,獲得可用性或可靠性: Basically Available基本可用质蕉。支持分區(qū)失敗(e.g. sharding碎片劃分?jǐn)?shù)據(jù)庫(kù)) Soft state軟狀態(tài) 狀態(tài)可以有一段時(shí)間不同步,異步翩肌。 Eventually consistent最終一致模暗,最終數(shù)據(jù)是一致的就可以了,而不是時(shí)時(shí)一致念祭。BASE思想的主要實(shí)現(xiàn)有1.按功能劃分?jǐn)?shù)據(jù)庫(kù)2.sharding碎片 BASE思想主要強(qiáng)調(diào)基本的可用性兑宇,如果你需要高可用性,也就是純粹的高性能粱坤,那么就要以一致性或容錯(cuò)性為犧牲隶糕,BASE思想的方案在性能上還是有潛力可挖的。