CAP 定理的含義
1998年丙唧,加州大學的計算機科學家 Eric Brewer 提出庐橙,分布式系統(tǒng)有三個指標。
- Consistency
- Availability
- Partition tolerance
它們的第一個字母分別是 C、A宵膨、P巢墅。
Eric Brewer 說诸狭,這三個指標不可能同時做到。這個結(jié)論就叫做 CAP 定理君纫。
CAP原則又稱CAP定理驯遇,指的是在一個分布式系統(tǒng)中, Consistency(一致性)蓄髓、 Availability(可用性)叉庐、Partition tolerance(分區(qū)容錯性),三者不可得兼双吆。
一致性(C):在分布式系統(tǒng)中的所有數(shù)據(jù)備份眨唬,在同一時刻是否同樣的值会前。(等同于所有節(jié)點訪問同一份最新的數(shù)據(jù)副本)
可用性(A):保證每個請求不管成功或者失敗都有響應。
分區(qū)容忍性(P) :系統(tǒng)中任意信息的丟失或失敗不會影響系統(tǒng)的繼續(xù)運作匾竿。
CAP原則的精髓就是要么AP瓦宜,要么CP,要么AC岭妖,但是不存在CAP临庇。如果在某個分布式系統(tǒng)中數(shù)據(jù)無副本, 那么系統(tǒng)必然滿足強一致性條件昵慌, 因為只有獨一數(shù)據(jù)假夺,不會出現(xiàn)數(shù)據(jù)不一致的情況,此時C和P兩要素具備斋攀,但是如果系統(tǒng)發(fā)生了網(wǎng)絡(luò)分區(qū)狀況或者宕機已卷,必然導致某些數(shù)據(jù)不可以訪問,此時可用性條件就不能被滿足淳蔼,即在此情況下獲得了CP系統(tǒng)侧蘸,但是CAP不可同時滿足 。
因此在進行分布式架構(gòu)設(shè)計時鹉梨,必須做出取舍讳癌。當前一般是通過分布式緩存中各節(jié)點的最終一致性來提高系統(tǒng)的性能,通過使用多節(jié)點之間的數(shù)據(jù)異步復制技術(shù)來實現(xiàn)集群化的數(shù)據(jù)一致性存皂。通常使用類似 memcached 之類的 NOSQL 作為實現(xiàn)手段晌坤。雖然 memcached 也可以是分布式集群環(huán)境的,但是對于一份數(shù)據(jù)來說旦袋,它總是存儲在某一臺 memcached 服務(wù)器上骤菠。如果發(fā)生網(wǎng)絡(luò)故障或是服務(wù)器死機,則存儲在這臺服務(wù)器上的所有數(shù)據(jù)都將不可訪問猜憎。由于數(shù)據(jù)是存儲在內(nèi)存中的娩怎,重啟服務(wù)器,將導致數(shù)據(jù)全部丟失胰柑。當然也可以自己實現(xiàn)一套機制截亦,用來在分布式 memcached 之間進行數(shù)據(jù)的同步和持久化,但是實現(xiàn)難度是非常大的 柬讨。
BASE理論是由eBay架構(gòu)師提出的崩瓤。BASE是對CAP中一致性和可用性權(quán)衡的結(jié)果,其來源于對大規(guī)牟裙伲互聯(lián)網(wǎng)分布式系統(tǒng)實踐的總結(jié)却桶,是基于CAP定律逐步演化而來。其核心思想是即使無法做到強一致性,但每個應用都可以根據(jù)自身業(yè)務(wù)特點颖系,才用適當?shù)姆绞絹硎瓜到y(tǒng)打到最終一致性嗅剖。
BASE理論的內(nèi)容
- 基本可用(Basically Available)
- 軟狀態(tài)(Soft State)
- 最終一致性(Eventually Consistent)
下面展開討論:
- 基本可用
什么是基本可用呢?假設(shè)系統(tǒng)嘁扼,出現(xiàn)了不可預知的故障信粮,但還是能用,相比較正常的系統(tǒng)而言:
響應時間上的損失:正常情況下的搜索引擎0.5秒即返回給用戶結(jié)果趁啸,而基本可用的搜索引擎可以在2秒作用返回結(jié)果强缘。
功能上的損失:在一個電商網(wǎng)站上,正常情況下不傅,用戶可以順利完成每一筆訂單旅掂。但是到了大促期間,為了保護購物系統(tǒng)的穩(wěn)定性访娶,部分消費者可能會被引導到一個降級頁面商虐。
- 軟狀態(tài)
什么是軟狀態(tài)呢?相對于原子性而言震肮,要求多個節(jié)點的數(shù)據(jù)副本都是一致的称龙,這是一種“硬狀態(tài)”。
軟狀態(tài)指的是:允許系統(tǒng)中的數(shù)據(jù)存在中間狀態(tài)戳晌,并認為該狀態(tài)不影響系統(tǒng)的整體可用性,即允許系統(tǒng)在多個不同節(jié)點的數(shù)據(jù)副本存在數(shù)據(jù)延時痴柔。
- 最終一致性
上面說軟狀態(tài)沦偎,然后不可能一直是軟狀態(tài),必須有個時間期限咳蔚。在期限過后豪嚎,應當保證所有副本保持數(shù)據(jù)一致性,從而達到數(shù)據(jù)的最終一致性谈火。這個時間期限取決于網(wǎng)絡(luò)延時侈询、系統(tǒng)負載、數(shù)據(jù)復制方案設(shè)計等等因素糯耍。
而在實際工程實踐中扔字,最終一致性分為5種:
1) 因果一致性(Causal consistency)
因果一致性指的是:如果節(jié)點A在更新完某個數(shù)據(jù)后通知了節(jié)點B,那么節(jié)點B之后對該數(shù)據(jù)的訪問和修改都是基于A更新后的值温技。于此同時革为,和節(jié)點A無因果關(guān)系的節(jié)點C的數(shù)據(jù)訪問則沒有這樣的限制。
2)讀己之所寫(Read your writes)
讀己之所寫指的是:節(jié)點A更新一個數(shù)據(jù)后舵鳞,它自身總是能訪問到自身更新過的最新值震檩,而不會看到舊值。其實也算一種因果一致性。
3)會話一致性(Session consistency)
會話一致性將對系統(tǒng)數(shù)據(jù)的訪問過程框定在了一個會話當中:系統(tǒng)能保證在同一個有效的會話中實現(xiàn) “讀己之所寫” 的一致性抛虏,也就是說博其,執(zhí)行更新操作之后,客戶端能夠在同一個會話中始終讀取到該數(shù)據(jù)項的最新值迂猴。
4)單調(diào)讀一致性(Monotonic read consistency)
單調(diào)讀一致性指的是:如果一個節(jié)點從系統(tǒng)中讀取出一個數(shù)據(jù)項的某個值后贺奠,那么系統(tǒng)對于該節(jié)點后續(xù)的任何數(shù)據(jù)訪問都不應該返回更舊的值。
5)單調(diào)寫一致性(Monotonic write consistency)
單調(diào)寫一致性指的是:一個系統(tǒng)要能夠保證來自同一個節(jié)點的寫操作被順序的執(zhí)行错忱。
在實際的實踐中儡率,這5種系統(tǒng)往往會結(jié)合使用,以構(gòu)建一個具有最終一致性的分布式系統(tǒng)以清。
實際上儿普,不只是分布式系統(tǒng)使用最終一致性,關(guān)系型數(shù)據(jù)庫在某個功能上掷倔,也是使用最終一致性的眉孩。比如備份,數(shù)據(jù)庫的復制過程是需要時間的勒葱,這個復制過程中浪汪,業(yè)務(wù)讀取到的值就是舊的。當然凛虽,最終還是達成了數(shù)據(jù)一致性死遭。這也算是一個最終一致性的經(jīng)典案例。
小結(jié)
總體來說BASE理論面向的是大型高可用凯旋、可擴展的分布式系統(tǒng)呀潭。與傳統(tǒng)ACID特性相反,不同于ACID的強一致性模型至非,BASE提出通過犧牲強一致性來獲得可用性钠署,并允許數(shù)據(jù)段時間內(nèi)的不一致,但是最終達到一致狀態(tài)荒椭。同時谐鼎,在實際分布式場景中,不同業(yè)務(wù)對數(shù)據(jù)的一致性要求不一樣趣惠。因此在設(shè)計中狸棍,ACID和BASE理論往往又會結(jié)合使用。