麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > 數(shù)據(jù)庫(kù) > 文庫(kù) > 正文

深入解析NoSQL數(shù)據(jù)庫(kù)的分布式算法(圖文詳解)

2020-10-29 21:48:56
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

盡管NoSQL運(yùn)動(dòng)并沒(méi)有給分布式數(shù)據(jù)處理帶來(lái)根本性的技術(shù)變革,但是依然引發(fā)了鋪天蓋地的關(guān)于各種協(xié)議和算法的研究以及實(shí)踐。在這篇文章里,我將針對(duì)NoSQL數(shù)據(jù)庫(kù)的分布式特點(diǎn)進(jìn)行一些系統(tǒng)化的描述。

系統(tǒng)的可擴(kuò)展性是推動(dòng)NoSQL運(yùn)動(dòng)發(fā)展的的主要理由,包含了分布式系統(tǒng)協(xié)調(diào),故障轉(zhuǎn)移,資源管理和許多其他特性。這么講使得NoSQL聽起來(lái)像是一個(gè)大筐,什么都能塞進(jìn)去。盡管NoSQL運(yùn)動(dòng)并沒(méi)有給分布式數(shù)據(jù)處理帶來(lái)根本性的技術(shù)變革,但是依然引發(fā)了鋪天蓋地的關(guān)于各種協(xié)議和算法的研究以及實(shí)踐。正是通過(guò)這些嘗試逐漸總結(jié)出了一些行之有效的數(shù)據(jù)庫(kù)構(gòu)建方法。在這篇文章里,我將針對(duì)NoSQL數(shù)據(jù)庫(kù)的分布式特點(diǎn)進(jìn)行一些系統(tǒng)化的描述。

接下來(lái)我們將研究一些分布式策略,比如故障檢測(cè)中的復(fù)制,這些策略用黑體字標(biāo)出,被分為三段:

1、數(shù)據(jù)一致性。NoSQL需要在分布式系統(tǒng)的一致性,容錯(cuò)性和性能,低延遲及高可用之間作出權(quán)衡,一般來(lái)說(shuō),數(shù)據(jù)一致性是一個(gè)必選項(xiàng),所以這一節(jié)主要是關(guān)于數(shù)據(jù)復(fù)制和數(shù)據(jù)恢復(fù)。
2、數(shù)據(jù)放置。一個(gè)數(shù)據(jù)庫(kù)產(chǎn)品應(yīng)該能夠應(yīng)對(duì)不同的數(shù)據(jù)分布,集群拓?fù)浜陀布渲?。在這一節(jié)我們將討論如何分布以及調(diào)整數(shù)據(jù)分布才能夠能夠及時(shí)解決故障,提供持久化保證,高效查詢和保證集群中的資源(如內(nèi)存和硬盤空間)得到均衡使用。
3、對(duì)等系統(tǒng)。像 leader election 這樣的的技術(shù)已經(jīng)被用于多個(gè)數(shù)據(jù)庫(kù)產(chǎn)品以實(shí)現(xiàn)容錯(cuò)和數(shù)據(jù)強(qiáng)一致性。然而,即使是分散的的數(shù)據(jù)庫(kù)(無(wú)中心)也要跟蹤它們的全局狀態(tài),檢測(cè)故障和拓?fù)渥兓_@一節(jié)將介紹幾種使系統(tǒng)保持一致狀態(tài)的技術(shù)。

數(shù)據(jù)一致性

眾所周知,分布式系統(tǒng)經(jīng)常會(huì)遇到網(wǎng)絡(luò)隔離或是延遲的情況,在這種情況下隔離的部分是不可用的,因此要保持高可用性而不犧牲一致性是不可能的。這一事實(shí)通常被稱作“CAP理論”。然而,一致性在分布式系統(tǒng)中是一個(gè)非常昂貴的東西,所以經(jīng)常需要在這上面做一些讓步,不只是針對(duì)可用性,還有多種權(quán)衡。為了研究這些權(quán)衡,我們注意到分布式系統(tǒng)的一致性問(wèn)題是由數(shù)據(jù)隔離和復(fù)制引起的,所以我們將從研究復(fù)制的特點(diǎn)開始:

  • 可用性。在網(wǎng)絡(luò)隔離的情況下剩余部分仍然可以應(yīng)對(duì)讀寫請(qǐng)求。
  • 讀寫延遲。讀寫請(qǐng)求能夠在短時(shí)間內(nèi)處理。
  • 讀寫延展性。讀寫的壓力可由多個(gè)節(jié)點(diǎn)均衡分擔(dān)。
  • 容錯(cuò)性。對(duì)于讀寫請(qǐng)求的處理不依賴于任何一個(gè)特定節(jié)點(diǎn)。
  • 數(shù)據(jù)持久性。特定條件下的節(jié)點(diǎn)故障不會(huì)造成數(shù)據(jù)丟失。
  • 一致性。一致性比前面幾個(gè)特性都要復(fù)雜得多,我們需要詳細(xì)討論一下幾種不同的觀點(diǎn)。 但是我們不會(huì)涉及過(guò)多的一致性理論和并發(fā)模型,因?yàn)檫@已經(jīng)超出了本文的范疇,我只會(huì)使用一些簡(jiǎn)單特點(diǎn)構(gòu)成的精簡(jiǎn)體系。
  • 讀寫一致性。從讀寫的觀點(diǎn)來(lái)看,數(shù)據(jù)庫(kù)的基本目標(biāo)是使副本趨同的時(shí)間盡可能短(即更新傳遞到所有副本的時(shí)間),保證最終一致性。除了這個(gè)較弱的保證,還有一些更強(qiáng)的一致性特點(diǎn):
  • 寫后讀一致性。在數(shù)據(jù)項(xiàng)X上寫操作的效果總是能夠被后續(xù)的X上的讀操作看見。
  • 讀后讀一致性。在一次對(duì)數(shù)據(jù)項(xiàng)X的讀操作之后,后續(xù)對(duì)X的讀操作應(yīng)該返回與第一次的返回值相同或是更加新的值。
  • 寫一致性。分區(qū)的數(shù)據(jù)庫(kù)經(jīng)常會(huì)發(fā)生寫沖突。數(shù)據(jù)庫(kù)應(yīng)當(dāng)能處理這種沖突并保證多個(gè)寫請(qǐng)求不會(huì)被不同的分區(qū)所處理。這方面數(shù)據(jù)庫(kù)提供了幾種不同的一致性模型:
  • 原子寫。假如數(shù)據(jù)庫(kù)提供了API,一次寫操作只能是一個(gè)單獨(dú)的原子性的賦值,避免寫沖突的辦法是找出每個(gè)數(shù)據(jù)的“最新版本”。這使得所有的節(jié)點(diǎn)都能夠在更新結(jié)束時(shí)獲得同一版本,而與更新的順序無(wú)關(guān),網(wǎng)絡(luò)故障和延遲經(jīng)常造成各節(jié)點(diǎn)更新順序不一致。 數(shù)據(jù)版本可以用時(shí)間戳或是用戶指定的值來(lái)表示。Cassandra用的就是這種方法。
  • 原子化的讀-改-寫。應(yīng)用有時(shí)候需要進(jìn)行 讀-改-寫 序列操作而非單獨(dú)的原子寫操作。假如有兩個(gè)客戶端讀取了同一版本的數(shù)據(jù),修改并且把修改后的數(shù)據(jù)寫回,按照原子寫模型,時(shí)間上比較靠后的那一次更新將會(huì)覆蓋前一次。這種行為在某些情況下是不正確的(例如,兩個(gè)客戶端往同一個(gè)列表值中添加新值)。數(shù)據(jù)庫(kù)提供了至少兩種解決方法:
  • 沖突預(yù)防。 讀-改-寫 可以被認(rèn)為是一種特殊情況下的事務(wù),所以分布式鎖或是 PAXOS這樣的一致協(xié)議都可以解決這種問(wèn)題。這種技術(shù)支持原子讀改寫語(yǔ)義和任意隔離級(jí)別的事務(wù)。另一種方法是避免分布式的并發(fā)寫操作,將對(duì)特定數(shù)據(jù)項(xiàng)的所有寫操作路由到單個(gè)節(jié)點(diǎn)上(可以是全局主節(jié)點(diǎn)或者分區(qū)主節(jié)點(diǎn))。為了避免沖突,數(shù)據(jù)庫(kù)必須犧牲網(wǎng)絡(luò)隔離情況下的可用性。這種方法常用于許多提供強(qiáng)一致性保證的系統(tǒng)(例如大多數(shù)關(guān)系數(shù)據(jù)庫(kù),HBase,MongoDB)。
  • 沖突檢測(cè)。數(shù)據(jù)庫(kù)跟蹤并發(fā)更新的沖突,并選擇回滾其中之一或是維持兩個(gè)版本交由客戶端解決。并發(fā)更新通常用向量時(shí)鐘 (這是一種樂(lè)觀鎖)來(lái)跟蹤,或者維護(hù)一個(gè)完整的版本歷史。這個(gè)方法用于 Riak, Voldemort, CouchDB.

現(xiàn)在讓我們仔細(xì)看看常用的復(fù)制技術(shù),并按照描述的特點(diǎn)給他們分一下類。第一幅圖描繪了不同技術(shù)之間的邏輯關(guān)系和不同技術(shù)在系統(tǒng)的一致性、擴(kuò)展性、可用性、延遲性之間的權(quán)衡坐標(biāo)。 第二張圖詳細(xì)描繪了每個(gè)技術(shù)。

復(fù)本因子是4。讀寫協(xié)調(diào)者可以是一個(gè)外部客戶端或是一個(gè)內(nèi)部代理節(jié)點(diǎn)。

我們會(huì)依據(jù)一致性從弱到強(qiáng)把所有的技術(shù)過(guò)一遍:

(A, 反熵) 一致性最弱,基于策略如下。寫操作的時(shí)候選擇任意一個(gè)節(jié)點(diǎn)更新,在讀的時(shí)候如果新數(shù)據(jù)還沒(méi)有通過(guò)后臺(tái)的反熵協(xié)議傳遞到讀的那個(gè)節(jié)點(diǎn),那么讀到的仍然是舊數(shù)據(jù)。(下一節(jié)會(huì)詳細(xì)介紹反熵協(xié)議)。這種方法的主要特點(diǎn)是:

  • 過(guò)高的傳播延遲使它在數(shù)據(jù)同步方面不太好用,所以比較典型的用法是只作為輔助性的功能來(lái)檢測(cè)和修復(fù)計(jì)劃外的不一致。Cassandra就使用了反熵算法來(lái)在各節(jié)點(diǎn)之間傳遞數(shù)據(jù)庫(kù)拓?fù)浜推渌恍┰獢?shù)據(jù)信息。
  • 一致性保證較弱:即使在沒(méi)有發(fā)生故障的情況下,也會(huì)出現(xiàn)寫沖突與讀寫不一致。
  • 在網(wǎng)絡(luò)隔離下的高可用和健壯性。用異步的批處理替代了逐個(gè)更新,這使得性能表現(xiàn)優(yōu)異。
  • 持久性保障較弱因?yàn)樾碌臄?shù)據(jù)最初只有單個(gè)副本。

(B) 對(duì)上面模式的一個(gè)改進(jìn)是在任意一個(gè)節(jié)點(diǎn)收到更新數(shù)據(jù)請(qǐng)求的同時(shí)異步的發(fā)送更新給所有可用節(jié)點(diǎn)。這也被認(rèn)為是定向的反熵。

  • 與純粹的反熵相比,這種做法只用一點(diǎn)小小的性能犧牲就極大地提高了一致性。然而,正式一致性和持久性保持不變。
  • 假如某些節(jié)點(diǎn)因?yàn)榫W(wǎng)絡(luò)故障或是節(jié)點(diǎn)失效在當(dāng)時(shí)是不可用的,更新最終也會(huì)通過(guò)反熵傳播過(guò)程來(lái)傳遞到該節(jié)點(diǎn)。

(C) 在前一個(gè)模式中,使用提示移交技術(shù)可以更好地處理某個(gè)節(jié)點(diǎn)的操作失敗。對(duì)于失效節(jié)點(diǎn)的預(yù)期更新被記錄在額外的代理節(jié)點(diǎn)上,并且標(biāo)明一旦特點(diǎn)節(jié)點(diǎn)可用就要將更新傳遞給該節(jié)點(diǎn)。這樣做提高了一致性,降低了復(fù)制收斂時(shí)間。

(D, 一次性讀寫)因?yàn)樘崾疽平坏呢?zé)任節(jié)點(diǎn)也有可能在將更新傳遞出去之前就已經(jīng)失效,在這種情況下就有必要通過(guò)所謂的讀修復(fù)來(lái)保證一致性。每個(gè)讀操作都會(huì)啟動(dòng)一個(gè)異步過(guò)程,向存儲(chǔ)這條數(shù)據(jù)的所有節(jié)點(diǎn)請(qǐng)求一份數(shù)據(jù)摘要(像簽名或者h(yuǎn)ash),如果發(fā)現(xiàn)各節(jié)點(diǎn)返回的摘要不一致則統(tǒng)一各節(jié)點(diǎn)上的數(shù)據(jù)版本。我們用一次性讀寫來(lái)命名組合了A、B、C、D的技術(shù)- 他們都沒(méi)有提供嚴(yán)格的一致性保證,但是作為一個(gè)自備的方法已經(jīng)可以用于實(shí)踐了。

(E, 讀若干寫若干) 上面的策略是降低了復(fù)制收斂時(shí)間的啟發(fā)式增強(qiáng)。為了保證更強(qiáng)的一致性,必須犧牲可用性來(lái)保證一定的讀寫重疊。 通常的做法是同時(shí)寫入W個(gè)副本而不是一個(gè),讀的時(shí)候也要讀R個(gè)副本。

  • 首先,可以配置寫副本數(shù)W>1。
  • 其次,因?yàn)镽+W>N,寫入的節(jié)點(diǎn)和讀取的節(jié)點(diǎn)之間必然會(huì)有重疊,所以讀取的多個(gè)數(shù)據(jù)副本里至少會(huì)有一個(gè)是比較新的數(shù)據(jù)(上面的圖中 W=2, R=3, N=4 )。這樣在讀寫請(qǐng)求依序進(jìn)行的時(shí)候(寫執(zhí)行完再讀)能夠保證一致性(對(duì)于單個(gè)用戶的讀寫一致性),但是不能保障全局的讀一致性。用下面圖示里的例子來(lái)看,R=2,W=2,N=3,因?yàn)閷懖僮鲗?duì)于兩個(gè)副本的更新是非事務(wù)的,在更新沒(méi)有完成的時(shí)候讀就可能讀到兩個(gè)都是舊值或者一新一舊:

  • 對(duì)于某種讀延遲的要求,設(shè)置R和W的不同值可以調(diào)整寫延遲與持久性,反之亦然。
  • 如果W<=N/2,并發(fā)的多個(gè)寫入會(huì)寫到不同的若干節(jié)點(diǎn)(如,寫操作A寫前N/2個(gè),B寫后N/2個(gè))。 設(shè)置 W>N/2 可以保證在符合回滾模型的原子讀改寫時(shí)及時(shí)檢測(cè)到?jīng)_突。
  • 嚴(yán)格來(lái)講,這種模式雖然可以容忍個(gè)別節(jié)點(diǎn)的失效, 但是對(duì)于網(wǎng)絡(luò)隔離的容錯(cuò)性并不好。在實(shí)踐中,常使用”近似數(shù)量通過(guò)“這樣的方法,通過(guò)犧牲一致性來(lái)提高某些情景下的可用性。

(F, 讀全部寫若干)讀一致性問(wèn)題可以通過(guò)在讀數(shù)據(jù)的時(shí)候訪問(wèn)所有副本(讀數(shù)據(jù)或者檢查摘要)來(lái)減輕。這確保了只要有至少一個(gè)節(jié)點(diǎn)上的數(shù)據(jù)更新新的數(shù)據(jù)就能被讀取者看到。但是在網(wǎng)絡(luò)隔離的情況下這種保證就不能起到作用了。

(G, 主從) 這種技術(shù)常被用來(lái)提供原子寫或者 沖突檢測(cè)持久級(jí)別的讀改寫。為了實(shí)現(xiàn)沖突預(yù)防級(jí)別,必須要用一種集中管理方式或者是鎖。最簡(jiǎn)單的策略是用主從異步復(fù)制。對(duì)于特定數(shù)據(jù)項(xiàng)的寫操作全部被路由到一個(gè)中心節(jié)點(diǎn),并在上面順序執(zhí)行。這種情況下主節(jié)點(diǎn)會(huì)成為瓶頸,所以必須要將數(shù)據(jù)劃分成一個(gè)個(gè)獨(dú)立的片區(qū)(不同片有不同的master),這樣才能提供擴(kuò)展性。

(H, Transactional Read Quorum Write Quorum and Read One Write All)  更新多個(gè)副本的方法可以通過(guò)使用事務(wù)控制技術(shù)來(lái)避免寫沖突。 眾所周知的方法是使用兩階段提交協(xié)議。但兩階段提交并不是完全可靠的,因?yàn)閰f(xié)調(diào)者失效可能會(huì)造成資源阻塞。 PAXOS提交協(xié)議是更可靠的選擇,但會(huì)損失一點(diǎn)性能。 在這個(gè)基礎(chǔ)上再向前一小步就是讀一個(gè)副本寫所有副本,這種方法把所有副本的更新放在一個(gè)事務(wù)中,它提供了強(qiáng)容錯(cuò)一致性但會(huì)損失掉一些性能和可用性。

上面分析中的一些權(quán)衡有必要再?gòu)?qiáng)調(diào)一下

  • 一致性與可用性。 嚴(yán)密的權(quán)衡已經(jīng)由CAP理論給出了。在網(wǎng)絡(luò)隔離的情況下,數(shù)據(jù)庫(kù)要么將數(shù)據(jù)集中,要么既要接受數(shù)據(jù)丟失的風(fēng)險(xiǎn)。
  • 一致性與擴(kuò)展性。 看得出即使讀寫一致性保證降低了副本集的擴(kuò)展性,只有在原子寫模型中才可以以一種相對(duì)可擴(kuò)展的方式處理寫沖突。原子讀改寫模型通過(guò)給數(shù)據(jù)加上臨時(shí)性的全局鎖來(lái)避免沖突。這表明, 數(shù)據(jù)或操作之間的依賴,即使是很小范圍內(nèi)或很短時(shí)間的,也會(huì)損害擴(kuò)展性。所以精心設(shè)計(jì)數(shù)據(jù)模型,將數(shù)據(jù)分片分開存放對(duì)于擴(kuò)展性非常重要。
  • 一致性與延遲。 如上所述,當(dāng)數(shù)據(jù)庫(kù)需要提供強(qiáng)一致性或者持久性的時(shí)候應(yīng)該偏向于讀寫所有副本技術(shù)。但是很明顯一致性與請(qǐng)求延遲成反比,所以使用若干副本技術(shù)會(huì)是比較中允的辦法。
  • 故障轉(zhuǎn)移與一致性/擴(kuò)展性/延遲。有趣的是容錯(cuò)性與一致性、擴(kuò)展性、延遲的取舍沖突并不劇烈。通過(guò)合理的放棄一些性能與一致性,集群可以容忍多達(dá) up to 的節(jié)點(diǎn)失效。這種折中在兩階段提交與 PAXOS 協(xié)議的區(qū)別里體現(xiàn)得很明顯。這種折中的另一個(gè)例子是增加特定的一致性保障,比如使用嚴(yán)格會(huì)話進(jìn)程的“讀己所寫”,但這又增加了故障轉(zhuǎn)移的復(fù)雜性。

反熵協(xié)議, 謠言傳播算法

讓我們從以下場(chǎng)景開始:

有許多節(jié)點(diǎn),每條數(shù)據(jù)會(huì)在其中的若干的節(jié)點(diǎn)上面存有副本。每個(gè)節(jié)點(diǎn)都可以單獨(dú)處理更新請(qǐng)求,每個(gè)節(jié)點(diǎn)定期和其他節(jié)點(diǎn)同步狀態(tài),如此一段時(shí)間之后所有的副本都會(huì)趨向一致。同步過(guò)程是怎樣進(jìn)行的?同步何時(shí)開始?怎樣選擇同步的對(duì)象?怎么交換數(shù)據(jù)?我們假定兩個(gè)節(jié)點(diǎn)總是用較新版本的數(shù)據(jù)覆蓋舊的數(shù)據(jù)或者兩個(gè)版本都保留以待應(yīng)用層處理。

這個(gè)問(wèn)題常見于數(shù)據(jù)一致性維護(hù)和集群狀態(tài)同步(如集群成員信息傳播)等場(chǎng)景。雖然引入一個(gè)監(jiān)控?cái)?shù)據(jù)庫(kù)并制定同步計(jì)劃的協(xié)調(diào)者可以解決這個(gè)問(wèn)題,但是去中心化的數(shù)據(jù)庫(kù)能夠提供更好的容錯(cuò)性。去中心化的主要做法是利用精心設(shè)計(jì)的傳染協(xié)議,這種協(xié)議相對(duì)簡(jiǎn)單,但是提供了很好的收斂時(shí)間,而且能夠容忍任何節(jié)點(diǎn)的失效和網(wǎng)絡(luò)隔離。盡管有許多類型的傳染算法,我們只關(guān)注反熵協(xié)議,因?yàn)镹oSQL數(shù)據(jù)庫(kù)都在使用它。

反熵協(xié)議假定同步會(huì)按照一個(gè)固定進(jìn)度表執(zhí)行,每個(gè)節(jié)點(diǎn)定期隨機(jī)或是按照某種規(guī)則選擇另外一個(gè)節(jié)點(diǎn)交換數(shù)據(jù),消除差異。有三種反風(fēng)格的反熵協(xié)議:推,拉和混合。推協(xié)議的原理是簡(jiǎn)單選取一個(gè)隨機(jī)節(jié)點(diǎn)然后把數(shù)據(jù)狀態(tài)發(fā)送過(guò)去。在真實(shí)應(yīng)用中將全部數(shù)據(jù)都推送出去顯然是愚蠢的,所以節(jié)點(diǎn)一般按照下圖所示的方式工作。

節(jié)點(diǎn)A作為同步發(fā)起者準(zhǔn)備好一份數(shù)據(jù)摘要,里面包含了A上數(shù)據(jù)的指紋。節(jié)點(diǎn)B接收到摘要之后將摘要中的數(shù)據(jù)與本地?cái)?shù)據(jù)進(jìn)行比較,并將數(shù)據(jù)差異做成一份摘要返回給A。最后,A發(fā)送一個(gè)更新給B,B再更新數(shù)據(jù)。拉方式和混合方式的協(xié)議與此類似,就如上圖所示的。

反熵協(xié)議提供了足夠好的收斂時(shí)間和擴(kuò)展性。下圖展示了一個(gè)在100個(gè)節(jié)點(diǎn)的集群中傳播一個(gè)更新的模擬結(jié)果。在每次迭代中,每個(gè)節(jié)點(diǎn)只與一個(gè)隨機(jī)選取的對(duì)等節(jié)點(diǎn)發(fā)生聯(lián)系。

可以看到,拉方式的收斂性比推方式更好,這可以從理論上得到證明。而且推方式還存在一個(gè)“收斂尾巴”的問(wèn)題。在多次迭代之后,盡管幾乎遍歷到了所有的節(jié)點(diǎn),但還是有很少的一部分沒(méi)受到影響。與單純的推和拉方式相比, 混合方式的效率更高,所以實(shí)際應(yīng)用中通常使用這種方式。反熵是可擴(kuò)展的,因?yàn)槠骄D(zhuǎn)換時(shí)間以集群規(guī)模的對(duì)數(shù)函數(shù)形式增長(zhǎng)。

盡管這些技術(shù)看起來(lái)很簡(jiǎn)單,仍然有許多研究關(guān)注于不同約束條件下反熵協(xié)議的性能表現(xiàn)。其中之一通過(guò)一種更有效的結(jié)構(gòu)使用網(wǎng)絡(luò)拓?fù)鋪?lái)取代隨機(jī)選取 。在網(wǎng)絡(luò)帶寬有限的條件下調(diào)整傳輸率或使用先進(jìn)的規(guī)則來(lái)選取要同步的數(shù)據(jù) 。摘要計(jì)算也面臨挑戰(zhàn),數(shù)據(jù)庫(kù)會(huì)維護(hù)一份最近更新的日志以有助于摘要計(jì)算。

最終一致數(shù)據(jù)類型Eventually Consistent Data Types

在上一節(jié)我們假定兩個(gè)節(jié)點(diǎn)總是合并他們的數(shù)據(jù)版本。但要解決更新沖突并不容易,讓所有副本都最終達(dá)到一個(gè)語(yǔ)義上正確的值出乎意料的難。一個(gè)眾所周知的例子是Amazon Dynamo數(shù)據(jù)庫(kù)中已經(jīng)刪除的條目可以重現(xiàn)。

我們假設(shè)一個(gè)例子來(lái)說(shuō)明這個(gè)問(wèn)題:數(shù)據(jù)庫(kù)維護(hù)一個(gè)邏輯上的全局計(jì)數(shù)器,每個(gè)節(jié)點(diǎn)可以增加或者減少計(jì)數(shù)。雖然每個(gè)節(jié)點(diǎn)可以在本地維護(hù)一個(gè)自己的值,但這些本地計(jì)數(shù)卻不能通過(guò)簡(jiǎn)單的加減來(lái)合并。假設(shè)這樣一個(gè)例子:有三個(gè)節(jié)點(diǎn)A、B和C,每個(gè)節(jié)點(diǎn)執(zhí)行了一次加操作。如果A從B獲得一個(gè)值,并且加到本地副本上,然后C從B獲得值,然后C再?gòu)腁獲得值,那么C最后的值是4,而這是錯(cuò)誤的。解決這個(gè)問(wèn)題的方法是用一個(gè)類似于向量時(shí)鐘的數(shù)據(jù)結(jié)構(gòu)為每個(gè)節(jié)點(diǎn)維護(hù)一對(duì)計(jì)數(shù)器:

 class Counter {   int[] plus   int[] minus   int NODE_ID   increment() {     plus[NODE_ID]++   }  decrement() {    minus[NODE_ID]++  }  get() {    return sum(plus) 

主站蜘蛛池模板:
久久综合九色
|
国产毛片网
|
欧美a在线观看
|
欧美aaaaaaaa|
亚洲免费毛片基地
|
国产三级在线观看a
|
72pao成人国产永久免费视频
|
欧美一区二区三区久久精品视
|
一区二区三区国产在线
|
羞羞的网址
|
日韩一级片黄色
|
国产在线色
|
久久久婷婷一区二区三区不卡
|
精品视频一区二区三区四区
|
91a在线观看
|
精品一区二区电影
|
欧美成人久久
|
久久久鲁|
最新中文在线视频
|
成人mm视频在线观看
|
一级做a在线观看
|
久久精品国产99久久久古代
|
亚洲射逼
|
成人在线观看免费视频
|
最新中文在线视频
|
久久久亚洲欧美综合
|
最新av在线免费观看
|
国产一级一区
|
毛片哪里看
|
国产精品久久久久久久久久久久久久久久
|
久久国产亚洲精品
|
日韩精品久久久久久
|
国产亚洲精品久久久久久大师
|
精品久久久一二三区播放播放播放视频
|
在线播放黄色片
|
伊人网站
|
视屏一区|
国产精品视频在线观看免费
|
亚洲乱码精品久久久久
|
悠悠成人资源亚洲一区二区
|
久草视频中文
|