分布式系统CAP理论:CAP原则只能满足其中两项!
前言
我們學(xué)習(xí)分布式系統(tǒng),就一定聽說過CAP定理,尤其在學(xué)習(xí)分布式事務(wù)時(shí),都是以這個(gè)定理作為開場(chǎng)。這個(gè)定理起源于柏克萊加州大學(xué)的計(jì)算機(jī)科學(xué)家埃里克·布魯爾在2000年的分布式計(jì)算原則研討會(huì)上提出的一個(gè)猜想。 在2002年,麻省理工學(xué)院的賽斯·吉爾伯特和南希·林奇發(fā)表了布魯爾猜想的證明,使之成為一個(gè)定理。
讀者福利:Java分布式中間件學(xué)習(xí)筆記共享。
定理討論了在兩個(gè)互相矛盾的請(qǐng)求到達(dá)彼此連接不通的兩個(gè)不同的分布式節(jié)點(diǎn)的時(shí)候的處理方案。
CAP針對(duì)對(duì)象
先上個(gè)圖
上圖中,是我們常見的系統(tǒng)設(shè)計(jì),web服務(wù)集群化,mysql數(shù)據(jù)庫做主從,數(shù)據(jù)庫做主從可實(shí)現(xiàn)讀寫分離,分擔(dān)壓力。
我們看到Mysql數(shù)據(jù)庫產(chǎn)品,可以進(jìn)行分布式部署(集群方式,也支持單機(jī)),研發(fā)Mysql數(shù)據(jù)庫的工程師是要完成很多業(yè)務(wù)點(diǎn)(如:最基本的對(duì)數(shù)據(jù)增刪改查)。其中有很重要的點(diǎn)就是CAP定理的平衡。
所謂的CAP定理,是針對(duì)分布式系統(tǒng)闡述的,如在分布式環(huán)境下,Mysql是怎么平衡CAP的?
說了半天的CAP,到底什么是CAP定理?我們先看一下C、A、P各是什么含義?
CAP的定義
一、C全稱Consistency(一致性)
這個(gè)表示所有節(jié)點(diǎn)返回的數(shù)據(jù)是一致的。
如:上圖用戶寫了一篇文章A,數(shù)據(jù)插入到主Mysql。這時(shí)其他用戶讀寫這篇文章時(shí),要必須能夠讀到。
因?yàn)樽x取請(qǐng)求是走的從Mysql,就必須要求主mysql和從mysql同時(shí)更新了數(shù)據(jù)。
二、A全稱Availability(可用性)
每一個(gè)非故障節(jié)點(diǎn),都能夠?qū)γ恳粋€(gè)請(qǐng)求做出響應(yīng)。說白了就是某個(gè)節(jié)點(diǎn)壞了,不能影響其他的節(jié)點(diǎn)業(yè)務(wù)。
如:主mysql掛了,但他不影響從mysql節(jié)點(diǎn)對(duì)外提供服務(wù),用戶還是可以讀取數(shù)據(jù)的,只是不能寫而已。
(小伙伴們就會(huì)問,那不能寫了啊,還算可用性嗎?這里的可用性的定義是非故障節(jié)點(diǎn),對(duì)每個(gè)請(qǐng)求做出響應(yīng);有故障的不算)
三、P全稱Partition tolerance(分區(qū)容錯(cuò)性)
當(dāng)系統(tǒng)中有節(jié)點(diǎn)因網(wǎng)絡(luò)原因無法通信時(shí),系統(tǒng)依然可以繼續(xù)運(yùn)行。
分布式系統(tǒng)由多個(gè)節(jié)點(diǎn)組成,就像mysql集群,由多個(gè)mysql節(jié)點(diǎn)組成。節(jié)點(diǎn)間的網(wǎng)絡(luò)通信總是不可靠的,所以我們總是要保證分布式系統(tǒng)節(jié)點(diǎn)間出現(xiàn)網(wǎng)絡(luò)故障時(shí),分布式系統(tǒng)還是可用的,這種系統(tǒng)才有意義
可用性和容錯(cuò)性的區(qū)別
很多小伙伴在這一點(diǎn)比較容易糊涂,很多網(wǎng)上的資料也是錯(cuò)誤的,針對(duì)這一點(diǎn)講的不是很清楚。
一、可用性
是針對(duì)非故障節(jié)點(diǎn),如主mysql節(jié)點(diǎn)掛了,但從mysql沒有掛,而且從mysql照樣提供服務(wù),就說明此分布式系統(tǒng)具有可用性。
(小伙伴們不要和mysql的主從切換混淆了,主從切換是mysql提供的高可用性一種方案,跟這里的可用性是兩個(gè)緯度)
二、分區(qū)容錯(cuò)性
是各個(gè)節(jié)點(diǎn)出現(xiàn)網(wǎng)絡(luò)問題時(shí),系統(tǒng)依然可用。如主Mysql和從Mysql 之間沒法通信時(shí),系統(tǒng)可用。
總結(jié):可用性針對(duì)節(jié)點(diǎn)出現(xiàn)故障,系統(tǒng)可用;分區(qū)容錯(cuò)性針對(duì)網(wǎng)絡(luò)出現(xiàn)問題,系統(tǒng)可用
CAP定理
我們了解了CAP中的三個(gè)定義,CAP定理是表示分布式系統(tǒng)只能滿足三項(xiàng)中的兩項(xiàng),而不可能滿足全部三項(xiàng)。即分布式系統(tǒng)只能滿足三種情況:CA、AP、CP。
我們來分析一下,我們先看P,也就是分區(qū)容錯(cuò)性;在分布式系統(tǒng)中,網(wǎng)絡(luò)異常是不可避免的,所以如果不保證分區(qū)容錯(cuò)性,除非節(jié)點(diǎn)間網(wǎng)絡(luò)不會(huì)發(fā)生異常,這個(gè)是不可能的(除非單機(jī)系統(tǒng),單機(jī)系統(tǒng)就不是分布式系統(tǒng))。
分布式系統(tǒng)肯定要實(shí)現(xiàn)P,那其實(shí)CA是理論上面的,其實(shí)不存在。
取舍
看一下圖
主Mysql和從Mysql之間出現(xiàn)了網(wǎng)絡(luò)異常,那研發(fā)Mysql的工程師如何去做?
場(chǎng)景一:更新操作主Mysql成功了,就返回成功
寫請(qǐng)求把用戶姓名【張三】改為【李四】,寫請(qǐng)求寫入主Mysql成功后,系統(tǒng)就直接返回成功;然后再通過主Mysql的binlog日志方式把數(shù)據(jù)同步到從Mysql。
這種方式其實(shí)是放棄了數(shù)據(jù)一致性。因?yàn)槿绻霈F(xiàn)網(wǎng)絡(luò)延遲,數(shù)據(jù)沒有及時(shí)同步到從Mysql,那就導(dǎo)致了主Mysql值為李四,而從Mysql值為張三,導(dǎo)致數(shù)據(jù)不一致。但主從mysql照樣可以提供服務(wù),也就是保證了可用性A。
即此方案為AP
場(chǎng)景二:更新操作主從mysql都成功了,才返回成功
寫請(qǐng)求把用戶姓名【張三】改為【李四】,寫請(qǐng)求一定要等到主從mysql都寫入成功了,系統(tǒng)才能成功返回。
這種方式保證了數(shù)據(jù)一致性,因?yàn)?strong>主從mysql更新數(shù)據(jù)都成功才算成功,但網(wǎng)絡(luò)出現(xiàn)問題時(shí),主mysql無法訪問從節(jié)點(diǎn),導(dǎo)致寫操作一直不成功。
其實(shí)就是放棄了可用性,只滿足CP原則,系統(tǒng)只能提供讀服務(wù)。
小伙伴們會(huì)說不是系統(tǒng)能夠提供讀服務(wù)嗎?應(yīng)該系統(tǒng)是可用的啊。我們?cè)倏纯纯捎眯缘亩x:非故障節(jié)點(diǎn),要能夠提供服務(wù)。
而這里主Mysql節(jié)點(diǎn)是正常的(符合非故障節(jié)點(diǎn)),而不能提供寫請(qǐng)求,不符合可用性原則
綜合來看,再滿足P的前提下,是不可能同時(shí)滿足C和A的。
權(quán)衡
在我們架構(gòu)師開發(fā)分布式系統(tǒng)時(shí),是需要根據(jù)業(yè)務(wù)進(jìn)行權(quán)衡的。
在我們大型互聯(lián)網(wǎng)公司,因?yàn)闄C(jī)器數(shù)量龐大,網(wǎng)絡(luò)故障是常態(tài),一般選擇AP原則,犧牲掉數(shù)據(jù)一致性。(一些金融產(chǎn)品對(duì)數(shù)據(jù)一致性要求很高的,就會(huì)選擇CP)。
小伙伴們會(huì)問,那數(shù)據(jù)很重要啊,不一致那怎么搞?
當(dāng)然有別的方案會(huì)保證數(shù)據(jù)最終一致性,也就是BASE理論的提出,小伙伴們可自行查閱。
我們看看常用的分布式系統(tǒng)的權(quán)衡:
1、Redis中間件 ----> AP
2、RocketMQ中間件 -----> AP
3、分布式事務(wù)-2pc ----> CP
4、分布式事務(wù)-最大努力嘗試 ---> AP
5、Eureka ---> AP
小伙伴們看看Mysql是屬于什么?
提醒:看看Mysql 的同步機(jī)制
總結(jié)
很多中間件核心的問題就是解決在網(wǎng)絡(luò)出現(xiàn)分區(qū)(異常)時(shí),如何把數(shù)據(jù)從多節(jié)點(diǎn)間進(jìn)行傳輸,都是在CA當(dāng)中做權(quán)衡,設(shè)計(jì)了一些方案,讓系統(tǒng)在C和A之間得到合理的控制。
原文鏈接:https://www.toutiao.com/i6716373012393755148/?
總結(jié)
以上是生活随笔為你收集整理的分布式系统CAP理论:CAP原则只能满足其中两项!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python字典嵌套实例
- 下一篇: Windows 8常用快捷键