程序员修神之路--晦涩难懂的CAP,是否完全正确?
微信搜一搜
架構(gòu)師修行之路
菜菜哥,幫忙解決一個(gè)問題
是不是面試又被虐了?
是的呢,這次面試官問我什么是CAP?
這個(gè)可就說來話長了......
01
PART
CAP
說到CAP,首先不能不說分布式系統(tǒng),前面幾篇也說過,分布式系統(tǒng)的出現(xiàn),很大的一個(gè)原因是要解決單機(jī)系統(tǒng)的瓶頸問題,但是工作模式上還需要保證系統(tǒng)的可用性,一致性,性能等。一個(gè)分布式系統(tǒng),網(wǎng)絡(luò)不可靠的特性必然存在,這就導(dǎo)致了分布式系統(tǒng)比單機(jī)系統(tǒng)要面對(duì)更多的不確定因素的挑戰(zhàn)。
CAP是針對(duì)分布式系統(tǒng)提出的一個(gè)重要理論,在很多開發(fā)者眼里被視為金律。CAP理論是對(duì)分布式系統(tǒng)特點(diǎn)的一個(gè)高度抽象,也是我們?cè)O(shè)計(jì)一個(gè)分布式系統(tǒng)很好的參考框架。在CAP理論提出初期,有很多人提出各種質(zhì)疑,后來CAP之父又再次給CAP理論做出了重要修正。
很多架構(gòu)師在設(shè)計(jì)系統(tǒng)的時(shí)候都以CAP理論為重要參考依據(jù),其中CAP不可能三角是最重要的指導(dǎo)思想。CAP把一個(gè)分布式系統(tǒng)抽象為三個(gè)固有屬性:
1. 一致性(Consistency):客戶端無論訪問系統(tǒng)的哪個(gè)節(jié)點(diǎn),要么讀到的數(shù)據(jù)都是最新的,要么讀取失敗。這本質(zhì)上是說分布式系統(tǒng)的所有節(jié)點(diǎn)上的數(shù)據(jù)都是實(shí)時(shí)同步的,一致性強(qiáng)調(diào)的是數(shù)據(jù)正確性。
2. 可用性(Availability):當(dāng)系統(tǒng)內(nèi)任意一個(gè)節(jié)點(diǎn)發(fā)生了故障,非故障的節(jié)點(diǎn)仍然能響應(yīng)客戶端的請(qǐng)求,無論這個(gè)響應(yīng)返回的是最新數(shù)據(jù)還是舊數(shù)據(jù)。這個(gè)特性可以看做是對(duì)客戶端的一個(gè)保證:無論何時(shí),我都能給你響應(yīng)。
3. 分區(qū)容錯(cuò)性(Partition Tolerance):即使系統(tǒng)內(nèi)部某個(gè)節(jié)點(diǎn)有消息丟失或者高延遲,系統(tǒng)仍然能持續(xù)提供服務(wù)。這個(gè)指標(biāo)強(qiáng)調(diào)的是對(duì)分布式系統(tǒng)的容錯(cuò)能力。
分布式系統(tǒng)是由通過網(wǎng)絡(luò)通信的多個(gè)節(jié)點(diǎn)組成,因?yàn)橄到y(tǒng)需要持續(xù)對(duì)外提供服務(wù),所以分區(qū)容錯(cuò)性(P)是分布式系統(tǒng)必須要保證的。三角理論這個(gè)時(shí)候就尷尬到只需要從一致性和可用性這兩個(gè)指標(biāo)中選擇一個(gè),所以有人根據(jù)這個(gè)特點(diǎn)提出:
基于CAP理論的分布式系統(tǒng),分區(qū)容錯(cuò)是固有而且必須要保證的一個(gè)指標(biāo),設(shè)計(jì)分布式系統(tǒng)要根據(jù)業(yè)務(wù)的場景來選擇一致性還是可用性。
02
PART
使用CAP理論設(shè)計(jì)系統(tǒng)
當(dāng)我們?cè)谠O(shè)計(jì)一個(gè)分布式系統(tǒng)的時(shí)候,由于分區(qū)容錯(cuò)性必須要保證,所以就演化成了是選擇AP,還是選擇CP指標(biāo)。
當(dāng)我們選擇了CP(一致性)的時(shí)候,客戶端的每次請(qǐng)求一定會(huì)讀取到最新的數(shù)據(jù),但是因?yàn)橄G失,節(jié)點(diǎn)通信高延遲等原因,被讀取的節(jié)點(diǎn)中的數(shù)據(jù)不一定是最新數(shù)據(jù),所以為了保證一致性,這個(gè)時(shí)候返回給客戶端的是出錯(cuò)信息,換句話說,這個(gè)節(jié)點(diǎn)在這個(gè)時(shí)候是不可用的。
當(dāng)我們選擇了AP(可用性)的時(shí)候,為了始終響應(yīng)客戶端的請(qǐng)求,哪怕節(jié)點(diǎn)上的信息不是最新數(shù)據(jù)也要給客戶端響應(yīng),這個(gè)時(shí)候客戶端得到的可能是過時(shí)的數(shù)據(jù)。
真實(shí)的線上系統(tǒng)環(huán)境中,其實(shí)還存在另外一個(gè)場景:隨著節(jié)點(diǎn)的不斷增加,嚴(yán)格的一致性會(huì)導(dǎo)致系統(tǒng)的響應(yīng)時(shí)間變慢,系統(tǒng)資源消耗的增加,這個(gè)時(shí)候?yàn)榱司S護(hù)強(qiáng)一致性的成本可能要超出我們的預(yù)期,在這種情況下,我們就只剩下了一種選擇:更多的選擇可用性,放棄強(qiáng)一致性,采用最終一致性。
退一步說,在分布式系統(tǒng)節(jié)點(diǎn)不是很多的情況下,CAP三個(gè)指標(biāo)在一定程度上是可以同時(shí)能夠保證的。但是針對(duì)分布式數(shù)據(jù)庫事務(wù)領(lǐng)域,后來的專家已經(jīng)證實(shí)并不適用于CAP。
舉一個(gè)很簡單的例子:如果要設(shè)計(jì)一套分布式的日志收集系統(tǒng)改如何選擇呢?俗話說脫離業(yè)務(wù)的架構(gòu)就是耍流氓,具體的系統(tǒng)設(shè)計(jì)還要看每個(gè)業(yè)務(wù)的場景。日志收集的分布式系統(tǒng)很典型的一個(gè)特點(diǎn)是:讀少寫多,數(shù)據(jù)重要性級(jí)別低,數(shù)據(jù)量大,可以容忍部分?jǐn)?shù)據(jù)丟失。這樣的場景下,我們可以優(yōu)先選擇AP,能持續(xù)的提供服務(wù)比數(shù)據(jù)一致性要重要很多。
再舉一個(gè)簡單例子:每個(gè)公司有自己的配置中心,配置中心中可能會(huì)存儲(chǔ)分布式系統(tǒng)重要的配置信息,比如:每個(gè)節(jié)點(diǎn)的IP和端口信息等。在這樣的系統(tǒng)中,客戶端每次讀取配置中心的信息要求必須為最新數(shù)據(jù),如果不是最新數(shù)據(jù)會(huì)發(fā)生業(yè)務(wù)錯(cuò)誤信息,比如一個(gè)分布式系統(tǒng)中A節(jié)點(diǎn)掛掉了,配置中心中所有的節(jié)點(diǎn)數(shù)據(jù)必須要保證一致(刪除A節(jié)點(diǎn)信息),不然的話,客戶端還能讀到A節(jié)點(diǎn)的信息,然后去訪問A節(jié)點(diǎn)會(huì)發(fā)生業(yè)務(wù)異常的。
03
PART
BASE理論
由于CAP原則在只能在AP和CP之間二選一,而且在選擇強(qiáng)一致性的同時(shí)會(huì)大大犧牲性能,這對(duì)于并發(fā)和響應(yīng)時(shí)間都有要求的系統(tǒng)都是難以接受的。于是eBay公司嘗試選擇了不同的方案,提出了一套名為BASE的理論。
BASE理論基本思想是犧牲了數(shù)據(jù)一致性來滿足系統(tǒng)的可用性,在系統(tǒng)發(fā)生故障或者部分?jǐn)?shù)據(jù)不一致的時(shí)候,扔能提供系統(tǒng)“主要可用”。
BASE:全稱:Basically Available(基本可用),Soft state(軟狀態(tài)),和 Eventually consistent(最終一致性)三個(gè)短語的縮寫
BASE理論是對(duì)CAP理論的一個(gè)延伸,或者說是對(duì)AP模型的一個(gè)延伸,它是對(duì)互聯(lián)網(wǎng)大規(guī)模分布式系統(tǒng)的一個(gè)總結(jié),強(qiáng)調(diào)的是可用性。
Basically Available(基本可用)
基本可用不同的系統(tǒng)有不同的解釋,但是總體思想是保證系統(tǒng)大部分可用。
在一個(gè)分片的分布式存儲(chǔ)系統(tǒng)中,假設(shè)有10個(gè)節(jié)點(diǎn)來存儲(chǔ)數(shù)據(jù),假設(shè)其中兩個(gè)節(jié)點(diǎn)發(fā)生故障,那么其他8個(gè)節(jié)點(diǎn)仍然能提供服務(wù),既:系統(tǒng)的80%仍然可用。
我們平時(shí)用的流量削峰策略,其實(shí)本質(zhì)上也是要保證系統(tǒng)的主要可用。服務(wù)降級(jí),服務(wù)熔斷也是通過犧牲一部分系統(tǒng)的可用性來保證核心功能可用。
以上所說都說明了一個(gè)事實(shí):基本可用本質(zhì)上是一種妥協(xié),在節(jié)點(diǎn)出現(xiàn)故障的時(shí)候通過犧牲非核心功能的可用性,來保證核心功能的可用性。
Soft state(軟狀態(tài))
對(duì)于服務(wù)端的系統(tǒng)來說,每個(gè)節(jié)點(diǎn)或者服務(wù)都可以設(shè)計(jì)為有狀態(tài)(stateful)和無狀態(tài)(stateless),這在根本上決定了一個(gè)分布式系統(tǒng)是否具有良好的擴(kuò)展性,故障恢復(fù)等高級(jí)特性。對(duì)于完全無狀態(tài)的服務(wù)來說,具有更好的水平擴(kuò)展性,而對(duì)于有狀態(tài)的服務(wù)來說,如果要實(shí)現(xiàn)水平擴(kuò)展,可能涉及到狀態(tài)的遷移等過程,比較復(fù)雜。
基于有狀態(tài)和無狀態(tài)的思想,BASE理論提出一個(gè)介于中間的狀態(tài):soft state:服務(wù)端會(huì)維護(hù)數(shù)據(jù)的狀態(tài),但是有一個(gè)期限,過了這個(gè)期限,服務(wù)端將會(huì)丟棄這些狀態(tài)信息,恢復(fù)正常的狀態(tài)。
Eventually consistent(最終一致性)
最終一致性是指系統(tǒng)在經(jīng)過一段時(shí)間內(nèi),每個(gè)節(jié)點(diǎn)的數(shù)據(jù)會(huì)達(dá)到一個(gè)一致的狀態(tài),換句話說,它是必須經(jīng)過一段時(shí)間才能達(dá)到強(qiáng)一致性的過程。
由于強(qiáng)一致性的缺陷,現(xiàn)在幾乎所有的互聯(lián)網(wǎng)系統(tǒng)都是基于最終一致性來設(shè)計(jì)架構(gòu),當(dāng)然如果最終一致性不滿足業(yè)務(wù)場景的情況下,才會(huì)使用犧牲性能和可用性來采用強(qiáng)一致性。比如在支付的場景中,必須要采用強(qiáng)一致性來設(shè)計(jì)系統(tǒng),不然這個(gè)鍋是程序員背不起的。
至于如何實(shí)現(xiàn)最終一致性,有很多的解決方案,目前最常用的是利用MQ消息來實(shí)現(xiàn),前提是你的MQ需要保證不丟失消息。舉個(gè)很簡單的例子:一個(gè)典型的電商場景,商品管理系統(tǒng)和訂單系統(tǒng)是兩個(gè)物理上隔離的兩個(gè)系統(tǒng),可以看做是兩個(gè)微服務(wù),當(dāng)一個(gè)訂單支付成功之后,商品管理系統(tǒng)需要把對(duì)應(yīng)的商品減少庫存,這個(gè)過程可以采用最終一致性來設(shè)計(jì)。當(dāng)訂單支付成功,發(fā)一個(gè)mq消息,當(dāng)商品管理系統(tǒng)接收到這個(gè)消息,會(huì)把對(duì)應(yīng)商品的庫存扣掉。
04
PART
寫在最后
CAP理論是分布式設(shè)計(jì)中一個(gè)重要的參考指標(biāo),但是這個(gè)理論并非放之四海而皆準(zhǔn)的思想,它的適用場景僅僅在非數(shù)據(jù)庫系統(tǒng)的原子讀寫。在互聯(lián)網(wǎng)高速發(fā)展的今天,分布式系統(tǒng)早已不是之前的簡單系統(tǒng)了,架構(gòu)師在設(shè)計(jì)系統(tǒng)中還需要考慮安全性,擴(kuò)展性,自動(dòng)化等諸多因素,所以現(xiàn)在做程序員多累呀!!
BASE理論繞過了難以實(shí)現(xiàn)的分布式強(qiáng)一致性,采用一種權(quán)衡的策略來達(dá)到業(yè)務(wù)要求。BASE理論主要針對(duì)數(shù)據(jù)分片場景,讓不同的數(shù)據(jù)分布在不同的節(jié)點(diǎn),以提升系統(tǒng)的可用性。
END
●程序員修神之路--為什么我會(huì)了SOA,你們還要逼我學(xué)微服務(wù)?
●程序員過關(guān)斬將--數(shù)據(jù)庫的樂觀鎖和悲觀鎖并非真實(shí)的鎖
●程序員修神之路--設(shè)計(jì)一套R(shí)PC框架并非易事
●程序員過關(guān)斬將--要想獲取我的用戶信息,就得按照規(guī)矩來
●程序員過關(guān)斬將--更加優(yōu)雅的Token認(rèn)證方式JWT
●程序員過關(guān)斬將--cookie和session的關(guān)系其實(shí)很簡單
●程序員修神之路--用NOSql給高并發(fā)系統(tǒng)加速
●程序員修神之路--高并發(fā)系統(tǒng)設(shè)計(jì)負(fù)載均衡架構(gòu)
●程序員過關(guān)斬將--你為什么還在用存儲(chǔ)過程?
●程序員修神之路--問世間異步為何物?
●程序員修神之路--提高網(wǎng)站的吞吐
長按添加菜菜好友
關(guān)注后回復(fù):“大禮包”和“福利”,領(lǐng)取驚喜
點(diǎn)分享
點(diǎn)點(diǎn)贊
點(diǎn)在看
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的程序员修神之路--晦涩难懂的CAP,是否完全正确?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 7.30 KubeCon2020 | 今
- 下一篇: 如何隐藏运行 winform 程序?