摘要:和上一篇博文一樣,這次我們依舊以為案例,來分析理論在一個實(shí)際的分布式數(shù)據(jù)庫中的作用。這次我們來看看,在這樣的分布式數(shù)據(jù)庫中,理論是怎么起作用的。需要最終包含正確的值的服務(wù)器節(jié)點(diǎn)總數(shù)正確的冗余數(shù)據(jù)拷貝數(shù)。其實(shí)這就是關(guān)系型數(shù)據(jù)庫的做法。
和上一篇博文一樣,這次我們依舊以 Riak 為案例,來分析 CAP 理論在一個實(shí)際的分布式數(shù)據(jù)庫中的作用。
如果你還不熟悉 CAP,可以參考我之前的兩篇博客 理解 CAP 理論, 最終一致性.html)。
這次我們來看看,在 Riak 這樣的分布式key-value數(shù)據(jù)庫中,CAP理論是怎么起作用的。
Nodes/Writes/Reads首先還是讓我們來明確幾個概念。
N odes
需要"最終"包含正確的值的服務(wù)器節(jié)點(diǎn)總數(shù)(正確的冗余數(shù)據(jù)拷貝數(shù))。
W rites
每次寫操作,我們需要確保最少有多少節(jié)點(diǎn)被更新。也就是說,我們在執(zhí)行寫操作的時候,不需要等待 N 個節(jié)點(diǎn)都成功被寫入,
而只需要 W 個節(jié)點(diǎn)成功寫入,這次寫操作就返回成功,而其他節(jié)點(diǎn)是在后臺進(jìn)行同步。
R eads
每次讀操作,我們需要確保最少讀到幾份冗余數(shù)據(jù)。也就是說,我們在執(zhí)行讀操作的時候,需要讀到 R 個節(jié)點(diǎn)的數(shù)據(jù)才算讀成功,否則讀取失敗。
為什么要這三個變量?其實(shí)這三個變量直接關(guān)系到了 Riak 的 CAP 特性。下面我們就來一一說明:
Eventual Consistency(W + R <= N)如下圖所示:假設(shè)我們的 N=3, 設(shè)置 W + R <= N(例如:R=2, W=1)。這樣我們的系統(tǒng)可以相對保證讀寫性能。
因?yàn)閷懖僮髦恍枰粋€節(jié)點(diǎn)寫入就返回成功。
然而這里有機(jī)率發(fā)生這樣的情況:就像圖中所示,我寫入的是node1(versionB),然后進(jìn)行了一次讀操作。
恰好這時候新數(shù)據(jù)尚未同步到node2, node3,而讀操作又是從node2,node3取的值。由于這兩個節(jié)點(diǎn)的值都是 version A,
所以得到的值便是 version A。
不過隨著時間的推移,node1 中的 versionB 會被同步到 node2 以及 node3 中。
這時候,再有讀操作,得到的值便是最新值(versionB)了。
這就是所謂的 Eventual Consistency。整個系統(tǒng)有著較高的讀寫性能,但一致性有所犧牲。
如果我們需要加強(qiáng)一致性,可以通過調(diào)整 W, R, N 來實(shí)現(xiàn)。
接下來我們會討論如何調(diào)整 W,R,N 的關(guān)系來平衡讀寫性能和一致性(即 A 和 C 的平衡)。
通過調(diào)節(jié) W,R,N 的關(guān)系來調(diào)節(jié)一致性和讀寫性能的關(guān)系一種極端做法(下圖所示),我們可以設(shè) W=N, R=1。其實(shí)這就是關(guān)系型數(shù)據(jù)庫的做法。
通過確保每次寫操作時,所有相關(guān)節(jié)點(diǎn)都被成功寫入,來確保一致性。這樣可以保證一致性,但是犧牲了寫操作的性能。
還有一種極端做法,我們可以設(shè)W=1, R=N。這樣,無論你向哪個node寫入了數(shù)據(jù),都會被讀到。
然后你讀到的N個值也可能包含舊的值,只要有辦法分辨出哪個是最新的值就可以了
(Riak 是用一直叫向量鐘(Vector Clock)的技術(shù)來判斷的,我們會在后面的博客中做介紹)
這樣可以保證一致性,但是犧牲了讀操作的性能。
最后再給出一種被稱作 quorum 的做法。如下圖所示,可以設(shè)置 W + R > N (例如 W=2, R=2)。這樣同樣可以保證一致性。
然而性能的損失由寫操作和讀操作共同承擔(dān)。這種做法叫做 quorum。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/17458.html
摘要:在分布式數(shù)據(jù)庫中,一份數(shù)據(jù)往往會存儲多份拷貝所謂冗余,或者現(xiàn)在,假設(shè)我們有一個服務(wù)器節(jié)點(diǎn),存有三個數(shù)據(jù)分別是,。 Riak 是什么 Riak 是一個 erlang 開發(fā)的開源的分布式 key-value 數(shù)據(jù)庫,在 High Availability, Fault Tolerance, Scalability 方面表現(xiàn)優(yōu)異。其實(shí)現(xiàn)受 Amazon Dynamodb 啟發(fā),是一個很有代...
閱讀 2154·2023-04-26 00:23
閱讀 828·2021-09-08 09:45
閱讀 2448·2019-08-28 18:20
閱讀 2555·2019-08-26 13:51
閱讀 1608·2019-08-26 10:32
閱讀 1405·2019-08-26 10:24
閱讀 2042·2019-08-26 10:23
閱讀 2209·2019-08-23 18:10