框架篇:分布式理論CAP、BASE
本文轉(zhuǎn)載自微信公眾號(hào)「潛行前行」,作者cscw 。轉(zhuǎn)載本文請(qǐng)聯(lián)系潛行前行公眾號(hào)。
前言
隨著業(yè)務(wù)的拓展,功能越來(lái)越多。把所有的功能都放在同一個(gè)服務(wù)下,代碼混合交錯(cuò),造成維護(hù)困難,也容易造成某一小bug導(dǎo)致整個(gè)服務(wù)不可用。因此我們會(huì)按業(yè)務(wù)功能會(huì)拆分成多個(gè)不同的服務(wù)(微服務(wù)的形成),多個(gè)服務(wù)組成的系統(tǒng),有個(gè)響亮的名字:分布式系統(tǒng);而系統(tǒng)中的服務(wù)狀態(tài)我們?cè)撛趺慈ス芾恚惺裁聪嚓P(guān)的理論呢?
- 分布式和集群
- 數(shù)據(jù)庫(kù)事務(wù)
- 分布式事務(wù)
- 分布式數(shù)據(jù)一致性
- CAP 理論
- BASE理論
分布式和集群
分布式是指通過(guò)網(wǎng)絡(luò)連接的多個(gè)服務(wù)或組件,通過(guò)交換信息協(xié)作而形成的系統(tǒng)
集群是指同一種服務(wù)組件的多個(gè)實(shí)例形成的整體
這兩個(gè)概念并不完全沖突,分布式系統(tǒng)也可以是一個(gè)集群。zookeeper集群也是一種分布式系統(tǒng),它的服務(wù)之間會(huì)互相通信協(xié)作
集群不是分布式系統(tǒng)的情況,比如多個(gè)經(jīng)過(guò)負(fù)載均衡的HTTP服務(wù)器,它們之間不會(huì)互相通信,如果不帶上負(fù)載均衡的部分的話,則不能稱作分布式系統(tǒng)
數(shù)據(jù)庫(kù)事務(wù)
- 事務(wù)是基于數(shù)據(jù)進(jìn)行操作,需要保證事務(wù)的數(shù)據(jù)通常存儲(chǔ)在數(shù)據(jù)庫(kù)中,所以介紹到事務(wù),就不得不介紹數(shù)據(jù)庫(kù)事務(wù)的 ACID 特性
- 原子性(Atomicity),整個(gè)事務(wù)中的所有操作,要么全部完成,要么全部不完成,不可能停滯在中間某個(gè)環(huán)節(jié)
- 一致性(Consistency),在事務(wù)開始之前和事務(wù)結(jié)束以后,數(shù)據(jù)庫(kù)數(shù)據(jù)的一致性約束沒(méi)有被破壞
- 隔離性(Isolation),隔離性可以防止多個(gè)事務(wù)并發(fā)執(zhí)行時(shí)由于交叉執(zhí)行而導(dǎo)致數(shù)據(jù)的不一致
- 持久性(Durability),事務(wù)處理結(jié)束后,對(duì)數(shù)據(jù)的修改就是永久的,即便系統(tǒng)故障也不會(huì)丟失
分布式事務(wù)
分布式系統(tǒng)一般由多個(gè)獨(dú)立的子系統(tǒng)組成,多個(gè)子系統(tǒng)通過(guò)網(wǎng)絡(luò)通信互相協(xié)作配合完成各個(gè)功能;這個(gè)協(xié)作過(guò)程需要保證各個(gè)系統(tǒng)的數(shù)據(jù)一致性,我們稱這種跨系統(tǒng)的事務(wù)為分布式事務(wù)
上面的場(chǎng)景會(huì)存在多種情況;庫(kù)存服務(wù)和訂單服務(wù)全部成功?;蛘邘?kù)存服務(wù)和訂單服務(wù)部分成功,而傳統(tǒng)的單機(jī)事務(wù)理論不再適用
分布式事務(wù)的難點(diǎn)
原子性:事務(wù)操作跨不同節(jié)點(diǎn),當(dāng)多個(gè)節(jié)點(diǎn)某一節(jié)點(diǎn)操作失敗時(shí),需要保證多節(jié)點(diǎn)操作的要么什么都不做,要么都做
一致性:當(dāng)發(fā)生網(wǎng)絡(luò)傳輸故障或者節(jié)點(diǎn)故障,節(jié)點(diǎn)間數(shù)據(jù)復(fù)制通道中斷,在進(jìn)行事務(wù)操作時(shí)需要保證數(shù)據(jù)一致性
隔離性:在分布式事務(wù)控制中,可能會(huì)出現(xiàn)提交不同步的現(xiàn)象,會(huì)出現(xiàn)“部分已經(jīng)提交”的事務(wù)
分布式數(shù)據(jù)一致性
ACID并不適合分布式事務(wù),而分布式事務(wù)的難點(diǎn)涉及的問(wèn)題,最終影響是導(dǎo)致數(shù)據(jù)出現(xiàn)不一致,因此在分布式系統(tǒng)會(huì)著重關(guān)注保證系統(tǒng)的一致性。
CAP理論
- 前面介紹到的分布式事務(wù)的難點(diǎn)涉及的問(wèn)題,最終影響是導(dǎo)致數(shù)據(jù)出現(xiàn)不一致,下面對(duì)分布式系統(tǒng)的一致性問(wèn)題進(jìn)行理論分析,后面將基于這些理論進(jìn)行分布式方案的介紹(可用性和一致性的沖突:CAP理論)
- 一致性(Consistence): 所有節(jié)點(diǎn)訪問(wèn)最新相同的數(shù)據(jù)副本
- 可用性(Availability): 非故障的節(jié)點(diǎn)在合理的時(shí)間內(nèi)返回合理的響應(yīng)(不是錯(cuò)誤或者超時(shí)的響應(yīng))
- 分區(qū)容錯(cuò)性(Partition tolerance): 分布式系統(tǒng)出現(xiàn)網(wǎng)絡(luò)分區(qū)的時(shí)候,仍然能夠?qū)ν馓峁┓?wù)
當(dāng)發(fā)生網(wǎng)絡(luò)分區(qū)的時(shí)候,如果我們要繼續(xù)服務(wù),那么強(qiáng)一致性和可用性只能 2 選 1。也就是說(shuō)當(dāng)網(wǎng)絡(luò)分區(qū)之后 P 是前提,決定了 P 之后才有 C 和 A 的選擇。也就是說(shuō)分區(qū)容錯(cuò)性(Partition tolerance)我們是必須要實(shí)現(xiàn)的
為啥無(wú)法同時(shí)保證 CA 呢?
若系統(tǒng)出現(xiàn)“分區(qū)”,系統(tǒng)中的某個(gè)節(jié)點(diǎn)在進(jìn)行寫操作。為了保證一致性C, 必須要禁止其他節(jié)點(diǎn)的讀寫操作,這就和 A 發(fā)生沖突了;如果為了保證A,其他節(jié)點(diǎn)的讀寫操作正常的話,那就無(wú)法保證數(shù)據(jù)一致性,和C沖突
CAP 實(shí)際應(yīng)用案例
ZooKeeper保證的是CP。任何時(shí)刻對(duì)ZooKeeper的讀請(qǐng)求都能得到一致性的結(jié)果,但是ZooKeeper不保證每次請(qǐng)求的可用性比如在Leader選舉過(guò)程中或者半數(shù)以上的機(jī)器不可用的時(shí)候服務(wù)就是不可用的
Eureka保證的則是AP。Eureka在設(shè)計(jì)的時(shí)候就是優(yōu)先保證A(可用性)。在 Eureka中不存在什么Leader節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)都是一樣的、平等的。因此 Eureka 不會(huì)像 ZooKeeper 那樣出現(xiàn)選舉過(guò)程中或者半數(shù)以上的機(jī)器不可用的時(shí)候服務(wù)就是不可用的情況。Eureka 保證即使大部分節(jié)點(diǎn)掛掉也不會(huì)影響正常提供服務(wù),只要有一個(gè)節(jié)點(diǎn)是可用的就行了。只不過(guò)這個(gè)節(jié)點(diǎn)上的數(shù)據(jù)可能并不是最新的
BASE理論
BASE是Basically Available(基本可用) 、Soft-state(軟狀態(tài)) 和 Eventually Consistent(最終一致性)。BASE理論是對(duì)CAP中一致性(C)和可用性(A)權(quán)衡的結(jié)果
最終一致性是弱一致性的一個(gè)特例,系統(tǒng)會(huì)保證在一定時(shí)間內(nèi),能夠達(dá)到一個(gè)數(shù)據(jù)一致的狀態(tài)
基本可用
基本可用是指分布式系統(tǒng)在出現(xiàn)不可預(yù)知故障的時(shí)候,允許損失部分可用性;那什么又是允許損失部分可用性呢?
響應(yīng)時(shí)間上的損失: 正常情況下,處理用戶請(qǐng)求需要0.5s返回結(jié)果,但是由于系統(tǒng)出現(xiàn)故障,處理用戶請(qǐng)求的時(shí)間變?yōu)?s
系統(tǒng)功能上的損失:正常情況下,用戶可以使用系統(tǒng)的全部功能,但是由于系統(tǒng)訪問(wèn)量突然劇增,系統(tǒng)的部分非核心功能無(wú)法使用
軟狀態(tài)
軟狀態(tài)指允許系統(tǒng)中的數(shù)據(jù)存在中間狀態(tài)(CAP理論中的數(shù)據(jù)不一致),并認(rèn)為該中間狀態(tài)的存在不會(huì)影響系統(tǒng)的整體可用性,即允許系統(tǒng)在不同節(jié)點(diǎn)的數(shù)據(jù)副本之間進(jìn)行數(shù)據(jù)同步的過(guò)程存在延時(shí)
最終一致性
最終一致性強(qiáng)調(diào)的是系統(tǒng)中所有的數(shù)據(jù)副本,在經(jīng)過(guò)一段時(shí)間的同步后,最終能夠達(dá)到一個(gè)一致的狀態(tài)。因此,最終一致性的本質(zhì)是需要系統(tǒng)保證最終數(shù)據(jù)能夠達(dá)到一致,而不需要實(shí)時(shí)保證系統(tǒng)數(shù)據(jù)的強(qiáng)一致性
參考文章
CAP和BASE理論了解么?可以結(jié)合實(shí)際案例說(shuō)下不?
分布式與集群的區(qū)別是什么?[1]
數(shù)據(jù)一致性問(wèn)題[2]