深入理解 CAP 定理
深入理解 CAP 定理
- 什么是 CAP 定理
- 結(jié)點(diǎn)、系統(tǒng)、集群
- 一致性、可用性、分區(qū)容錯(cuò)性
- 一致性、可用性、分區(qū)容錯(cuò)性之間的區(qū)別
- 為什么不能同時(shí)滿足 CAP
- 總結(jié)
什么是 CAP 定理
??CAP 定理是分布式系統(tǒng)中必定要了解的內(nèi)容。它指的是,對于一個(gè)分布式系統(tǒng),一致性(Consistency)、可用性(Availability)、分區(qū)容錯(cuò)性(Partition tolerance)最多只能同時(shí)滿足其中兩個(gè)。
??什么是一致性、可用性、分區(qū)容錯(cuò)性呢?在介紹這幾個(gè)概念前,先介紹本文需要涉及的三個(gè)概念:結(jié)點(diǎn)、系統(tǒng)、集群。
結(jié)點(diǎn)、系統(tǒng)、集群
-
結(jié)點(diǎn):參與儲存某數(shù)據(jù)的不可再分的服務(wù)器稱為結(jié)點(diǎn)。
-
整個(gè)系統(tǒng):參與儲存某數(shù)據(jù)的所有結(jié)點(diǎn)構(gòu)成整個(gè)系統(tǒng)。
-
集群:將整個(gè)系統(tǒng)對應(yīng)的無向圖分為若干互不相連的連通圖。其中每個(gè)連通圖對應(yīng)一個(gè)集群。其中,無向圖、連通圖為離散數(shù)學(xué)中的概念,這里不做詳解。
-
系統(tǒng):參與儲存某數(shù)據(jù)的若干集群構(gòu)成一個(gè)系統(tǒng)。
【說明】
??此處是在數(shù)學(xué)層面上給出集群的抽象定義。在計(jì)算機(jī)領(lǐng)域中,集群指的是滿足如下條件的進(jìn)程的集合。
-
這些進(jìn)程之間相對獨(dú)立(這些進(jìn)程彼此之間沒有進(jìn)程創(chuàng)建上的父子關(guān)系)。
-
這些進(jìn)程可以在同一個(gè)主機(jī)上,通過占用這臺主機(jī)上不同的端口號來運(yùn)行,也可以運(yùn)行在不同的主機(jī)中,而這些主機(jī)之間可以通過計(jì)算機(jī)網(wǎng)絡(luò)等通信技術(shù)來相互連接。
-
這些進(jìn)程可以通過計(jì)算機(jī)網(wǎng)絡(luò)等通信技術(shù)來同步它們之間的數(shù)據(jù),從而使它們彼此之間的行為受到一定的制約。
-
這些進(jìn)程之間都同時(shí)使用了計(jì)算機(jī)網(wǎng)絡(luò)等通信技術(shù)之外的某一類技術(shù),如 Redis 集群之間都使用了 Redis 技術(shù),Zookeeper 集群之間都使用了 Zookeeper 技術(shù)等等。
??結(jié)點(diǎn)、集群、系統(tǒng)如圖 1 所示。
圖 1??為了簡化說明,本文再介紹如下約定及概念:
-
本文中的系統(tǒng)均指分布式系統(tǒng)。整個(gè)系統(tǒng)中可以只有一個(gè)集群,但不能只有一個(gè)結(jié)點(diǎn)。
-
客戶端對服務(wù)端訪問的最小粒度為系統(tǒng)。即客戶端只能對系統(tǒng)進(jìn)行通信,而不能直接與結(jié)點(diǎn)進(jìn)行通信。
-
本文中的系統(tǒng)均為需要對外提供通信服務(wù)的系統(tǒng),即便系統(tǒng)是內(nèi)部發(fā)生故障之后也是如此。
-
當(dāng)客戶端對系統(tǒng)發(fā)出請求時(shí),只要該系統(tǒng)中有一個(gè)結(jié)點(diǎn)進(jìn)行了響應(yīng),就視為系統(tǒng)進(jìn)行了響應(yīng)。
-
集群中的所有結(jié)點(diǎn)必定是連通的。如果集群中某結(jié)點(diǎn)或鏈路發(fā)生故障,則該集群有可能變成多個(gè)集群。
-
數(shù)據(jù):當(dāng)客戶端對系統(tǒng)發(fā)出請求時(shí),系統(tǒng)反饋信息的全部內(nèi)容。
-
數(shù)據(jù)版本:數(shù)據(jù)是可能時(shí)刻被更新的。某數(shù)據(jù)在某時(shí)刻的完整內(nèi)容為該數(shù)據(jù)的一個(gè)數(shù)據(jù)版本。
-
系統(tǒng)中的最新數(shù)據(jù):在系統(tǒng)所有的結(jié)點(diǎn)中,最新版本的數(shù)據(jù)。
-
本 CAP 定理是建立在極大似然估計(jì)、長期這個(gè)兩個(gè)意義之上的。
-
不管使用任何技術(shù)來防范,如果系統(tǒng)中所有的結(jié)點(diǎn)都長期同時(shí)發(fā)生故障,這都必定同時(shí)不滿足 CAP 定理(一致性、可用性、分區(qū)容錯(cuò)性)中的任何一個(gè)。但這里認(rèn)為 :
-
系統(tǒng)中所有的結(jié)點(diǎn)同時(shí)發(fā)生永久性故障 是不可能事件。
-
系統(tǒng)中某結(jié)點(diǎn)發(fā)生永久性故障 是不可能事件。
-
系統(tǒng)中某結(jié)點(diǎn)之間的鏈路短期發(fā)生故障 是可能事件。
-
系統(tǒng)中某結(jié)點(diǎn)短期發(fā)生故障 是可能事件。當(dāng)某結(jié)點(diǎn)短期發(fā)生故障時(shí),也認(rèn)為與該結(jié)點(diǎn)相連的鏈路也同時(shí)發(fā)生故障。
-
短期所有結(jié)點(diǎn)、鏈路都不發(fā)生任何故障 是可能事件。
-
故障是隨機(jī)的,不可能使用某種算法提前準(zhǔn)確預(yù)知的。
-
數(shù)據(jù)總是時(shí)刻隨機(jī)變化的,通過以往數(shù)據(jù)精確預(yù)知某數(shù)據(jù)的變化是不可能的。
-
-
CAP 是建立在長遠(yuǎn)來看的實(shí)現(xiàn)。短期是可能同時(shí)滿足 CAP 的,CAP 定理針對的長期情況下的滿足,而長期來講,任何結(jié)點(diǎn)、鏈路都有可能發(fā)生故障。
(極大似然估計(jì)、不可能事件、可能事件均為概率論中的概念,這里不做詳解。)
-
一致性、可用性、分區(qū)容錯(cuò)性
??下面來解釋什么是一致性、可用性、分區(qū)容錯(cuò)性。
-
一致性:當(dāng)每次客戶端對系統(tǒng)發(fā)出請求后,若直至該系統(tǒng)進(jìn)行響應(yīng)前,系統(tǒng)的連通性不發(fā)生變化。當(dāng)該系統(tǒng)進(jìn)行響應(yīng)時(shí),反饋的數(shù)據(jù)是 系統(tǒng)中的最新完整數(shù)據(jù),則稱該系統(tǒng)滿足一致性。
【注意】
-
一致性是針對系統(tǒng)響應(yīng)信息之時(shí)來說的。如果該系統(tǒng)不及時(shí)進(jìn)行響應(yīng),不能認(rèn)為該系統(tǒng)不滿足一致性。即對于一致性,系統(tǒng)可以選擇等到能保證一致性時(shí)再進(jìn)行響應(yīng)來保證。
如果系統(tǒng)一直不進(jìn)行響應(yīng),則這種情況對一致性來說是未定義的。即無法界定該系統(tǒng)是否滿足一致性,但一般認(rèn)為此時(shí)系統(tǒng)至少不滿足可用性。研究人員可以增加附加條件來對此情況進(jìn)行界定,比如強(qiáng)制規(guī)定一個(gè)最晚響應(yīng)時(shí)間。如果系統(tǒng)超過這個(gè)時(shí)間沒有進(jìn)行響應(yīng),就認(rèn)為該系統(tǒng)響應(yīng)的是一個(gè)空白數(shù)據(jù)。此時(shí)就相當(dāng)于將一直不進(jìn)行響應(yīng)當(dāng)作是不滿足一致性。
-
如果系統(tǒng)中有某結(jié)點(diǎn)發(fā)生故障,則此時(shí)對客戶端反饋的信息必定不能滿足一致性。但認(rèn)為沒有結(jié)點(diǎn)會發(fā)生永久性的故障。
-
本文中的系統(tǒng)均指分布式系統(tǒng)。系統(tǒng)中可以只有一個(gè)集群,但不能只有一個(gè)結(jié)點(diǎn)。不能通過在系統(tǒng)中只使用一個(gè)結(jié)點(diǎn)來達(dá)成一致性。
-
任何結(jié)點(diǎn)上的數(shù)據(jù)都可能動態(tài)變化,不能認(rèn)定數(shù)據(jù)未來不再變化而實(shí)現(xiàn)一致性。
-
-
可用性:若當(dāng)每次客戶端對系統(tǒng)發(fā)出請求,到該系統(tǒng)進(jìn)行響應(yīng)之間的時(shí)間,小于一個(gè)事先約定的定值,則稱該系統(tǒng)滿足可用性。
【注意】
- 此定值可長可短,但要是一個(gè)與“技術(shù)攻關(guān)用時(shí)”、“網(wǎng)絡(luò)恢復(fù)通暢用時(shí)”無關(guān)的值。
-
分區(qū)容錯(cuò)性:對于不同的場景要求,可以是以下定義之一:
-
對于有可能發(fā)生故障的鏈路,即便是已經(jīng)發(fā)生故障,此時(shí)當(dāng)每次客戶端對任意系統(tǒng)發(fā)出請求后,該系統(tǒng)進(jìn)行響應(yīng)時(shí),反饋的數(shù)據(jù)都令人滿意,則稱該系統(tǒng)滿足分區(qū)容錯(cuò)性。
-
對于有可能發(fā)生故障的鏈路,即便是已經(jīng)發(fā)生故障,此時(shí)當(dāng)每次客戶端對任意系統(tǒng)發(fā)出請求后,該系統(tǒng)進(jìn)行響應(yīng)時(shí),反饋的數(shù)據(jù)是任意一個(gè)版本的完整數(shù)據(jù),則稱該系統(tǒng)滿足分區(qū)容錯(cuò)性。
【注意】
-
分區(qū)容錯(cuò)性中的分區(qū),對應(yīng)這里的系統(tǒng)。
-
分區(qū)容錯(cuò)性是針對系統(tǒng)響應(yīng)信息之時(shí)來說的。如果該系統(tǒng)不及時(shí)進(jìn)行響應(yīng),不能認(rèn)為該系統(tǒng)不滿足分區(qū)容錯(cuò)性。即對于分區(qū)容錯(cuò)性,系統(tǒng)可以選擇等到能保證分區(qū)容錯(cuò)性時(shí)再進(jìn)行響應(yīng)來保證。
-
完整數(shù)據(jù)可以分散到系統(tǒng)的多個(gè)結(jié)點(diǎn)中。如果系統(tǒng)中所有結(jié)點(diǎn)合起來都不能提供完整的數(shù)據(jù),則認(rèn)為此時(shí)該系統(tǒng)不滿足分區(qū)容錯(cuò)性。
特別地,如果某系統(tǒng)中只有一個(gè)結(jié)點(diǎn),則認(rèn)為該系統(tǒng)不滿足分區(qū)容錯(cuò)性。因?yàn)槿绻摻Y(jié)點(diǎn)故障,則該系統(tǒng)就不能對外提供服務(wù)。
-
-
一致性、可用性、分區(qū)容錯(cuò)性之間的區(qū)別
-
一致性、可用性之間的區(qū)別:
這兩個(gè)概念很容易區(qū)分,從略。
-
分區(qū)容錯(cuò)性、可用性之間的區(qū)別:
這兩個(gè)概念很容易區(qū)分,從略。
-
一致性、分區(qū)容錯(cuò)性之間的區(qū)別:
一致性描述的是當(dāng)系統(tǒng)沒有發(fā)生故障時(shí)的響應(yīng)情況。而分區(qū)容錯(cuò)性描述的是系統(tǒng)沒有發(fā)生故障和已經(jīng)發(fā)生可能故障時(shí)的響應(yīng)情況,且一致性對響應(yīng)的要求強(qiáng)于分區(qū)容錯(cuò)性。
一致性與分區(qū)容錯(cuò)性描述的時(shí)系統(tǒng)在不同條件下的表現(xiàn),它們之間沒有包含關(guān)系,只是概念上有些相交。當(dāng)一致性被滿足時(shí),分區(qū)容錯(cuò)性未必會被滿足。
為什么不能同時(shí)滿足 CAP
??假設(shè)已經(jīng)滿足了 CAP 中的兩者:
-
CP:如果滿足了一致性,則系統(tǒng)中各結(jié)點(diǎn)必定連通。但系統(tǒng)的連通不是永恒的,如果由于關(guān)鍵性的故障,系統(tǒng)被分成多個(gè)集群,此時(shí)就需要一些時(shí)間來等待故障被消除,因此此時(shí)不能滿足 A。
-
AP:如果滿足了可用性與分區(qū)容錯(cuò)性,說明系統(tǒng)中的各個(gè)集群都能做到獨(dú)立工作和及時(shí)反饋。如果此時(shí)要求還要滿足一致性,則會破壞它們之間的獨(dú)立性,從而影響它們之中的可用性。
-
CA:如果滿足了一致性,則系統(tǒng)中各結(jié)點(diǎn)必定連通。如果同時(shí)滿足 CA,則要求系統(tǒng)中各結(jié)點(diǎn)一直保持連通。這就會導(dǎo)致系統(tǒng)對鏈路故障零容忍。因?yàn)槿绻到y(tǒng)中發(fā)生了關(guān)鍵性的故障,系統(tǒng)內(nèi)部將被劃分成互不相連的多個(gè)集群。由于不能與其它集群進(jìn)行通信,所以每個(gè)集群都不能保證自己的數(shù)據(jù)是最新數(shù)據(jù),如果還要求它們即時(shí)反饋,則將不滿足一致性。
總結(jié)
-
CAP 之間的側(cè)重點(diǎn)各有不同:
-
一致性代表著系統(tǒng)之間能否實(shí)現(xiàn)數(shù)據(jù)同步。
-
可用性代表著系統(tǒng)能否實(shí)現(xiàn)對外的即時(shí)反饋。
-
分區(qū)容錯(cuò)性指的是系統(tǒng)之間的獨(dú)立性。
-
-
一般會優(yōu)先實(shí)現(xiàn)分區(qū)容錯(cuò)性、可用性。
總結(jié)
以上是生活随笔為你收集整理的深入理解 CAP 定理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux 下 Redis 安装教程
- 下一篇: 不使用 Maven 等构建工具,而使用原