CAP 原則
CAP 原則又稱 CAP 定理,指的是在一個(gè)分布式系統(tǒng)中住闯, Consistency(一致性)笋额、 Availability(可用性)、Partition tolerance(分區(qū)容錯(cuò)性),三者不可得兼竟痰。
CAP 由 Eric Brewer 在 2000 年 PODC 會議上提出盘榨。該猜想在提出兩年后被證明成立,成為我們熟知的 CAP 定理。CAP 三者不可兼得井佑。
特性 | 定理 |
---|---|
Consistency | 一致性属铁,也叫做數(shù)據(jù)原子性,系統(tǒng)在執(zhí)行某項(xiàng)操作后仍然處于一致的狀態(tài)躬翁。在分布式系統(tǒng)中焦蘑,更新操作執(zhí)行成功后所有的用戶都應(yīng)該讀到最新的值,這樣的系統(tǒng)被認(rèn)為是具有強(qiáng)一致性的盒发。等同于所有節(jié)點(diǎn)訪問同一份最新的數(shù)據(jù)副本例嘱。 |
Availability | 可用性,每一個(gè)操作總是能夠在一定的時(shí)間內(nèi)返回結(jié)果宁舰,這里需要注意的是"一定時(shí)間內(nèi)"和"返回結(jié)果”拼卵。一定時(shí)間內(nèi)指的是在可以容忍的范圍內(nèi)返回結(jié)果,結(jié)果可以是成功或者是失敗明吩,且不保證獲取的數(shù)據(jù)為最新數(shù)據(jù)间学。 |
Partition tolerance | 分區(qū)容錯(cuò)性,分布式系統(tǒng)在遇到任何網(wǎng)絡(luò)分區(qū)故障的時(shí)候印荔,仍然能夠?qū)ν馓峁M足一致性和可用性的服務(wù)低葫,除非整個(gè)網(wǎng)絡(luò)環(huán)境都發(fā)生了故障。 |
取舍策略
CAP 三個(gè)特性只能滿足其中兩個(gè)仍律,那么取舍的策略就共有三種:
CA without P:如果不要求P(不允許分區(qū))嘿悬,則C(強(qiáng)一致性)和A(可用性)是可以保證的。但放棄 P 的同時(shí)也就意味著放棄了系統(tǒng)的擴(kuò)展性水泉,也就是分布式節(jié)點(diǎn)受限善涨,沒辦法部署子節(jié)點(diǎn),這是違背分布式系統(tǒng)設(shè)計(jì)的初衷的草则。
CP without A:如果不要求A(可用)钢拧,相當(dāng)于每個(gè)請求都需要在服務(wù)器之間保持強(qiáng)一致,而P(分區(qū))會導(dǎo)致同步時(shí)間無限延長(也就是等待數(shù)據(jù)同步完才能正常訪問服務(wù))炕横,一旦發(fā)生網(wǎng)絡(luò)故障或者消息丟失等情況源内,就要犧牲用戶的體驗(yàn),等待所有數(shù)據(jù)全部一致了之后再讓用戶訪問系統(tǒng)份殿。設(shè)計(jì)成 CP 的系統(tǒng)其實(shí)不少膜钓,最典型的就是分布式數(shù)據(jù)庫,如 Redis卿嘲、HBase 等颂斜。對于這些分布式數(shù)據(jù)庫來說,數(shù)據(jù)的一致性是最基本的要求拾枣,因?yàn)槿绻B這個(gè)標(biāo)準(zhǔn)都達(dá)不到沃疮,那么直接采用關(guān)系型數(shù)據(jù)庫就好盒让,沒必要再浪費(fèi)資源來部署分布式數(shù)據(jù)庫。
AP without C:要高可用并允許分區(qū)忿磅,則需放棄一致性糯彬。一旦分區(qū)發(fā)生,節(jié)點(diǎn)之間可能會失去聯(lián)系葱她,為了高可用撩扒,每個(gè)節(jié)點(diǎn)只能用本地?cái)?shù)據(jù)提供服務(wù),而這樣會導(dǎo)致全局?jǐn)?shù)據(jù)的不一致性吨些。典型的應(yīng)用就如某米的搶購手機(jī)場景搓谆,可能前幾秒你瀏覽商品的時(shí)候頁面提示是有庫存的,當(dāng)你選擇完商品準(zhǔn)備下單的時(shí)候豪墅,系統(tǒng)提示你下單失敗泉手,商品已售完。這其實(shí)就是先在 A(可用性)方面保證系統(tǒng)可以正常的服務(wù)偶器,然后在數(shù)據(jù)的一致性方面做了些犧牲斩萌,雖然多少會影響一些用戶體驗(yàn),但也不至于造成用戶購物流程的嚴(yán)重阻塞屏轰。
總結(jié)
現(xiàn)如今颊郎,對于多數(shù)大型互聯(lián)網(wǎng)應(yīng)用的場景,主機(jī)眾多霎苗、部署分散姆吭,而且現(xiàn)在的集群規(guī)模越來越大,節(jié)點(diǎn)只會越來越多唁盏,所以節(jié)點(diǎn)故障内狸、網(wǎng)絡(luò)故障是常態(tài),因此分區(qū)容錯(cuò)性也就成為了一個(gè)分布式系統(tǒng)必然要面對的問題厘擂。那么就只能在 C 和 A 之間進(jìn)行取舍昆淡。但對于傳統(tǒng)的項(xiàng)目就可能有所不同,拿銀行的轉(zhuǎn)賬系統(tǒng)來說刽严,涉及到金錢的對于數(shù)據(jù)一致性不能做出一絲的讓步昂灵,C 必須保證,出現(xiàn)網(wǎng)絡(luò)故障的話港庄,寧可停止服務(wù)倔既,可以在 A 和 P 之間做取舍恕曲。而互聯(lián)網(wǎng)非金融項(xiàng)目普遍都是基于 AP 模式鹏氧。
總而言之,沒有最好的策略佩谣,好的系統(tǒng)應(yīng)該是根據(jù)業(yè)務(wù)場景來進(jìn)行架構(gòu)設(shè)計(jì)的把还,只有適合的才是最好的。
BASE 理論
CAP 理論已經(jīng)提出好多年了,難道真的沒有辦法解決這個(gè)問題嗎吊履?也許可以做些改變安皱。比如 C 不必使用那么強(qiáng)的一致性,可以先將數(shù)據(jù)存起來艇炎,稍后再更新酌伊,實(shí)現(xiàn)所謂的 “最終一致性”。
這個(gè)思路又是一個(gè)龐大的問題缀踪,同時(shí)也引出了第二個(gè)理論 BASE 理論居砖。
BASE:全稱 Basically Available(基本可用),Soft state(軟狀態(tài))驴娃,和 Eventually consistent(最終一致性)三個(gè)短語的縮寫奏候,來自 ebay 的架構(gòu)師提出。
BASE 理論是對 CAP 中一致性和可用性權(quán)衡的結(jié)果唇敞,其來源于對大型互聯(lián)網(wǎng)分布式實(shí)踐的總結(jié)蔗草,是基于 CAP 定理逐步演化而來的。其核心思想是:
既然無法做到強(qiáng)一致性(Strong consistency)疆柔,但每個(gè)應(yīng)用都可以根據(jù)自身的業(yè)務(wù)特點(diǎn)咒精,采用適當(dāng)?shù)姆绞絹硎瓜到y(tǒng)達(dá)到最終一致性(Eventual consistency)。
Basically Available(基本可用)
基本可用是指分布式系統(tǒng)在出現(xiàn)故障的時(shí)候婆硬,允許損失部分可用性(例如響應(yīng)時(shí)間狠轻、功能上的可用性)。需要注意的是彬犯,基本可用絕不等價(jià)于系統(tǒng)不可用向楼。
響應(yīng)時(shí)間上的損失:正常情況下搜索引擎需要在 0.5 秒之內(nèi)返回給用戶相應(yīng)的查詢結(jié)果,但由于出現(xiàn)故障(比如系統(tǒng)部分機(jī)房發(fā)生斷電或斷網(wǎng)故障)谐区,查詢結(jié)果的響應(yīng)時(shí)間增加到了 1~2 秒湖蜕。
功能上的損失:購物網(wǎng)站在購物高峰(如雙十一)時(shí),為了保護(hù)系統(tǒng)的穩(wěn)定性宋列,部分消費(fèi)者可能會被引導(dǎo)到一個(gè)降級頁面昭抒。
Soft state(軟狀態(tài))
什么是軟狀態(tài)呢?相對于原子性而言炼杖,要求多個(gè)節(jié)點(diǎn)的數(shù)據(jù)副本都是一致的灭返,這是一種 “硬狀態(tài)”。
軟狀態(tài)是指允許系統(tǒng)存在中間狀態(tài)坤邪,而該中間狀態(tài)不會影響系統(tǒng)整體可用性熙含。分布式存儲中一般一份數(shù)據(jù)會有多個(gè)副本,允許不同副本數(shù)據(jù)同步的延時(shí)就是軟狀態(tài)的體現(xiàn)艇纺。
Eventually consistent(最終一致性)
系統(tǒng)不可能一直是軟狀態(tài)怎静,必須有個(gè)時(shí)間期限邮弹。在期限過后,應(yīng)當(dāng)保證所有副本保持?jǐn)?shù)據(jù)一致性蚓聘。從而達(dá)到數(shù)據(jù)的最終一致性腌乡。這個(gè)時(shí)間期限取決于網(wǎng)絡(luò)延時(shí),系統(tǒng)負(fù)載夜牡,數(shù)據(jù)復(fù)制方案設(shè)計(jì)等等因素与纽。
實(shí)際上,不只是分布式系統(tǒng)使用最終一致性塘装,關(guān)系型數(shù)據(jù)庫在某個(gè)功能上渣锦,也是使用最終一致性的,比如備份氢哮,數(shù)據(jù)庫的復(fù)制都是需要時(shí)間的袋毙,這個(gè)復(fù)制過程中,業(yè)務(wù)讀取到的值就是舊值冗尤。當(dāng)然听盖,最終還是達(dá)成了數(shù)據(jù)一致性。這也算是一個(gè)最終一致性的經(jīng)典案例裂七。
總結(jié)
總的來說皆看,BASE 理論面向的是大型高可用可擴(kuò)展的分布式系統(tǒng),和傳統(tǒng)事務(wù)的 ACID 是相反的背零,它完全不同于 ACID 的強(qiáng)一致性模型腰吟,而是通過犧牲強(qiáng)一致性來獲得可用性,并允許數(shù)據(jù)在一段時(shí)間是不一致的徙瓶。
今天要說的CAP原則與BASE理論篇暫時(shí)先說這么多毛雇,了解更多技術(shù)干貨,關(guān)注公眾號【樂字節(jié)發(fā)送123可了解我們一起學(xué)習(xí)吖】侦镇,我是哩哩灵疮,一個(gè)有趣的靈魂!下期見壳繁!