分布式系統(tǒng)(distributed system)正變得越來越重要荔茬,大型網(wǎng)站幾乎都是分布式的燥撞。
分布式系統(tǒng)的最大難點酝惧,就是各個節(jié)點的狀態(tài)如何保持一致瞎饲。CAP理論是在設(shè)計分布式系統(tǒng)的過程中沈善,處理數(shù)據(jù)一致性問題時必須考慮的理論乡数。
一、什么是CAP理論
CAP即:
- Consistency(一致性)
- Availability(可用性)
- Partition tolerance(分區(qū)容忍性)
這三個性質(zhì)對應(yīng)了分布式系統(tǒng)的三個指標(biāo):
而CAP理論說的就是:一個分布式系統(tǒng)闻牡,不可能同時做到這三點净赴。如下圖:
接下來將詳細(xì)介紹C A P 三個指標(biāo)的含義,以及三者如何權(quán)衡罩润。
二 玖翅、 C、 A割以、P的含義
借用一下維基百科CAP理論一文中關(guān)于C金度、A、P三者的定義严沥。
Consistency : Every read receives the most recent write or an error
Availability : Every request receives a (non-error) response – without the guarantee that it contains the most recent write
Partition tolerance : The system continues to operate despite an arbitrary number of messages being dropped (or delayed) by the network between nodes
翻譯一下就是:
①一致性:對于客戶端的每次讀操作猜极,要么讀到的是最新的數(shù)據(jù),要么讀取失敗消玄。換句話說魔吐,一致性是站在分布式系統(tǒng)的角度,對訪問本系統(tǒng)的客戶端的一種承諾:要么我給您返回一個錯誤莱找,要么我給你返回絕對一致的最新數(shù)據(jù)酬姆,不難看出,其強調(diào)的是數(shù)據(jù)正確奥溺。
②可用性:任何客戶端的請求都能得到響應(yīng)數(shù)據(jù)辞色,不會出現(xiàn)響應(yīng)錯誤。換句話說浮定,可用性是站在分布式系統(tǒng)的角度相满,對訪問本系統(tǒng)的客戶的另一種承諾:我一定會給您返回數(shù)據(jù)层亿,不會給你返回錯誤,但不保證數(shù)據(jù)最新立美,強調(diào)的是不出錯匿又。
③分區(qū)容忍性:由于分布式系統(tǒng)通過網(wǎng)絡(luò)進(jìn)行通信,網(wǎng)絡(luò)是不可靠的建蹄。當(dāng)任意數(shù)量的消息丟失或延遲到達(dá)時碌更,系統(tǒng)仍會繼續(xù)提供服務(wù),不會掛掉洞慎。換句話說痛单,分區(qū)容忍性是站在分布式系統(tǒng)的角度,對訪問本系統(tǒng)的客戶端的再一種承諾:我會一直運行劲腿,不管我的內(nèi)部出現(xiàn)何種數(shù)據(jù)同步問題旭绒,強調(diào)的是不掛掉。
三焦人、權(quán)衡 C挥吵、A
之前提到,CAP理論說一個分布式系統(tǒng)不可能同時滿足C、A花椭、P這三個特性忽匈。那么我們就來分析C、A个从、P的權(quán)衡吧脉幢。
note:其實這里有個關(guān)于CAP理論理解的誤區(qū)歪沃。不要以為在所有時候都只能選擇兩個特性嗦锐。在不存在網(wǎng)絡(luò)失敗的情況下(分布式系統(tǒng)正常運行時),C和A能夠同時保證沪曙。只有當(dāng)網(wǎng)絡(luò)發(fā)生分區(qū)或失敗時奕污,才會在C和A之間做出選擇。
對于一個分布式系統(tǒng)而言液走,P是前提碳默,必須保證,因為只要有網(wǎng)絡(luò)交互就一定會有延遲和數(shù)據(jù)丟失缘眶,這種狀況我們必須接受嘱根,必須保證系統(tǒng)不能掛掉。所以只剩下C巷懈、A可以選擇该抒。要么保證數(shù)據(jù)一致性(保證數(shù)據(jù)絕對正確),要么保證可用性(保證系統(tǒng)不出錯)顶燕。
當(dāng)選擇了C(一致性)時凑保,如果由于網(wǎng)絡(luò)分區(qū)而無法保證特定信息是最新的冈爹,則系統(tǒng)將返回錯誤或超時。
當(dāng)選擇了A(可用性)時欧引,系統(tǒng)將始終處理客戶端的查詢并嘗試返回最新的可用的信息版本频伤,即使由于網(wǎng)絡(luò)分區(qū)而無法保證其是最新的。
四芝此、C憋肖、A、P三者之間的沖突
本部分主要參考分布式CAP定理癌蓖,為什么不能同時滿足三個特性瞬哼?
假設(shè)有兩臺服務(wù)器,一臺放著應(yīng)用A和數(shù)據(jù)庫V租副,一臺放著應(yīng)用B和數(shù)據(jù)庫V坐慰,他們之間的網(wǎng)絡(luò)可以互通,也就相當(dāng)于分布式系統(tǒng)的兩個部分用僧。
在滿足一致性的時候结胀,兩臺服務(wù)器(假設(shè)為N1,N2)的數(shù)據(jù)是一樣的,DB0=DB0责循。在滿足可用性的時候糟港,用戶不管是請求N1或者N2,都會得到立即響應(yīng)院仿。在滿足分區(qū)容錯性的情況下秸抚,N1和N2有任何一方宕機,或者網(wǎng)絡(luò)不通的時候歹垫,都不會影響N1和N2彼此之間的正常運作剥汤。
圖1中,用戶通過N1中的A應(yīng)用請求數(shù)據(jù)更新到服務(wù)器DB0排惨,這時N1中的服務(wù)器DB0變?yōu)镈B1吭敢,通過分布式系統(tǒng)的數(shù)據(jù)同步更新操作,N2服務(wù)器中的數(shù)據(jù)庫V0也更新為了DB1(圖2)暮芭,這時鹿驼,用戶通過B向數(shù)據(jù)庫發(fā)起請求得到的數(shù)據(jù)就是即時更新后的數(shù)據(jù)DB1。
上面是正常運作的情況辕宏,但分布式系統(tǒng)中畜晰,最大的問題就是網(wǎng)絡(luò),現(xiàn)在假設(shè)一種極端情況瑞筐,N1和N2之間的網(wǎng)絡(luò)斷開了凄鼻,但我們?nèi)砸С诌@種網(wǎng)絡(luò)異常,也就是滿足分區(qū)容錯性,那么這樣能不能同時滿足一致性和可用性呢野宜?
假設(shè)N1和N2之間通信的時候網(wǎng)絡(luò)突然出現(xiàn)故障扫步,有用戶向N1發(fā)送數(shù)據(jù)更新請求,那N1中的數(shù)據(jù)DB0將被更新為DB1匈子,由于網(wǎng)絡(luò)是斷開的河胎,N2中的數(shù)據(jù)庫仍舊是DB0;
如果這個時候虎敦,有用戶向N2發(fā)送數(shù)據(jù)讀取請求游岳,由于數(shù)據(jù)還沒有進(jìn)行同步,應(yīng)用程序沒辦法立即給用戶返回最新的數(shù)據(jù)DB1其徙,怎么辦呢胚迫?有二種選擇,第一唾那,犧牲數(shù)據(jù)一致性访锻,響應(yīng)舊的數(shù)據(jù)DB0給用戶;第二闹获,犧牲可用性期犬,阻塞等待,直到網(wǎng)絡(luò)連接恢復(fù)避诽,數(shù)據(jù)更新操作完成之后龟虎,再給用戶響應(yīng)最新的數(shù)據(jù)DB1。
參考資料:
CAP 定理的含義