日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 综合教程 >内容正文

综合教程

高可用架构:CAP原理

發(fā)布時(shí)間:2023/12/2 综合教程 37 生活家
生活随笔 收集整理的這篇文章主要介紹了 高可用架构:CAP原理 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

CAP定義

在一個(gè)分布式系統(tǒng)(指互相連接并共享數(shù)據(jù)的節(jié)點(diǎn)的集合)中,當(dāng)涉及讀寫(xiě)操作時(shí),只能保證一致性(Consistence)、可用性(Availability)、分區(qū)容錯(cuò)性(Partition Tolerance)三者中的兩個(gè),另外一個(gè)必須被犧牲。

分布式系統(tǒng)并不一定會(huì)互聯(lián)和共享數(shù)據(jù)。最簡(jiǎn)單的例如 Memcache 的集群,相互之間就沒(méi)有連接和共享數(shù)據(jù),因此 Memcache 集群這類(lèi)分布式系統(tǒng)就不符合 CAP 理論探討的對(duì)象;而 MySQL 集群就是互聯(lián)和進(jìn)行數(shù)據(jù)復(fù)制的,因此是 CAP 理論探討的對(duì)象。

CAP 關(guān)注的是對(duì)數(shù)據(jù)的讀寫(xiě)操作,而不是分布式系統(tǒng)的所有功能。

  1. 一致性(Consistency):
    對(duì)某個(gè)指定的客戶(hù)端來(lái)說(shuō),讀操作保證能夠返回最新的寫(xiě)操作結(jié)果。

對(duì)于系統(tǒng)執(zhí)行事務(wù)來(lái)說(shuō),在事務(wù)執(zhí)行過(guò)程中,系統(tǒng)其實(shí)處于一個(gè)不一致的狀態(tài),不同的節(jié)點(diǎn)的數(shù)據(jù)并不完全一致,因此第一版的解釋“All nodes see the same data at the same time”是不嚴(yán)謹(jǐn)?shù)摹6诙鎻?qiáng)調(diào) client 讀操作能夠獲取最新的寫(xiě)結(jié)果就沒(méi)有問(wèn)題,因?yàn)槭聞?wù)在執(zhí)行過(guò)程中,client 是無(wú)法讀取到未提交的數(shù)據(jù)的,只有等到事務(wù)提交后,client 才能讀取到事務(wù)寫(xiě)入的數(shù)據(jù),而如果事務(wù)失敗則會(huì)進(jìn)行回滾,client 也不會(huì)讀取到事務(wù)中間寫(xiě)入的數(shù)據(jù)。
2. 可用性(Availability)
非故障的節(jié)點(diǎn)在合理的時(shí)間內(nèi)返回合理的響應(yīng)(不是錯(cuò)誤和超時(shí)的響應(yīng))。

  1. 分區(qū)容忍性(Partition Tolerance)
    當(dāng)出現(xiàn)網(wǎng)絡(luò)分區(qū)后,系統(tǒng)能夠繼續(xù)“履行職責(zé)”。

CAP 應(yīng)用

雖然 CAP 理論定義是三個(gè)要素中只能取兩個(gè),但放到分布式環(huán)境下來(lái)思考,我們會(huì)發(fā)現(xiàn)必須選擇 P(分區(qū)容忍)要素,因?yàn)榫W(wǎng)絡(luò)本身無(wú)法做到 100% 可靠,有可能出故障,所以分區(qū)是一個(gè)必然的現(xiàn)象。如果我們選擇了 CA 而放棄了 P,那么當(dāng)發(fā)生分區(qū)現(xiàn)象時(shí),為了保證 C,系統(tǒng)需要禁止寫(xiě)入,當(dāng)有寫(xiě)入請(qǐng)求時(shí),系統(tǒng)返回 error(例如,當(dāng)前系統(tǒng)不允許寫(xiě)入),這又和 A 沖突了,因?yàn)?A 要求返回 no error 和 no timeout。因此,分布式系統(tǒng)理論上不可能選擇 CA 架構(gòu),只能選擇 CP 或者 AP 架構(gòu)。

1.CP - Consistency/Partition Tolerance如下圖所示,為了保證一致性,當(dāng)發(fā)生分區(qū)現(xiàn)象后,N1 節(jié)點(diǎn)上的數(shù)據(jù)已經(jīng)更新到 y,但由于 N1 和 N2 之間的復(fù)制通道中斷,數(shù)據(jù) y 無(wú)法同步到 N2,N2 節(jié)點(diǎn)上的數(shù)據(jù)還是 x。這時(shí)客戶(hù)端 C 訪問(wèn) N2 時(shí),N2 需要返回 Error,提示客戶(hù)端 C“系統(tǒng)現(xiàn)在發(fā)生了錯(cuò)誤”,這種處理方式違背了可用性(Availability)的要求,因此 CAP 三者只能滿(mǎn)足 CP。

2.AP - Availability/Partition Tolerance

如下圖所示,為了保證可用性,當(dāng)發(fā)生分區(qū)現(xiàn)象后,N1 節(jié)點(diǎn)上的數(shù)據(jù)已經(jīng)更新到 y,但由于 N1 和 N2 之間的復(fù)制通道中斷,數(shù)據(jù) y 無(wú)法同步到 N2,N2 節(jié)點(diǎn)上的數(shù)據(jù)還是 x。這時(shí)客戶(hù)端 C 訪問(wèn) N2 時(shí),N2 將當(dāng)前自己擁有的數(shù)據(jù) x 返回給客戶(hù)端 C 了,而實(shí)際上當(dāng)前最新的數(shù)據(jù)已經(jīng)是 y 了,這就不滿(mǎn)足一致性(Consistency)的要求了,因此 CAP 三者只能滿(mǎn)足 AP。注意:這里 N2 節(jié)點(diǎn)返回 x,雖然不是一個(gè)“正確”的結(jié)果,但是一個(gè)“合理”的結(jié)果,因?yàn)?x 是舊的數(shù)據(jù),并不是一個(gè)錯(cuò)亂的值,只是不是最新的數(shù)據(jù)而已。

CAP注意事項(xiàng)

CAP關(guān)注的粒度是數(shù)據(jù),而不是整個(gè)系統(tǒng)

C與A之間的取舍可以在同一個(gè)系統(tǒng)內(nèi)以非常細(xì)小的粒度反復(fù)發(fā)生,而每次的決策可能因?yàn)榫唧w的操作,影響到用戶(hù)或數(shù)據(jù)。

在 CAP 理論落地實(shí)踐時(shí),我們需要將系統(tǒng)內(nèi)的數(shù)據(jù)按照不同的應(yīng)用場(chǎng)景和要求進(jìn)行分類(lèi),每類(lèi)數(shù)據(jù)選擇不同的策略(CP 還是 AP),而不是直接限定整個(gè)系統(tǒng)所有數(shù)據(jù)都是同一策略。

CAP 是忽略網(wǎng)絡(luò)延遲的。

這是一個(gè)非常隱含的假設(shè),布魯爾在定義一致性時(shí),并沒(méi)有將延遲考慮進(jìn)去。也就是說(shuō),當(dāng)事務(wù)提交時(shí),數(shù)據(jù)能夠瞬間復(fù)制到所有節(jié)點(diǎn)。但實(shí)際情況下,從節(jié)點(diǎn) A 復(fù)制數(shù)據(jù)到節(jié)點(diǎn) B,總是需要花費(fèi)一定時(shí)間的。如果是相同機(jī)房,耗費(fèi)時(shí)間可能是幾毫秒;如果是跨地域的機(jī)房,例如北京機(jī)房同步到廣州機(jī)房,耗費(fèi)的時(shí)間就可能是幾十毫秒。這就意味著,CAP 理論中的 C 在實(shí)踐中是不可能完美實(shí)現(xiàn)的,在數(shù)據(jù)復(fù)制的過(guò)程中,節(jié)點(diǎn) A 和節(jié)點(diǎn) B 的數(shù)據(jù)并不一致。

不要小看了這幾毫秒或者幾十毫秒的不一致,對(duì)于某些嚴(yán)苛的業(yè)務(wù)場(chǎng)景,例如和金錢(qián)相關(guān)的用戶(hù)余額,或者和搶購(gòu)相關(guān)的商品庫(kù)存,技術(shù)上是無(wú)法做到分布式場(chǎng)景下完美的一致性的。而業(yè)務(wù)上必須要求一致性,因此單個(gè)用戶(hù)的余額、單個(gè)商品的庫(kù)存,理論上要求選擇 CP 而實(shí)際上 CP 都做不到,只能選擇 CA。也就是說(shuō),只能單點(diǎn)寫(xiě)入,其他節(jié)點(diǎn)做備份,無(wú)法做到分布式情況下多點(diǎn)寫(xiě)入。

需要注意的是,這并不意味著這類(lèi)系統(tǒng)無(wú)法應(yīng)用分布式架構(gòu),只是說(shuō)“單個(gè)用戶(hù)余額、單個(gè)商品庫(kù)存”無(wú)法做分布式,但系統(tǒng)整體還是可以應(yīng)用分布式架構(gòu)的。例如,下面的架構(gòu)圖是常見(jiàn)的將用戶(hù)分區(qū)的分布式架構(gòu)。


我們可以將用戶(hù) id 為 0 ~ 100 的數(shù)據(jù)存儲(chǔ)在 Node 1,將用戶(hù) id 為 101 ~ 200 的數(shù)據(jù)存儲(chǔ)在 Node 2,Client 根據(jù)用戶(hù) id 來(lái)決定訪問(wèn)哪個(gè) Node。對(duì)于單個(gè)用戶(hù)來(lái)說(shuō),讀寫(xiě)操作都只能在某個(gè)節(jié)點(diǎn)上進(jìn)行;對(duì)所有用戶(hù)來(lái)說(shuō),有一部分用戶(hù)的讀寫(xiě)操作在 Node 1 上,有一部分用戶(hù)的讀寫(xiě)操作在 Node 2 上。

這樣的設(shè)計(jì)有一個(gè)很明顯的問(wèn)題就是某個(gè)節(jié)點(diǎn)故障時(shí),這個(gè)節(jié)點(diǎn)上的用戶(hù)就無(wú)法進(jìn)行讀寫(xiě)操作了,但站在整體上來(lái)看,這種設(shè)計(jì)可以降低節(jié)點(diǎn)故障時(shí)受影響的用戶(hù)的數(shù)量和范圍,畢竟只影響 20% 的用戶(hù)肯定要比影響所有用戶(hù)要好。這也是為什么挖掘機(jī)挖斷光纜后,支付寶只有一部分用戶(hù)會(huì)出現(xiàn)業(yè)務(wù)異常,而不是所有用戶(hù)業(yè)務(wù)異常的原因。

放棄并不等于什么都不做,需要為分區(qū)恢復(fù)后做準(zhǔn)備。

CAP 理論告訴我們?nèi)咧荒苋蓚€(gè),需要“犧牲”(sacrificed)另外一個(gè),這里的“犧牲”是有一定誤導(dǎo)作用的,因?yàn)椤盃奚弊尯芏嗳死斫獬墒裁炊疾蛔觥?shí)際上,CAP 理論的“犧牲”只是說(shuō)在分區(qū)過(guò)程中我們無(wú)法保證 C 或者 A,但并不意味著什么都不做。因?yàn)樵谙到y(tǒng)整個(gè)運(yùn)行周期中,大部分時(shí)間都是正常的,發(fā)生分區(qū)現(xiàn)象的時(shí)間并不長(zhǎng)。例如,99.99% 可用性(俗稱(chēng) 4 個(gè) 9)的系統(tǒng),一年運(yùn)行下來(lái),不可用的時(shí)間只有 50 分鐘;99.999%(俗稱(chēng) 5 個(gè) 9)可用性的系統(tǒng),一年運(yùn)行下來(lái),不可用的時(shí)間只有 5 分鐘。分區(qū)期間放棄 C 或者 A,并不意味著永遠(yuǎn)放棄 C 和 A,我們可以在分區(qū)期間進(jìn)行一些操作,從而讓分區(qū)故障解決后,系統(tǒng)能夠重新達(dá)到 CA 的狀態(tài)。

ACID

1.Atomicity(原子性)

一個(gè)事務(wù)中的所有操作,要么全部完成,要么全部不完成,不會(huì)在中間某個(gè)環(huán)節(jié)結(jié)束。事務(wù)在執(zhí)行過(guò)程中發(fā)生錯(cuò)誤,會(huì)被回滾到事務(wù)開(kāi)始前的狀態(tài),就像這個(gè)事務(wù)從來(lái)沒(méi)有執(zhí)行過(guò)一樣。

2.Consistency(一致性)

在事務(wù)開(kāi)始之前和事務(wù)結(jié)束以后,數(shù)據(jù)庫(kù)的完整性沒(méi)有被破壞。

3.Isolation(隔離性)

數(shù)據(jù)庫(kù)允許多個(gè)并發(fā)事務(wù)同時(shí)對(duì)數(shù)據(jù)進(jìn)行讀寫(xiě)和修改的能力。隔離性可以防止多個(gè)事務(wù)并發(fā)執(zhí)行時(shí)由于交叉執(zhí)行而導(dǎo)致數(shù)據(jù)的不一致。事務(wù)隔離分為不同級(jí)別,包括讀未提交(Read uncommitted)、讀提交(read committed)、可重復(fù)讀(repeatable read)和串行化(Serializable)。

4.Durability(持久性)

事務(wù)處理結(jié)束后,對(duì)數(shù)據(jù)的修改就是永久的,即便系統(tǒng)故障也不會(huì)丟失。可以看到,ACID 中的 A(Atomicity)和 CAP 中的 A(Availability)意義完全不同,而 ACID 中的 C 和 CAP 中的 C 名稱(chēng)雖然都是一致性,但含義也完全不一樣。ACID 中的 C 是指數(shù)據(jù)庫(kù)的數(shù)據(jù)完整性,而 CAP 中的 C 是指分布式節(jié)點(diǎn)中的數(shù)據(jù)一致性。再結(jié)合 ACID 的應(yīng)用場(chǎng)景是數(shù)據(jù)庫(kù)事務(wù),CAP 關(guān)注的是分布式系統(tǒng)數(shù)據(jù)讀寫(xiě)這個(gè)差異點(diǎn)來(lái)看,其實(shí) CAP 和 ACID 的對(duì)比就類(lèi)似關(guān)公戰(zhàn)秦瓊,雖然關(guān)公和秦瓊都是武將,但其實(shí)沒(méi)有太多可比性。

BASE

BASE 是指基本可用(Basically Available)、軟狀態(tài)( Soft State)、最終一致性( Eventual Consistency),核心思想是即使無(wú)法做到強(qiáng)一致性(CAP 的一致性就是強(qiáng)一致性),但應(yīng)用可以采用適合的方式達(dá)到最終一致性。

1. 基本可用(Basically Available)

分布式系統(tǒng)在出現(xiàn)故障時(shí),允許損失部分可用性,即保證核心可用。這里的關(guān)鍵詞是“部分”和“核心”,具體選擇哪些作為可以損失的業(yè)務(wù),哪些是必須保證的業(yè)務(wù),是一項(xiàng)有挑戰(zhàn)的工作。例如,對(duì)于一個(gè)用戶(hù)管理系統(tǒng)來(lái)說(shuō),“登錄”是核心功能,而“注冊(cè)”可以算作非核心功能。因?yàn)槲醋?cè)的用戶(hù)本來(lái)就還沒(méi)有使用系統(tǒng)的業(yè)務(wù),注冊(cè)不了最多就是流失一部分用戶(hù),而且這部分用戶(hù)數(shù)量較少。如果用戶(hù)已經(jīng)注冊(cè)但無(wú)法登錄,那就意味用戶(hù)無(wú)法使用系統(tǒng)。例如,充了錢(qián)的游戲不能玩了、云存儲(chǔ)不能用了……這些會(huì)對(duì)用戶(hù)造

2. 軟狀態(tài)(Soft State)

允許系統(tǒng)存在中間狀態(tài),而該中間狀態(tài)不會(huì)影響系統(tǒng)整體可用性。這里的中間狀態(tài)就是 CAP 理論中的數(shù)據(jù)不一致。

3. 最終一致性(Eventual Consistency)

系統(tǒng)中的所有數(shù)據(jù)副本經(jīng)過(guò)一定時(shí)間后,最終能夠達(dá)到一致的狀態(tài)。

這里的關(guān)鍵詞是“一定時(shí)間” 和 “最終”,“一定時(shí)間”和數(shù)據(jù)的特性是強(qiáng)關(guān)聯(lián)的,不同的數(shù)據(jù)能夠容忍的不一致時(shí)間是不同的。
舉一個(gè)微博系統(tǒng)的例子,用戶(hù)賬號(hào)數(shù)據(jù)最好能在 1 分鐘內(nèi)就達(dá)到一致?tīng)顟B(tài),因?yàn)橛脩?hù)在 A 節(jié)點(diǎn)注冊(cè)或者登錄后,1 分鐘內(nèi)不太可能立刻切換到另外一個(gè)節(jié)點(diǎn),但 10 分鐘后可能就重新登錄到另外一個(gè)節(jié)點(diǎn)了;而用戶(hù)發(fā)布的最新微博,可以容忍 30 分鐘內(nèi)達(dá)到一致?tīng)顟B(tài),因?yàn)閷?duì)于用戶(hù)來(lái)說(shuō),看不到某個(gè)明星發(fā)布的最新微博,用戶(hù)是無(wú)感知的,會(huì)認(rèn)為明星沒(méi)有發(fā)布微博。“最終”的含義就是不管多長(zhǎng)時(shí)間,最終還是要達(dá)到一致性的狀態(tài)。

BASE 理論本質(zhì)上是對(duì) CAP 的延伸和補(bǔ)充,更具體地說(shuō),是對(duì) CAP 中 AP 方案的一個(gè)補(bǔ)充。前面在剖析 CAP 理論時(shí),提到了其實(shí)和 BASE 相關(guān)的兩點(diǎn):

CAP 理論是忽略延時(shí)的,而實(shí)際應(yīng)用中延時(shí)是無(wú)法避免的。
這一點(diǎn)就意味著完美的 CP 場(chǎng)景是不存在的,即使是幾毫秒的數(shù)據(jù)復(fù)制延遲,在這幾毫秒時(shí)間間隔內(nèi),系統(tǒng)是不符合 CP 要求的。因此 CAP 中的 CP 方案,實(shí)際上也是實(shí)現(xiàn)了最終一致性,只是“一定時(shí)間”是指幾毫秒而已。

AP 方案中犧牲一致性只是指分區(qū)期間,而不是永遠(yuǎn)放棄一致性

這一點(diǎn)其實(shí)就是 BASE 理論延伸的地方,分區(qū)期間犧牲一致性,但分區(qū)故障恢復(fù)后,系統(tǒng)應(yīng)該達(dá)到最終一致性。

綜合上面的分析,ACID 是數(shù)據(jù)庫(kù)事務(wù)完整性的理論,CAP 是分布式系統(tǒng)設(shè)計(jì)理論,BASE 是 CAP 理論中 AP 方案的延伸。

Paxos算法本身能提供的是,可靠的最終一致性保證。如有足夠的隔離性措施,中間狀態(tài)的無(wú)法被客戶(hù)端讀取,則可以達(dá)到強(qiáng)一致性,這種屬于CP架構(gòu)。其它情況,就是AP架構(gòu)。、
Paxos算法本身是滿(mǎn)足線性一致性的。線性一致性也就是實(shí)際系統(tǒng)能夠達(dá)到的最強(qiáng)一致性。Paxos及各種變體,在實(shí)際工程領(lǐng)域的實(shí)現(xiàn),大多數(shù)是做了一定成都的取舍,并不完全是線性一致的。比如zookeeper和Etcd,都是對(duì)于寫(xiě)操作(比如選舉),滿(mǎn)足線性一致性,對(duì)于讀操作未必滿(mǎn)足線性一致性。即可選擇線性一致性讀取,也可以選擇非線性一致性讀取。這里的非線性一致行讀取就是順序一致性。CAP定理存在不少坑點(diǎn),理解起來(lái)很是令人費(fèi)解。1、適用場(chǎng)景。分布式系統(tǒng)有很多類(lèi)型,有異構(gòu)的,比如節(jié)點(diǎn)之間是上下游依賴(lài)的關(guān)系,有同構(gòu)的,比如分區(qū)/分片型的、副本型的(主從、多主)。CAP定理的適用場(chǎng)景是副本型的這種。2、一致性的概念,從強(qiáng)到弱,線性一致性、順序一致性、因果一致性、單調(diào)一致性、最終一致性,CAP中的一致性應(yīng)該是指順序一致性。3、CAP中的一致性,與ACID中的一致性的區(qū)別。事務(wù)中的一致性,是指滿(mǎn)足完整性約束條件,CAP中的一致性,是指讀寫(xiě)一致性。4、CAP中的可用性,與我們常說(shuō)的高可用的區(qū)別。比如HBase、MongoDB屬于CP架構(gòu),Cassandra、CounchDB屬于AP系統(tǒng),能說(shuō)后者比前者更高可用么?應(yīng)該不是。CAP中的可用性,是指在某一次讀操作中,即便發(fā)現(xiàn)不一致,也要返回響應(yīng),即在合理時(shí)間內(nèi)返回合理響應(yīng)。我們常說(shuō)的高可用,是指部分實(shí)例掛了,能自動(dòng)摘除,并由其它實(shí)例繼續(xù)提供服務(wù),關(guān)鍵是冗余。5、哪些情況屬于網(wǎng)絡(luò)分區(qū)。網(wǎng)絡(luò)故障造成的分區(qū),屬于。節(jié)點(diǎn)應(yīng)用出現(xiàn)問(wèn)題導(dǎo)致超時(shí),屬于。節(jié)點(diǎn)宕機(jī)或硬件故障,不屬于。CAP中的一致性,是指線性一致性,而不是順序一致性。

P要求分布式和數(shù)據(jù)同步,
C要求數(shù)據(jù)完全一致,
A要求返回及時(shí)

總結(jié)

以上是生活随笔為你收集整理的高可用架构:CAP原理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。