自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

分布式數(shù)據(jù)庫:如何保證數(shù)據(jù)在分布式場(chǎng)景下的高性能?

數(shù)據(jù)庫 其他數(shù)據(jù)庫
今天的內(nèi)容較長,不過已經(jīng)精煉很多了。我們從高可用性入手,介紹了 CAP 理論對(duì)于分布式模型評(píng)估的影響;而后重點(diǎn)介紹了一致性模型,這是核心,用來幫助你評(píng)估分布式數(shù)據(jù)庫的特性。

一致性是高可用的必備條件

在現(xiàn)實(shí)世界中,分布式數(shù)據(jù)庫的節(jié)點(diǎn)并不總是處于活動(dòng)狀態(tài)且相互能夠通信的。但是,以上這些故障不應(yīng)該影響數(shù)據(jù)庫的可用性。換言之,從用戶的角度來看,整個(gè)系統(tǒng)必須像沒有遭到任何故障一樣繼續(xù)運(yùn)行。系統(tǒng)高可用性是分布式數(shù)據(jù)庫一個(gè)極其重要的特性,甚至在軟件工程中,我們始終致力于實(shí)現(xiàn)高可用性,并盡量減少停機(jī)時(shí)間。

為了使系統(tǒng)高度可用,系統(tǒng)需要被設(shè)計(jì)成允許一個(gè)或多個(gè)節(jié)點(diǎn)的崩潰或不可訪問。為此,我們需要引入如上一講所說的復(fù)制技術(shù),其核心就是使用多個(gè)冗余的副本來提高系統(tǒng)的可用性。但是,一旦添加了這些副本,我們將面臨使多個(gè)數(shù)據(jù)副本保持同步的問題,并且遭遇故障后如何恢復(fù)系統(tǒng)的問題。

這就是 MySQL 復(fù)制發(fā)展歷程所引入的 RPO 概念,也就是系統(tǒng)不僅僅要可用,而且數(shù)據(jù)還需要一致。所以高可用必須要盡可能滿足業(yè)務(wù)連續(xù)性和數(shù)據(jù)一致性這兩個(gè)指標(biāo)。

而我們馬上要介紹的 CAP 理論會(huì)告訴我們還有第三個(gè)因素——網(wǎng)絡(luò)分區(qū)會(huì)對(duì)可用性產(chǎn)生影響。它會(huì)告訴我們可用性和一致性在網(wǎng)絡(luò)分區(qū)下是不能同時(shí)滿足的。

CAP 理論與注意事項(xiàng)

首先,可用性是用于衡量系統(tǒng)能成功處理每個(gè)請(qǐng)求并作出響應(yīng)的能力。可用性的定義是用戶可以感知到的系統(tǒng)整體響應(yīng)情況。但在實(shí)踐中,我們希望組成系統(tǒng)的各個(gè)組件都可以保持可用性。

其次,我們希望每個(gè)操作都保持一致性。一致性在此定義為原子一致性或線性化一致性。線性一致可以理解為:分布式系統(tǒng)內(nèi),對(duì)所有相同副本上的操作歷史可以被看作一個(gè)日志,且它們?cè)谌罩局胁僮鞯捻樞蚨际窍嗤摹>€性化簡化了系統(tǒng)可能狀態(tài)的計(jì)算過程,并使分布式系統(tǒng)看起來像在單臺(tái)計(jì)算機(jī)上運(yùn)行一樣。

最后,我們希望在容忍網(wǎng)絡(luò)分區(qū)的同時(shí)實(shí)現(xiàn)一致性和可用性。網(wǎng)絡(luò)是十分不穩(wěn)定的,它經(jīng)常會(huì)分為多個(gè)互相獨(dú)立的子網(wǎng)絡(luò)。在這些子網(wǎng)中,節(jié)點(diǎn)間無法相互通信。在這些被分區(qū)的節(jié)點(diǎn)之間發(fā)送的某些消息,將無法到達(dá)它的目的地。

那么總結(jié)一下,可用性要求任何無故障的節(jié)點(diǎn)都可以提供服務(wù),而一致性要求結(jié)果需要線性一致。埃里克·布魯爾(Eric Brewer)提出的 CAP 理論討論了一致性、可用性和分區(qū)容錯(cuò)之間的抉擇。

其中提到了,異步系統(tǒng)是無法滿足可用性要求的,并且在存在網(wǎng)絡(luò)分區(qū)的情況下,我們無法實(shí)現(xiàn)同時(shí)保證可用性和一致性的系統(tǒng)。不過我們可以構(gòu)建出,在盡最大努力保證可用性的同時(shí),也保證強(qiáng)一致性的系統(tǒng);或者在盡最大努力保證一致性的同時(shí),也保證可用性的系統(tǒng)。

這里提到的“最大努力”意味著,如果一切正常,系統(tǒng)可以提供該特性的保證,但是在網(wǎng)絡(luò)分區(qū)的情況下,允許削弱和違反這個(gè)保證。換句話說,CAP 描述了一種組合性選擇,也就是要有取舍。從 CAP 理論的定義,我們可以擁有以下幾種系統(tǒng)。

  • CP 系統(tǒng):一致且容忍分區(qū)的系統(tǒng)。更傾向于減少服務(wù)時(shí)間,而不是將不一致的數(shù)據(jù)提供出去。一些面向交易場(chǎng)景構(gòu)建的 NewSQL 數(shù)據(jù)庫傾向于這種策略,如 TiDB、阿里云 PolarDB、AWS Aurora 等。但是它們會(huì)生成自己的 A,也就是可用性很高。
  • AP 系統(tǒng):可用且具有分區(qū)容忍性的系統(tǒng)。它放寬了一致性要求,并允許在請(qǐng)求期間提供可能不一致的值。一般是列式存儲(chǔ),NoSQL 數(shù)據(jù)庫會(huì)傾向于 AP,如 Apache Cassandra。但是它們會(huì)通過不同級(jí)別的一致性模式調(diào)整來提供高一致性方案。

CP 系統(tǒng)的場(chǎng)景實(shí)現(xiàn)思路是需要引入共識(shí)算法,需要大多數(shù)節(jié)點(diǎn)參與進(jìn)來,才能保證一致性。如果要始終保持一致,那么在網(wǎng)絡(luò)分區(qū)的情況下,部分節(jié)點(diǎn)可能不可用。

而 AP 系統(tǒng)只要一個(gè)副本就能啟動(dòng),數(shù)據(jù)庫會(huì)始終接受寫入和讀取服務(wù)。它可能最終會(huì)丟失數(shù)據(jù)或產(chǎn)生不一致的結(jié)果。這里可以使用客戶端模式或 Session 模型,來提供一致性的解決方案。

使用 CAP 理論時(shí)需要注意一些限制條件。

CAP 討論的是網(wǎng)絡(luò)分區(qū),而不是節(jié)點(diǎn)崩潰或任何其他類型的故障。這意味著網(wǎng)絡(luò)分區(qū)后的節(jié)點(diǎn)都可能接受請(qǐng)求,從而產(chǎn)生不一致的現(xiàn)象。但是崩潰的節(jié)點(diǎn)將完全不受響應(yīng),不會(huì)產(chǎn)生上述的不一致問題。也就是說,分區(qū)后的節(jié)點(diǎn)并不是都會(huì)面臨不一致的問題。而與之相對(duì)的,網(wǎng)絡(luò)分區(qū)并不能包含真實(shí)場(chǎng)景中的所有故障。

CAP 意味著即使所有節(jié)點(diǎn)都在運(yùn)行中,我們也可能會(huì)遇到一致性問題,這是因?yàn)樗鼈冎g存在連接性問題。CAP 理論常常用三角形表示,就好像我們可以任意匹配三個(gè)參數(shù)一樣。然而,盡管我們可以調(diào)整可用性和一致性,但分區(qū)容忍性是我們無法實(shí)際放棄的。

如果我們選擇了 CA 而放棄了 P,那么當(dāng)發(fā)生分區(qū)現(xiàn)象時(shí),為了保證 C,系統(tǒng)需要禁止寫入。也就是,當(dāng)有寫入請(qǐng)求時(shí),系統(tǒng)不可用。這與 A 沖突了,因?yàn)?A 要求系統(tǒng)是可用的。因此,分布式系統(tǒng)理論上不可能選擇 CA 架構(gòu),只能選擇 CP 或者 AP 架構(gòu)。

如下圖所示,其實(shí) CA 類系統(tǒng)是不存在的,這里你需要特別注意。

圖 1 CAP 理論

CAP 中的可用性也不同于上述的高可用性,CAP 定義對(duì)請(qǐng)求的延遲沒有任何限制。此外,與 CAP 相反,數(shù)據(jù)庫的高可用性并不需要每個(gè)在線節(jié)點(diǎn)都可以提供服務(wù)。

CAP 里面的 C 代表線性一致,除了它以外,還有其他的一致模式,我們現(xiàn)在來具體介紹一下。

一致性模型

一致性模型是分布式系統(tǒng)的經(jīng)典內(nèi)容,也是入門分布式數(shù)據(jù)庫的重要知識(shí)點(diǎn)。但很少有人知道,其實(shí)一致性模型來源于單機(jī)理論中的共享內(nèi)存。

從用戶的角度看,分布式數(shù)據(jù)庫就像具有共享存儲(chǔ)的單機(jī)數(shù)據(jù)庫一樣,節(jié)點(diǎn)間的通信和消息傳遞被隱藏到了數(shù)據(jù)庫內(nèi)部,這會(huì)使用戶產(chǎn)生“分布式數(shù)據(jù)庫是一種共享內(nèi)存”的錯(cuò)覺。一個(gè)支持讀取和寫入操作的單個(gè)存儲(chǔ)單元通常稱為寄存器,我們可以把代表分布式數(shù)據(jù)庫的共享存儲(chǔ)看作是一組這樣的寄存器。

每個(gè)讀寫寄存器的操作被抽象為“調(diào)用”和“完成”兩個(gè)動(dòng)作。如果“調(diào)用”發(fā)生后,但在“完成”之前該操作崩潰了,我們將操作定義為失敗。如果一個(gè)操作的調(diào)用和完成事件都在另一個(gè)操作被調(diào)用之前發(fā)生,我們說這個(gè)操作在另一個(gè)操作之前,并且這兩個(gè)操作是順序的;否則,我們說它們是并發(fā)的。

如下圖所示,a)是順序操作,b)和 c)是并發(fā)操作。

圖 2 順序操作&并發(fā)操作

多個(gè)讀取或?qū)懭氩僮骺梢酝瑫r(shí)訪問一個(gè)寄存器。對(duì)寄存器的讀寫操作不是瞬間完成的,需要一些時(shí)間,即調(diào)用和完成兩個(gè)動(dòng)作之間的時(shí)間。由不同進(jìn)程執(zhí)行的并發(fā)讀/寫操作不是串行的,根據(jù)寄存器在操作重疊時(shí)的行為,它們的順序可能不同,并且可能產(chǎn)生不同的結(jié)果。

當(dāng)我們討論數(shù)據(jù)庫一致性時(shí),可以從兩個(gè)維度來區(qū)別。

滯后性。它是數(shù)據(jù)改變的時(shí)刻與其副本接收到數(shù)據(jù)的時(shí)刻。這是上一講所介紹的復(fù)制延遲場(chǎng)景,一般被歸類為“客戶端一致性”范疇。我們將在“15 | 再談一致性:除了 CAP 之外的一致性模型還有哪些”中進(jìn)一步討論。

順序性。討論的是各種操作在系統(tǒng)所有副本上執(zhí)行的順序狀態(tài)。這是本講一致性模型所討論的重點(diǎn)。

現(xiàn)在我們對(duì)順序性再做進(jìn)一步的探討。

當(dāng)面對(duì)一系列讀寫操作時(shí),作為人類,我們對(duì)它們的執(zhí)行順序是有一個(gè)主觀判斷的。甚至,對(duì)于一個(gè)單機(jī)數(shù)據(jù)而言,這些操作的順序也是可以確定的。但是,在分布式系統(tǒng)中做出這種判斷就不是那么容易了,因?yàn)楹茈y知道什么時(shí)候確切地發(fā)生了什么,并且很難在整個(gè)集群中立刻同步這些操作。

為了推理操作順序并指出真正的結(jié)果,我們必須定義一致性模型來保障順序性。

我們?cè)趺磥砝斫饽P椭小氨U稀钡暮x呢?它是將一致性模型視為用戶與數(shù)據(jù)庫之間的一種約定,每個(gè)數(shù)據(jù)庫副本如何做才能滿足這種順序保障?并且用戶在讀取和寫入數(shù)據(jù)時(shí)期望得到什么?也就是說,即使數(shù)據(jù)是被并發(fā)讀取和寫入的,用戶也可以獲得某種可預(yù)測(cè)的結(jié)果。

需要注意,我們將要討論單一對(duì)象和單一操作一致性模型,但現(xiàn)實(shí)的數(shù)據(jù)庫事務(wù)是多步操作的,我們將在下面“事務(wù)與一致性”部分進(jìn)一步討論。

下面我按照順序性的保障由強(qiáng)到弱來介紹一致性模型。

嚴(yán)格一致性

嚴(yán)格的一致性類似于不存在復(fù)制過程:任何節(jié)點(diǎn)的任何寫入都可立即用于所有節(jié)點(diǎn)的后續(xù)讀取。它涉及全局時(shí)鐘的概念,如果任何節(jié)點(diǎn)在時(shí)刻 T1 處寫入新數(shù)據(jù) A,則所有節(jié)點(diǎn)在 T2 時(shí)刻(T2 滿足 T2>T1),都應(yīng)該讀到新寫入的 A。

不幸的是,這只是理論模型,現(xiàn)實(shí)中無法實(shí)現(xiàn)。因?yàn)楦鞣N物理限制使分布式數(shù)據(jù)不可能一瞬間去同步這種變化。

線性一致性

線性一致性是最嚴(yán)格的且可實(shí)現(xiàn)的單對(duì)象單操作一致性模型。在這種模型下,寫入的值在調(diào)用和完成之間的某個(gè)時(shí)間點(diǎn)可以被其他節(jié)點(diǎn)讀取出來。且所有節(jié)點(diǎn)讀到數(shù)據(jù)都是原子的,即不會(huì)讀到數(shù)據(jù)轉(zhuǎn)換的過程和中間未完成的狀態(tài)。

線性一致需要滿足的是,新寫入的數(shù)據(jù)一旦被讀取出來,那么所有后續(xù)的讀操作應(yīng)該能讀取到這個(gè)數(shù)據(jù)。也就是說,一旦一個(gè)讀取操作讀到了一個(gè)值,那么后續(xù)所有讀取操作都會(huì)讀到這個(gè)數(shù)值或至少是“最近”的一個(gè)值。

上面的定義來自早期的論文,我將里面的關(guān)鍵點(diǎn)提煉一下,如下所示。

  • 需要有全局時(shí)鐘,來實(shí)現(xiàn)所謂的“最近”。因?yàn)闆]有全局一致的時(shí)間,兩個(gè)獨(dú)立進(jìn)程沒有相同的“最近”概念。
  • 任何一次讀取都能讀到這個(gè)“最近”的值。

下面我通過一個(gè)例子來說明線性一致性。

現(xiàn)在有三個(gè)節(jié)點(diǎn),其中一個(gè)共享變量 x 執(zhí)行寫操作,而第三個(gè)節(jié)點(diǎn)會(huì)讀取到如下數(shù)值。

  • 第一個(gè)讀操作可以返回 1、2 或空(初始值,兩個(gè)寫操作之前的狀態(tài)),因?yàn)閮蓚€(gè)寫操作仍在進(jìn)行中;第一次讀取可以在兩次寫入之前,第一次寫入與第二次寫入之間,以及兩次寫入之后。
  • 由于第一次寫操作已完成,但第二次寫操作尚未完成,因此第二次讀操作只能返回 1 和 2。
  • 第三次讀只能返回 2,因?yàn)榈诙螌懯窃诘谝淮螌懼筮M(jìn)行的。

下圖正是現(xiàn)象一致性的直觀展示。

圖 3 線性一致性

線性一致性的代價(jià)是很高昂的,甚至 CPU 都不會(huì)使用線性一致性。有并發(fā)編程經(jīng)驗(yàn)的朋友一定知道 CAS 操作,該操作可以實(shí)現(xiàn)操作的線性化,是高性能并發(fā)編程的關(guān)鍵,它就是通過編程手段來模擬線性一致。

一個(gè)比較常見的誤區(qū)是,使用一致性算法可以實(shí)現(xiàn)線性一致,如 Paxos 和 Raft 等。但實(shí)際是不行的,以 Raft 為例,算法只是保證了復(fù)制 Log 的線性一致,而沒有描述 Log 是如何寫入最終的狀態(tài)機(jī)的,這就暗含狀態(tài)機(jī)本身不是線性一致的。

這里推薦你閱讀 TiKV 關(guān)于線性一致的實(shí)現(xiàn)細(xì)節(jié),由于線性一致性價(jià)比不高,這里就不進(jìn)行贅述了,我們接下來說說順序一致性和因果一致性。

順序一致性

由于線性一致的代價(jià)高昂,因此人們想到,既然全局時(shí)鐘導(dǎo)致嚴(yán)格一致性很難實(shí)現(xiàn),那么順序一致性就是放棄了全局時(shí)鐘的約束,改為分布式邏輯時(shí)鐘實(shí)現(xiàn)。順序一致性是指所有的進(jìn)程以相同的順序看到所有的修改。讀操作未必能及時(shí)得到此前其他進(jìn)程對(duì)同一數(shù)據(jù)的寫更新,但是每個(gè)進(jìn)程讀到的該數(shù)據(jù)的不同值的順序是一致的。

下圖展示了 P1、P2 寫入兩個(gè)值后,P3 和 P4 是如何讀取的。以真實(shí)的時(shí)間衡量,1 應(yīng)該是在 2 之前被寫入,但是在順序一致性下,1 是可以被排在 2 之后的。同時(shí),盡管 P3 已經(jīng)讀取值 1,P4 仍然可以讀取 2。但是需要注意的是這兩種組合:1->2 和 2 ->1,P3 和 P4 從它們中選擇一個(gè),并保持一致。下圖正是展示了它們讀取順序的一種可能:2->1。

圖 4 順序一致性

我們使用下圖來進(jìn)一步區(qū)分線性一致和順序一致。

圖 5 區(qū)分線性一致和順序一致

其中,圖 a 滿足了順序一致性,但是不滿足線性一致性。原因在于,從全局時(shí)鐘的觀點(diǎn)來看,P2 進(jìn)程對(duì)變量 x 的讀操作在 P1 進(jìn)程對(duì)變量 x 的寫操作之后,然而讀出來的卻是舊的數(shù)據(jù)。但是這個(gè)圖卻是滿足順序一致性,因?yàn)閮蓚€(gè)進(jìn)程 P1 和 P2 的一致性并沒有沖突。

圖 b 滿足線性一致性,因?yàn)槊總€(gè)讀操作都讀到了該變量的最新寫的結(jié)果,同時(shí)兩個(gè)進(jìn)程看到的操作順序與全局時(shí)鐘的順序一樣。

圖 c 不滿足順序一致性,因?yàn)閺倪M(jìn)程 P1 的角度看,它對(duì)變量 y 的讀操作返回了結(jié)果 0。那么就是說,P1 進(jìn)程的對(duì)變量 y 的讀操作在 P2 進(jìn)程對(duì)變量 y 的寫操作之前,x 變量也如此。因此這個(gè)順序不滿足順序一致性。

在實(shí)踐中,你就可以使用上文提到的一致性算法來實(shí)現(xiàn)順序一致。這些算法可以保證操作在每個(gè)節(jié)點(diǎn)都是按照一樣的順序被執(zhí)行的,所以它們能保證順序一致。

如 Google Megastore 這類系統(tǒng)都是使用 Paxos 算法實(shí)現(xiàn)了順序一致性。也就是說在 Megastore 內(nèi)部,如果有一個(gè)數(shù)據(jù)更新,所有節(jié)點(diǎn)都會(huì)同步更新,且操作在各個(gè)節(jié)點(diǎn)上執(zhí)行順序是一致的。

因果一致性

相比于順序一致性,因果一致性的要求會(huì)低一些:它僅要求有因果關(guān)系的操作順序是一致的,沒有因果關(guān)系的操作順序是隨機(jī)的。

因果相關(guān)的要求有如下幾點(diǎn)。

  • 本地順序:本進(jìn)程中,事件執(zhí)行的順序即為本地因果順序。
  • 異地順序:如果讀操作返回的是寫操作的值,那么該寫操作在順序上一定在讀操作之前。
  • 閉包傳遞:和時(shí)鐘向量里面定義的一樣,如果 a->b、b->c,那么肯定也有 a->c。

那么,為什么需要因果關(guān)系,以及沒有因果關(guān)系的寫法如何傳播?下圖中,進(jìn)程 P1 和 P2 進(jìn)行的寫操作沒有因果關(guān)系,也就是最終一致性。這些操作的結(jié)果可能會(huì)在不同時(shí)間,以亂序方式傳播到讀取端。進(jìn)程 P3 在看到 2 之前將看到值 1,而 P4 將先看到 2,然后看到 1。

圖 6 因果一致性

而下圖顯示進(jìn)程 P1 和 P2 進(jìn)行因果相關(guān)的寫操作并按其邏輯順序傳播到 P3 和 P4。因果寫入除了寫入數(shù)據(jù)外,還需要附加一個(gè)邏輯時(shí)鐘,用這個(gè)時(shí)鐘保證兩個(gè)寫入是有因果關(guān)系的。這可以防止我們遇到上面那張圖所示的情況。你可以在兩個(gè)圖中比較一下 P3 和 P4 的歷史記錄。

圖 7 邏輯時(shí)鐘

而實(shí)現(xiàn)這個(gè)邏輯時(shí)鐘的一種主要方式就是向量時(shí)鐘。向量時(shí)鐘算法利用了向量這種數(shù)據(jù)結(jié)構(gòu),將全局各個(gè)進(jìn)程的邏輯時(shí)間戳廣播給所有進(jìn)程,每個(gè)進(jìn)程發(fā)送事件時(shí)都會(huì)將當(dāng)前進(jìn)程已知的所有進(jìn)程時(shí)間寫入到一個(gè)向量中,而后進(jìn)行傳播。

因果一致性典型案例就是 COPS 系統(tǒng),它是基于 causal+一致性模型的 KV 數(shù)據(jù)庫。它定義了 dependencies,操作了實(shí)現(xiàn)因果一致性。這對(duì)業(yè)務(wù)實(shí)現(xiàn)分布式數(shù)據(jù)因果關(guān)系很有幫助。另外在亞馬遜 Dynamo 基于向量時(shí)鐘,也實(shí)現(xiàn)了因果一致性。

事務(wù)隔離級(jí)別與一致性模型

現(xiàn)在我們談?wù)摿艘恢滦阅P停撬c數(shù)據(jù)庫領(lǐng)域之中的事務(wù)有什么區(qū)別呢?我先說結(jié)論:有關(guān)系但又沒有關(guān)系。

怎么理解呢?我先來論證它們之間的無關(guān)性。

ACID 和 CAP 中的“C”是都是一致性,但是它們的內(nèi)涵完全不同。其中 ADI 都是數(shù)據(jù)庫提供的能力保障,但是 C(一致性)卻不是,它是業(yè)務(wù)層面的一種邏輯約束。

以轉(zhuǎn)賬這個(gè)最為經(jīng)典的例子而言,甲有 100 元 RMB,乙有 0 元 RMB,現(xiàn)在甲要轉(zhuǎn)給乙 30 元。那么轉(zhuǎn)賬前后,甲有 70,乙有 30,合起來還是 100。顯然,這只是業(yè)務(wù)層規(guī)定的邏輯約束而已。

而對(duì)于 CAP 這里的 C 上文已經(jīng)有了明確說明,即線性一致性。它表示副本讀取數(shù)據(jù)的即時(shí)性,也就是對(duì)“何時(shí)”能讀到“正確”的數(shù)據(jù)的保證。越是即時(shí),說明系統(tǒng)整體上讀取數(shù)據(jù)是一致的。

那么它們之間的聯(lián)系如何呢?其實(shí)就是事務(wù)的隔離性與一致模型有關(guān)聯(lián)。

如果把上面線性一致的例子看作多個(gè)并行事務(wù),你會(huì)發(fā)現(xiàn)它們是沒有隔離性的。因?yàn)樵陂_始和完成之間任意一點(diǎn)都會(huì)讀取到這份數(shù)據(jù),原因是一致性模型關(guān)心的是單一操作,而事務(wù)是由一組操作組成的。

現(xiàn)在我們看另外一個(gè)例子,這是展示事務(wù)缺乏一致性后所導(dǎo)致的問題。

圖 8 事務(wù)與一致性

其中三個(gè)事務(wù)滿足隔離性。可以看到 T2 讀取到了 T1 入的值。但是這個(gè)系統(tǒng)缺乏一致性保障,造成 T3 可以讀取到早于 T2 讀取值之前的值,這就會(huì)造成應(yīng)用的潛在 Bug。

那現(xiàn)在給出結(jié)論:事務(wù)隔離是描述并行事務(wù)之間的行為,而一致性是描述非并行事務(wù)之間的行為。其實(shí)廣義的事務(wù)隔離應(yīng)該是經(jīng)典隔離理論與一致性模型的一種混合。

比如,我們會(huì)在一些文獻(xiàn)中看到如“one-copy serializability”“strong snapshot isolation”,等等。前者其實(shí)是 serializability 隔離級(jí)別加上順序一致,后者是 snapshot 隔離級(jí)別加上線性一致。

所以對(duì)分布式數(shù)據(jù)庫來說,原始的隔離級(jí)別并沒有舍棄,而是引入了一致性模型后,擴(kuò)寬數(shù)據(jù)庫隔離級(jí)別的內(nèi)涵。

總結(jié)

今天的內(nèi)容較長,不過已經(jīng)精煉很多了。我們從高可用性入手,介紹了 CAP 理論對(duì)于分布式模型評(píng)估的影響;而后重點(diǎn)介紹了一致性模型,這是核心,用來幫助你評(píng)估分布式數(shù)據(jù)庫的特性。

最后我介紹了事務(wù)隔離級(jí)別與一致性模型之間的區(qū)別與聯(lián)系,幫助你認(rèn)清分布式數(shù)據(jù)庫下的事務(wù)隔離級(jí)別的概念。?

責(zé)任編輯:武曉燕 來源: 今日頭條
相關(guān)推薦

2023-11-14 08:24:59

性能Scylla系統(tǒng)架構(gòu)

2023-08-22 13:16:00

分布式數(shù)據(jù)庫架構(gòu)數(shù)據(jù)存儲(chǔ)

2018-07-09 10:59:49

華為云

2021-12-20 15:44:28

ShardingSph分布式數(shù)據(jù)庫開源

2023-12-05 07:30:40

KlustronBa數(shù)據(jù)庫

2023-07-31 08:27:55

分布式數(shù)據(jù)庫架構(gòu)

2023-07-28 07:56:45

分布式數(shù)據(jù)庫SQL

2023-12-18 11:21:40

MongoDB數(shù)據(jù)庫

2022-03-10 06:36:59

分布式數(shù)據(jù)庫排序

2020-06-23 09:35:13

分布式數(shù)據(jù)庫網(wǎng)絡(luò)

2023-03-07 09:49:04

分布式數(shù)據(jù)庫

2024-09-09 09:19:57

2022-08-01 18:33:45

關(guān)系型數(shù)據(jù)庫大數(shù)據(jù)

2024-12-31 00:00:20

分布式數(shù)據(jù)庫可用性

2021-11-08 10:52:02

數(shù)據(jù)庫分布式技術(shù)

2022-06-09 10:19:10

分布式數(shù)據(jù)庫

2011-05-19 09:18:48

分布式數(shù)據(jù)庫

2015-10-16 18:03:25

Docker分布式CoreOS

2020-04-14 11:14:02

PostgreSQL分布式數(shù)據(jù)庫

2018-05-25 13:12:10

UCloud數(shù)據(jù)庫UDDB
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)