此文來(lái)自于:《從Paxos到Zookeeper分布式一致性原理與實(shí)踐》第一章
集中式->分布式演變基礎(chǔ)知識(shí)
1. 從集中式到分布式
1.1 集中式的特點(diǎn)
所謂的集中式系統(tǒng)就是指由一臺(tái)或多臺(tái)主計(jì)算機(jī)組成中心節(jié)點(diǎn),數(shù)據(jù)集中存儲(chǔ)于這個(gè)中心節(jié)點(diǎn),并且整個(gè)系統(tǒng)的所有業(yè)務(wù)單元都部署在這個(gè)中心節(jié)點(diǎn)上,
系統(tǒng)的所有功能均由其集中處理。也就是說(shuō),在集中式系統(tǒng)中,每個(gè)終端或客戶端機(jī)器僅僅負(fù)責(zé)數(shù)據(jù)的錄入和輸出,而數(shù)據(jù)的存儲(chǔ)與控制處理完全
交由主機(jī)來(lái)完成。
最大的特點(diǎn)就是部署結(jié)構(gòu)簡(jiǎn)單。由于集中式系統(tǒng)往往基于底層性能卓越的大型主機(jī),因此無(wú)須考慮如何對(duì)服務(wù)進(jìn)行多個(gè)節(jié)點(diǎn)的部署,也就不用考慮多個(gè)
節(jié)點(diǎn)之間的分布式協(xié)作問(wèn)題。
1.2 分布式的特點(diǎn)
分布式系統(tǒng)是一個(gè)硬件或者軟件組成分布在不同的網(wǎng)絡(luò)計(jì)算上,彼此之間僅僅通過(guò)消息傳遞進(jìn)行通信和協(xié)調(diào)的系統(tǒng)。
一個(gè)標(biāo)準(zhǔn)的分布式系統(tǒng)在沒(méi)有任何特定業(yè)務(wù)邏輯約束的情況下,都會(huì)有如下幾個(gè)特征:
- 分布性:分布式系統(tǒng)中的多臺(tái)計(jì)算機(jī)在空間上隨意分布。
- 對(duì)等性:分布式系統(tǒng)中的計(jì)算機(jī)沒(méi)有主/從之分,既沒(méi)有控制整個(gè)系統(tǒng)的主機(jī),也沒(méi)有被控制的從機(jī),組成分布式系統(tǒng)的所有計(jì)算機(jī)節(jié)點(diǎn)都是對(duì)等的。
副本(Replica)是分布式系統(tǒng)最常見(jiàn)的概念之一,指的是分布式系統(tǒng)對(duì)數(shù)據(jù)和服務(wù)提供一種冗余方式。在常見(jiàn)的分布式系統(tǒng)中,為了對(duì)外提供高可用的服務(wù),
我們往往會(huì)對(duì)數(shù)據(jù)和服務(wù)進(jìn)行副本處理。不同的節(jié)點(diǎn)上持久化同一份數(shù)據(jù),當(dāng)某一個(gè)節(jié)點(diǎn)上存儲(chǔ)的數(shù)據(jù)丟失時(shí),可以從副本上讀取到該數(shù)據(jù),另一類(lèi)副本是
服務(wù)副本,指多個(gè)節(jié)點(diǎn)提供同樣的服務(wù),每個(gè)節(jié)點(diǎn)都有能力接收來(lái)自外部的請(qǐng)求并進(jìn)行相應(yīng)的處理。 - 并發(fā)性:同一個(gè)分布式系統(tǒng)中的多個(gè)節(jié)點(diǎn),可能會(huì)并發(fā)地操作一些共享的資源,諸如數(shù)據(jù)庫(kù)或分布式存儲(chǔ)等,如何準(zhǔn)確并高效地協(xié)調(diào)分布式并發(fā)操作也成為了分布式
系統(tǒng)架構(gòu)與設(shè)計(jì)中最大的挑戰(zhàn)之一。 - 缺乏全局時(shí)鐘:一個(gè)典型的分布式系統(tǒng)是由一系列在空間上隨意分布的多個(gè)進(jìn)程組成的,具有明顯的分布性,這些進(jìn)程之間通過(guò)交換下次來(lái)進(jìn)行相互通信。
因此,在分布式系統(tǒng)中,很難定義兩個(gè)時(shí)間的順序,原因就是因?yàn)榉植际较到y(tǒng)缺乏一個(gè)全局的時(shí)鐘序列控制。 - 故障總是會(huì)發(fā)生:組成分布式系統(tǒng)的所有計(jì)算機(jī),都有可能發(fā)生任何形式的故障。任何在設(shè)計(jì)階段考慮到的異常情況,一定會(huì)在系統(tǒng)實(shí)際運(yùn)行中發(fā)生!
1.3 分布式環(huán)境的各種問(wèn)題
1.3.1 通信異常
分布式引入了網(wǎng)絡(luò)因素,而由于網(wǎng)絡(luò)本身的不可靠性,因此每次網(wǎng)絡(luò)通信都會(huì)伴隨網(wǎng)絡(luò)不可用的風(fēng)險(xiǎn),網(wǎng)絡(luò)光纖、路由器和DNS等。因此消息丟失和消息延遲變得非常普遍。
1.3.2 網(wǎng)絡(luò)分區(qū)
當(dāng)網(wǎng)絡(luò)由于發(fā)生異常情況,導(dǎo)致分布式系統(tǒng)中部分節(jié)點(diǎn)之間的網(wǎng)絡(luò)延時(shí)不斷增大,最終導(dǎo)致組成分布式系統(tǒng)的所有節(jié)點(diǎn)中,只有部分節(jié)點(diǎn)之間能夠正常通信,
而另一些節(jié)點(diǎn)則不能——我們將這個(gè)現(xiàn)象稱(chēng)為網(wǎng)絡(luò)分區(qū)。網(wǎng)絡(luò)分區(qū)出現(xiàn)時(shí),分布式系統(tǒng)會(huì)出現(xiàn)局部小集群,在極端情況下,這些局部小集群會(huì)獨(dú)立完成原本
需要整個(gè)分布式系統(tǒng)才能完成的功能,包括對(duì)數(shù)據(jù)的事務(wù)處理,這就對(duì)分布式一致性提出了非常大的挑戰(zhàn)(某個(gè)復(fù)雜業(yè)務(wù)原本需要多個(gè)機(jī)器完成,現(xiàn)在被一個(gè)機(jī)器
執(zhí)行)。
1.3.3 三態(tài)
分布式系統(tǒng)的每一次請(qǐng)求與響應(yīng),存在特有的“三態(tài)”概念,即成功、失敗與超時(shí)。超時(shí)的現(xiàn)象,通常有以下兩種情況:
- 由于網(wǎng)絡(luò)原因,請(qǐng)求并沒(méi)有被成功地發(fā)送到接收方,在發(fā)送過(guò)程就發(fā)生了消息丟失現(xiàn)象。
- 請(qǐng)求成功的被接收方接收后,并進(jìn)行了處理,但是在將響應(yīng)反饋給發(fā)送方的過(guò)程中,發(fā)生了消息丟失現(xiàn)象。(rabitMQ的解決方案是,消費(fèi)者(接收方)開(kāi)始處理消息前發(fā)送響應(yīng)A,
消費(fèi)者(接收方)處理完成消息后發(fā)送響應(yīng)B,生產(chǎn)者(發(fā)送方)必須得到AB兩個(gè)響應(yīng)才能確定消息成功被處理了)
2. 從ACID到CAP/BASE
2.1 ACID
事務(wù)(Transaction)是由一系列對(duì)系統(tǒng)中數(shù)據(jù)進(jìn)行訪問(wèn)與更新的操作所組成的一個(gè)程序執(zhí)行邏輯單元(Unit)。
2.1.1 原子性(Atomicity)
要么全部成功執(zhí)行,要么全部不執(zhí)行。
2.1.2 一致性(Consistency)
事務(wù)的運(yùn)行被迫中斷時(shí),這些未完成的事務(wù)對(duì)數(shù)據(jù)庫(kù)所做的修改有一部分已寫(xiě)入物理數(shù)據(jù)庫(kù),這時(shí)數(shù)據(jù)庫(kù)就處于不一致的狀態(tài)。
2.1.3 隔離性(Isolation)
并發(fā)的事務(wù)是相互隔離的,一個(gè)事務(wù)的執(zhí)行不能被其他事務(wù)干擾。SQL規(guī)范定義了4個(gè)事務(wù)隔離級(jí)別:
- 讀未提交(Read Uncommitted):A事務(wù)更新過(guò)程中,從1更新到10,B事務(wù)能獲取過(guò)程中間值,獲取到2,3等值。(臟讀)
- 讀已提交(Read Committed):A事務(wù)更新過(guò)程中,從1更新到10,B事務(wù)只能獲取最終的值10。
- 可重復(fù)讀(Repeatable Read):A事務(wù)更新過(guò)程中,從1更新到10,B事務(wù)先獲取了1,后來(lái)B事務(wù)中有個(gè)操作重新獲取了一次值為10。(幻影讀)
- 串行化(Serializable):事務(wù)只能串行執(zhí)行,不能并發(fā)。
2.1.4 持久性(Durability)
事務(wù)一旦提交,對(duì)數(shù)據(jù)庫(kù)對(duì)應(yīng)數(shù)據(jù)的狀態(tài)變更就應(yīng)該被永久保存下來(lái)。
2.1 分布式事務(wù)
設(shè)想一個(gè)最典型的分布式事務(wù)場(chǎng)景:一個(gè)跨銀行的轉(zhuǎn)賬操作涉及調(diào)用兩個(gè)異地的銀行服務(wù),其中一個(gè)是本地銀行提供的取款服務(wù),另一個(gè)則是目標(biāo)銀行提供的存款
服務(wù),這兩個(gè)服務(wù)本身是無(wú)狀態(tài)并且是互相獨(dú)立的,共同構(gòu)成了一個(gè)完整的分布式事務(wù)。如果從本地銀行取款成功,但是因?yàn)槟撤N原因存款服務(wù)失敗了,那么
就必須回滾到取款前的狀態(tài),否則用戶可能會(huì)發(fā)現(xiàn)自己的錢(qián)不翼而飛了。
我們可以看到,一個(gè)分布式事務(wù)可以看作是由多個(gè)分布式的操作序列組成的,例如上面例子中的取款服務(wù)和存款服務(wù),通常可以把這一系列分布式的操作序列稱(chēng)為
子事務(wù)。因?yàn)椋植际绞聞?wù)也可以被定義為一種嵌套型的事務(wù),同時(shí)也就具有了ACID事務(wù)特性。但由于在分布式事務(wù)中,各個(gè)子事務(wù)的執(zhí)行時(shí)分布式的,
因此要實(shí)現(xiàn)一種能夠保證ACID特性的分布式事務(wù)處理系統(tǒng)就顯得格外復(fù)雜。
2.3 CAP和BASE理論
ACID是屬于單機(jī)系統(tǒng)的理論,分布式有屬于自己的理論,即CAP和BASE。
2.3.1 CAP定理
一個(gè)分布式系統(tǒng)不可能同時(shí)滿足一致性(Consistency)、可用性(Availability)、分區(qū)容錯(cuò)性(Partition tolerance)這三個(gè)基本需求,最多只能同時(shí)
滿足其中的兩項(xiàng)。
.1 Consistency
在分布式環(huán)境下,數(shù)據(jù)在多個(gè)副本之間是否能夠保持一致性,當(dāng)某個(gè)副本執(zhí)行更新操作后,應(yīng)該保證系統(tǒng)的數(shù)據(jù)仍然處于一致的狀態(tài)。如果做到一個(gè)數(shù)據(jù)項(xiàng)的更新
操作執(zhí)行成功后,所有的用戶都可以讀取到最新的值,那么這樣的系統(tǒng)就被認(rèn)為具有強(qiáng)一致性。
.2 Availability
對(duì)于用戶的每一個(gè)操作請(qǐng)求總是能夠在有限的時(shí)間內(nèi)返回結(jié)果。劃重點(diǎn):有限的時(shí)間內(nèi)、返回結(jié)果。
- 有限的時(shí)間內(nèi):對(duì)于用戶的一個(gè)艸做請(qǐng)求,系統(tǒng)必須能夠在指定的時(shí)間內(nèi)返回對(duì)應(yīng)的處理結(jié)果,如果超過(guò)了這個(gè)時(shí)間范圍,那么系統(tǒng)就被認(rèn)為是不可用的。
比如,對(duì)于一個(gè)在線搜索引擎來(lái)說(shuō),通常在0.5秒內(nèi)需要給出用戶搜索關(guān)鍵詞對(duì)應(yīng)的檢索結(jié)果,而對(duì)于一個(gè)面向HIVE的海量數(shù)據(jù)查詢平臺(tái)來(lái)說(shuō),正常一次數(shù)據(jù)
檢索時(shí)間可能在20秒,這是正常的,系統(tǒng)必須存在一個(gè)合理的響應(yīng)時(shí)間。 - 返回結(jié)果:要求系統(tǒng)在完成堆用戶請(qǐng)求的處理后,返回一個(gè)正常的結(jié)果,而不是返回系統(tǒng)錯(cuò)誤。
.3 Partition tolerance
分布式系統(tǒng)在遇到任何網(wǎng)絡(luò)分區(qū)故障的時(shí)候(節(jié)點(diǎn)間的故障),仍然需要保證對(duì)外提供滿足一致性和可用性的服務(wù),除非整個(gè)網(wǎng)絡(luò)環(huán)境發(fā)生了故障。
.4 總結(jié)
- AC:所有的數(shù)據(jù)都放在一個(gè)分布式節(jié)點(diǎn)上。(談什么分布式?)
- PC:系統(tǒng)正在維修,請(qǐng)等待。(要么可用,要么直接不能訪問(wèn))
- AP:放棄數(shù)據(jù)的強(qiáng)一致性,保留數(shù)據(jù)額最終一致性。(雙11xx商品正在被5126人瀏覽,可能每個(gè)人看到的數(shù)字都不一樣,但是系統(tǒng)最終會(huì)讓所有人看到一樣的數(shù)字)
2.3.2 BASE理論
基于CAP定理結(jié)合實(shí)際演化而來(lái),即Basically Available(基本可用)、Soft state(軟狀態(tài))、Eventually consistency(最終一致性)。
.1 Basically Available
分布式在出現(xiàn)不可預(yù)知故障的時(shí)候,允許損失部分可用性:
- 響應(yīng)時(shí)間上的損失:搜索正常是0.5秒返回用戶,出現(xiàn)故障變成2秒。
- 功能上的損失:網(wǎng)上購(gòu)物在雙11時(shí)選擇購(gòu)買(mǎi)可能會(huì)跳轉(zhuǎn)到排隊(duì)頁(yè)面。
.2 Soft state
允許系統(tǒng)中的數(shù)據(jù)存在中間狀態(tài),并認(rèn)為該中間狀態(tài)的存在不會(huì)影響系統(tǒng)的整體可用性,即允許系統(tǒng)在不同節(jié)點(diǎn)的數(shù)據(jù)副本之間進(jìn)行數(shù)據(jù)同步的過(guò)程存在延時(shí)。
.3 Eventually consistency
強(qiáng)調(diào)數(shù)據(jù)最終數(shù)據(jù)能夠達(dá)到一致,而不需要實(shí)時(shí)保證系統(tǒng)數(shù)據(jù)的強(qiáng)一致性。
在實(shí)際工程實(shí)踐中,最終一致性存在以下五類(lèi)主要變種。
.3.1 因果一致性(Causal consistency)
進(jìn)程A更新完某個(gè)數(shù)據(jù)項(xiàng)后通知了進(jìn)程B,那么進(jìn)程B之后對(duì)該數(shù)據(jù)的訪問(wèn)都應(yīng)該能夠獲取到進(jìn)程A更新后的最新紙,并且如果進(jìn)程B要對(duì)該數(shù)據(jù)項(xiàng)進(jìn)行更新操作的話,
務(wù)必基于進(jìn)程A更新后的最新值。而進(jìn)程C的數(shù)據(jù)訪問(wèn)則沒(méi)有這樣的限制。
.3.2 讀己之所寫(xiě)(Read your writes)
進(jìn)程A更新了一個(gè)數(shù)據(jù)項(xiàng),它自己總是能夠訪問(wèn)到更新過(guò)的最新值。特殊的因果一致性(A進(jìn)程通知了A進(jìn)程)。
.3.3 會(huì)話一致性(Session consistency)
系統(tǒng)能保證在同一個(gè)有效的會(huì)話中實(shí)現(xiàn)“讀己之所寫(xiě)”的一致性,即客戶端能夠在同一繪畫(huà)中始終讀取到該數(shù)據(jù)項(xiàng)的最新值。
.3.4 單調(diào)讀一致性(Monotonic read consistency)
如果一個(gè)進(jìn)程從系統(tǒng)讀取出一個(gè)數(shù)據(jù)項(xiàng)的某個(gè)值后,那么系統(tǒng)對(duì)于該進(jìn)程后續(xù)的任何數(shù)據(jù)訪問(wèn)都不應(yīng)該返回更舊的值。
.3.5 單調(diào)寫(xiě)一致性(Monotonic write consistency)
系統(tǒng)保證來(lái)自同一個(gè)進(jìn)程的寫(xiě)操作被順序地執(zhí)行。
.3.6 總結(jié)
最終一致性并不是只有那些大型分布式系統(tǒng)才涉及的特性,許多關(guān)系型數(shù)據(jù)庫(kù)都采用了最終一致性模型,采用同步和異步方式來(lái)實(shí)現(xiàn)主備數(shù)據(jù)復(fù)制技術(shù)。
- 在同步方式中,數(shù)據(jù)的復(fù)制過(guò)程通常是更新事務(wù)的一部分,因此在書(shū)屋完成后,主備數(shù)據(jù)庫(kù)的數(shù)據(jù)就會(huì)達(dá)到一致。
- 在異步方式中,備庫(kù)的更新往往會(huì)存在延時(shí),這取決于事務(wù)日志在主備數(shù)據(jù)庫(kù)之間傳輸?shù)臅r(shí)間長(zhǎng)達(dá),如果傳輸時(shí)間過(guò)長(zhǎng)或者甚至在日志傳輸過(guò)程中出現(xiàn)異常導(dǎo)致
無(wú)法及時(shí)將事務(wù)應(yīng)用到備庫(kù)上,那么很顯然,從備庫(kù)讀取的數(shù)據(jù)將是舊的,就出現(xiàn)了數(shù)據(jù)不一致的情況。
但是,無(wú)論采用重試、人為修正,關(guān)系型數(shù)據(jù)庫(kù)還是能夠保證最終數(shù)據(jù)達(dá)到一致性——這就是系統(tǒng)提供最終一致性保證的經(jīng)典案例。
總的來(lái)說(shuō),BASE理論面向大型高可用可擴(kuò)展的分布式系統(tǒng),和傳統(tǒng)事務(wù)的ACID特性是相反的,不同于ACID的強(qiáng)一致性模型,而是通過(guò)強(qiáng)一致性和高可用性的
平衡,最終達(dá)到一致性。因此在具體的分布式系統(tǒng)架構(gòu)設(shè)計(jì)過(guò)程中,ACID和BASE理論往往會(huì)結(jié)合一起使用用來(lái)面對(duì)不同的業(yè)務(wù)場(chǎng)景的要求。
3. 小結(jié)
分布式架構(gòu)發(fā)展過(guò)程中的ACID->CAP->BASE等分布式事務(wù)與一致性方面的經(jīng)典理論。