CAP原則又稱CAP定理,指的是在一個分布式系統(tǒng)中,一致性(Consistency)、可用性(Availability)、分區(qū)容忍性(Partition tolerance)。CAP 原則指的是,這三個要素最多只能同時實現(xiàn)兩點,不可能三者兼顧。
- C表示一致性(Consistency),分布式中所有節(jié)點訪問數(shù)據(jù)時,要求數(shù)據(jù)始終都是最新的。
- A表示可用性(Availability),分布式中任意節(jié)點出現(xiàn)故障時,要求系統(tǒng)可正常使用。
- P表示分區(qū)容忍性(Partition tolerance),分區(qū)相當(dāng)于對通信的時限要求。系統(tǒng)如果不能在時限內(nèi)達(dá)成數(shù)據(jù)一致性,就意味著發(fā)生了分區(qū)的情況,必須就當(dāng)前操作在C和A之間做出選擇。(分區(qū)狀態(tài)可以理解為部分機(jī)器不連通了,比如機(jī)器掛了,繁忙失去響應(yīng),單機(jī)房故障等)
Consistency
數(shù)據(jù)一致性,及系統(tǒng)只讀到最新寫入的數(shù)據(jù),如:單點串行化的方式,就能達(dá)到一致性效果。
單機(jī)架構(gòu)保持一致性:
分布式架構(gòu)數(shù)據(jù)同步失敗,無法保持?jǐn)?shù)據(jù)一致性:
舉個栗子:你去租房的時候都會去找地產(chǎn)中介(某鏈),你找到了A小區(qū)的門店發(fā)現(xiàn)沒有需要的房源,然后去B小區(qū)的門店發(fā)現(xiàn)有個房源很適合你,這就可以理解為兩個門店信息不一致,及不滿足一致性要求,但實際上你會遇到這種情況,你去A小區(qū)門店詢問的時候,有你需要的房源,然后他們會去B小區(qū)的門店拿鑰匙,這是因為房東把房源交給了B小區(qū)門店,然后A小區(qū)的門店同樣同步的B門店的房源,這樣就滿足一致性的要求。
Availability
如果每運行100個時間單位,有1個時間單位不可用,則說系統(tǒng)的可用性是99%。
如上圖服務(wù)A可能由于網(wǎng)絡(luò)原因?qū)е虏豢捎?,但是B、C還是可以繼續(xù)服務(wù)的,但是在反向代理那個位置發(fā)生了故障那系統(tǒng)都不可用了,它不是高可用的。
舉個栗子:還是以租房為例,你去租房的時候發(fā)現(xiàn)A小區(qū)的門店今天關(guān)門了,然后直接去了B小區(qū)的門店發(fā)現(xiàn)他們正常工作的,這就滿足了可用性的要求,如果去B小區(qū)或其他門店都沒有正常工作,那這家地產(chǎn)商可能倒閉了,沒法對客戶提供可用性的服務(wù)了。
Partition tolerance
分布式系統(tǒng),大多都是很大個節(jié)點,第個節(jié)點節(jié)點之前都不是完全獨立的,需要相互通信,當(dāng)發(fā)生節(jié)點無法連通時,系統(tǒng)如何進(jìn)行容錯處理,是需要考慮的。
舉個栗子:C小區(qū)新增加了一個門店,裝修啥的都弄好了,就是沒拉網(wǎng)線,沒有連通性,等于就是個孤立的門店,店員只能大眼瞪小眼,沒得事做。那你去A門店找房源,那里的人可能都不知道有C小區(qū)這個門店,所以A直接帶你去了C小區(qū)看房子了。
總結(jié)
一致性,可用性,分區(qū)容忍性三者只能取其二,常見的最佳工程架構(gòu)實踐是什么呢? 最常見的實踐是這樣的:
- 連通性異常的處理必須保證,滿足P
- 一致性C與可用性A一般二選一
- 選擇一致性C,舉例:傳統(tǒng)單庫水平切分,就是這類選型的典型
- 選擇可用性A,舉例:雙主庫同步高可用,就是這類選型的典型






