??CAP理論是分布式系統(tǒng)非常基礎(chǔ)和重要的概念,想了解分布式系統(tǒng)就繞不開它,這里簡單對此理論的基礎(chǔ)概念做下介紹。
首先需要注意一點:
CAP僅適用于原子讀寫的NOSQL場景中,并不適合數(shù)據(jù)庫系統(tǒng)。
CAP理論概念
一個分布式系統(tǒng)最多只能同時滿足一致性(Consistency)、可用性(Availability)和分區(qū)容錯性(Partition tolerance)這三項中的兩項。
簡單介紹:
- 一致性(Consistence) :所有節(jié)點訪問同一份最新的數(shù)據(jù)副本
- 可用性(Availability):每次請求都能獲取到非錯的響應(yīng)——但是不保證獲取的數(shù)據(jù)為最新數(shù)據(jù)
- 分區(qū)容錯性(Partition tolerance) : 分布式系統(tǒng)在遇到某節(jié)點或網(wǎng)絡(luò)分區(qū)故障的時候,仍然能夠?qū)ν馓峁M足一致性和可用性的服務(wù)。

需要注意,此處的C和A與數(shù)據(jù)庫事務(wù)中的ACID中的C和A不是同一個東西,他們的C都表示一致性,但是事
務(wù)的A表示Atomicity原子性,而這里的A是Availability可用性。
C A P詳細(xì)介紹
C —— Consistency 一致性
一致性指“all nodes see the same data at the same time”,即更新操作成功并返回客戶端完成后,所有節(jié)點在同一時間的數(shù)據(jù)完全一致,所以,一致性,說的就是數(shù)據(jù)一致性。
對于一致性,可以分為從客戶端和服務(wù)端兩個不同的視角。從客戶端來看,一致性主要指的是多并發(fā)訪問時更新過的數(shù)據(jù)如何獲取的問題。從服務(wù)端來看,則是更新如何復(fù)制分布到整個系統(tǒng),以保證數(shù)據(jù)最終一致。
一致性是因為有并發(fā)讀寫才有的問題,因此在理解一致性的問題時,一定要注意結(jié)合考慮并發(fā)讀寫的場景。
從客戶端角度,多進(jìn)程并發(fā)訪問時,更新過的數(shù)據(jù)在不同的進(jìn)程如何獲取的不同策略,決定了不同的一致性。
三種一致性策略:
- 強(qiáng)一致性 要求更新過的數(shù)據(jù)都能馬上被后續(xù)訪問看到
- 弱一致性 能容忍后續(xù)的部分或全部訪問看不到更新過的數(shù)據(jù)
- 最終一致性 要求過一段時候之后能訪問到更新過的數(shù)據(jù)
CAP理論中說不可能同時滿足的這個C指的是強(qiáng)一致性
A —— Availability 可用性
可用性指“Reads and writes always succeed”,即服務(wù)一直可用,而且是正常響應(yīng)時間。
對于一個可用性的分布式系統(tǒng),每一個非故障的節(jié)點必須對每一個請求作出響應(yīng)。所以,一般我們在衡量一個系統(tǒng)的可用性的時候,都是通過停機(jī)時間來計算的。

通常我們描述一個系統(tǒng)的可用性時,我們說淘寶的系統(tǒng)可用性可以達(dá)到5個9,意思就是說他的可用水平是99.999%,即全年停機(jī)時間不超過(1-0.99999)*365*24*60 = 5.256 min,這是一個極高的要求。
好的可用性主要是指系統(tǒng)能夠很好的為用戶服務(wù),不出現(xiàn)用戶操作失敗或者訪問超時等用戶體驗不好的情況。一個分布式系統(tǒng),上下游設(shè)計很多系統(tǒng)如負(fù)載均衡、WEB服務(wù)器、應(yīng)用代碼、數(shù)據(jù)庫服務(wù)器等,任何一個節(jié)點的不穩(wěn)定都可以影響可用性。
P —— Partition Tolerance分區(qū)容錯性
分區(qū)容錯性指“the system continues to operate despite arbitrary message loss or failure of part of the system”,即分布式系統(tǒng)在遇到某節(jié)點或網(wǎng)絡(luò)分區(qū)故障的時候,仍然能夠?qū)ν馓峁M足一致性和可用性的服務(wù)。
分區(qū)容錯性和擴(kuò)展性緊密相關(guān)。在分布式應(yīng)用中,可能因為一些分布式的原因?qū)е孪到y(tǒng)無法正常運轉(zhuǎn)。好的分區(qū)容錯性要求能夠使應(yīng)用雖然是一個分布式系統(tǒng),而看上去卻好像是在一個可以運轉(zhuǎn)正常的整體。比如現(xiàn)在的分布式系統(tǒng)中有某一個或者幾個機(jī)器宕掉了,其他剩下的機(jī)器還能夠正常運轉(zhuǎn)滿足系統(tǒng)需求,或者是機(jī)器之間有網(wǎng)絡(luò)異常,將分布式系統(tǒng)分隔未獨立的幾個部分,各個部分還能維持分布式系統(tǒng)的運作,這樣就具有好的分區(qū)容錯性。
簡單點說,就是在網(wǎng)絡(luò)中斷,消息丟失的情況下,系統(tǒng)如果還能正常工作,就是有比較好的分區(qū)容錯性。
CAP理論的證明
//to do
CAP的權(quán)衡抉擇
- CAP無法同時滿足,但是并不是三選二!
首先,P分區(qū)容錯性是必須要滿足的,如果舍棄分區(qū)容錯,也就失去分布式系統(tǒng)的意義了。當(dāng)網(wǎng)絡(luò)分區(qū)之后P是前提,決定了P之后才有C和A的選擇。也就是說分區(qū)容錯性(Partition tolerance)我們是必須要實現(xiàn)的。
1. CP
選擇一致性放棄可用性,保證數(shù)據(jù)的正確犧牲用戶體驗。
一個保證了CP而一個舍棄了A的分布式系統(tǒng),一旦發(fā)生網(wǎng)絡(luò)故障或者消息丟失等情況,就要犧牲用戶的體驗,等待所有數(shù)據(jù)全部一致了之后再讓用戶訪問系統(tǒng)。
設(shè)計成CP的系統(tǒng)其實也不少,其中最典型的就是很多分布式數(shù)據(jù)庫,他們都是設(shè)計成CP的。在發(fā)生極端情況時,優(yōu)先保證數(shù)據(jù)的強(qiáng)一致性,代價就是舍棄系統(tǒng)的可用性。如Redis、HBase等,還有分布式系統(tǒng)中常用的Zookeeper也是在CAP三者之中選擇優(yōu)先保證CP的。
無論是像Redis、HBase這種分布式存儲系統(tǒng),還是像Zookeeper這種分布式協(xié)調(diào)組件。數(shù)據(jù)的一致性是他們最最基本的要求。一個連數(shù)據(jù)一致性都保證不了的分布式存儲要他有何用?
2. AP
要高可用并允許分區(qū),則需放棄一致性。一旦網(wǎng)絡(luò)問題發(fā)生,節(jié)點之間可能會失去聯(lián)系。為了保證高可用,需要在用戶訪問時可以馬上得到返回,則每個節(jié)點只能用本地數(shù)據(jù)提供服務(wù),而這樣會導(dǎo)致全局?jǐn)?shù)據(jù)的不一致性。
這種舍棄強(qiáng)一致性而保證系統(tǒng)的分區(qū)容錯性和可用性的場景和案例非常多。前面我們介紹可用性的時候說到過,很多系統(tǒng)在可用性方面會做很多事情來保證系統(tǒng)的全年可用性可以達(dá)到N個9,所以,對于很多業(yè)務(wù)系統(tǒng)來說,比如淘寶的購物,12306的買票。都是在可用性和一致性之間舍棄了一致性而選擇可用性。
比如12306買票,在點擊購票的一瞬間是有票的,但是付款的時候可能已經(jīng)沒了,這就是為了保證用戶體驗犧牲了數(shù)據(jù)的一致性,但是還是有最終一致性的保證的,在最終購票的時候還是會保證數(shù)據(jù)一致性。
總之,兩種選擇都沒有對錯,要看適用的不同場景。
對于涉及到錢財這樣不能有一絲讓步的場景,C必須保證。網(wǎng)絡(luò)發(fā)生故障寧可停止服務(wù),這是保證CA,舍棄P。比如前幾年支付寶光纜被挖斷的事件,在網(wǎng)絡(luò)出現(xiàn)故障的時候,支付寶就在可用性和數(shù)據(jù)一致性之間選擇了數(shù)據(jù)一致性,用戶感受到的是支付寶系統(tǒng)長時間宕機(jī),但是其實背后是無數(shù)的工程師在恢復(fù)數(shù)據(jù),保證數(shù)數(shù)據(jù)的一致性。
對于其他場景,比較普遍的做法是選擇可用性和分區(qū)容錯性,舍棄強(qiáng)一致性,退而求其次使用最終一致性來保證數(shù)據(jù)的安全。這其實是分布式領(lǐng)域的另外一個理論——BASE理論。
總結(jié)和梳理CAP理論
一般我們說的分布式系統(tǒng),P:分區(qū)容錯性(partition-tolerance)這個是必需的,這是客觀存在的。
CAP是無法完全兼顧的,從上面的例子也可以看出,我們可以選AP,也可以選CP。但是,要注意的是:不是說選了AP,C就完全拋棄了。不是說選了CP,A就完全拋棄了!
在CAP理論中,C所表示的一致性是強(qiáng)一致性(每個節(jié)點的數(shù)據(jù)都是最新版本),其實一致性還有其他級別的:
弱一致性:弱一致性是相對于強(qiáng)一致性而言,它不保證總能得到最新的值;
最終一致性(eventual consistency):放寬對時間的要求,在被調(diào)完成操作響應(yīng)后的某個時間點,被調(diào)多個節(jié)點的數(shù)據(jù)最終達(dá)成一致
可用性的值域可以定義成0到100%的連續(xù)區(qū)間。
所以,CAP理論定義的其實是在容忍網(wǎng)絡(luò)分區(qū)的條件下,“強(qiáng)一致性”和“極致可用性”無法同時達(dá)到。