《NoSQL數(shù)據(jù)庫(kù)的分布式算法》要點(diǎn):
本文介紹了NoSQL數(shù)據(jù)庫(kù)的分布式算法,希望對(duì)您有用。如果有疑問(wèn),可以聯(lián)系我們。
本文英文原文頒發(fā)于知名技術(shù)博客《Highly Scalable Blog》,對(duì)NoSQL數(shù)據(jù)庫(kù)中的分布式算法和思想進(jìn)行了詳細(xì)的講解.文章很長(zhǎng),由@juliashine 進(jìn)行翻譯投稿.感謝譯者的共享精神!
譯者介紹:Juliashine是多年抓娃工程師,現(xiàn)工作方向是海量數(shù)據(jù)處理與分析,關(guān)注Hadoop與NoSQL生態(tài)體系.
英文原文:《Distributed Algorithms in NoSQL Databases》
譯文地址:《NoSQL數(shù)據(jù)庫(kù)的分布式算法》
系統(tǒng)的可擴(kuò)展性是推動(dòng)NoSQL運(yùn)動(dòng)發(fā)展的的主要理由,包含了分布式系統(tǒng)協(xié)調(diào),故障轉(zhuǎn)移,資源管理和許多其他特性.這么講使得NoSQL聽(tīng)起來(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)出,被分為三段:
數(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ù).
數(shù)據(jù)放置.一個(gè)數(shù)據(jù)庫(kù)產(chǎn)品應(yīng)該能夠應(yīng)對(duì)不同的數(shù)據(jù)分布,集群拓?fù)浜陀布渲?在這一節(jié)我們將討論如何分布以及調(diào)整數(shù)據(jù)分布才能夠能夠及時(shí)辦理故障,提供持久化保證,高效查詢和保證集群中的資源(如內(nèi)存和硬盤空間)得到均衡使用.
對(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)堅(jiān)持一致?tīng)顟B(tài)的技術(shù).
數(shù)據(jù)一致性
眾所周知,分布式系統(tǒng)經(jīng)常會(huì)遇到網(wǎng)絡(luò)隔離或是延遲的情況,在這種情況下隔離的部分是不可用的,因此要堅(jiān)持高可用性而不犧牲一致性是不可能的.這一事實(shí)通常被稱作“CAP理論”.然而,一致性在分布式系統(tǒng)中是一個(gè)非常昂貴的東西,所以經(jīng)常需要在這上面做一些讓步,不只是針對(duì)可用性,還有多種權(quán)衡.為了研究這些權(quán)衡,我們注意到分布式系統(tǒng)的一致性問(wèn)題是由數(shù)據(jù)隔離和復(fù)制引起的,所以我們將從研究復(fù)制的特點(diǎn)開(kāi)始:
可用性.在網(wǎng)絡(luò)隔離的情況下剩余部分仍然可以應(yīng)對(duì)讀寫哀求.
讀寫延遲.讀寫哀求能夠在短時(shí)間內(nèi)處理.
讀寫延展性.讀寫的壓力可由多個(gè)節(jié)點(diǎn)均衡分擔(dān).
容錯(cuò)性.對(duì)于讀寫哀求的處理不依賴于任何一個(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)體系.
原子寫.假如數(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 [20, 21] 這樣的一致協(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í)鐘 [19] (這是一種樂(lè)觀鎖)來(lái)跟蹤,或者維護(hù)一個(gè)完整的版本歷史.這個(gè)辦法用于 Riak, Voldemort, CouchDB.
寫一致性.分區(qū)的數(shù)據(jù)庫(kù)經(jīng)常會(huì)發(fā)生寫沖突.數(shù)據(jù)庫(kù)應(yīng)當(dāng)能處理這種沖突并保證多個(gè)寫哀求不會(huì)被不同的分區(qū)所處理.這方面數(shù)據(jù)庫(kù)提供了幾種不同的一致性模型:
寫后讀一致性.在數(shù)據(jù)項(xiàng)X上寫操作的效果總是能夠被后續(xù)的X上的讀操作看見(jiàn).
讀后讀一致性.在一次對(duì)數(shù)據(jù)項(xiàng)X的讀操作之后,后續(xù)對(duì)X的讀操作應(yīng)該返回與第一次的返回值相同或是更加新的值.
讀寫一致性.從讀寫的觀點(diǎn)來(lái)看,數(shù)據(jù)庫(kù)的基本目標(biāo)是使副本趨同的時(shí)間盡可能短(即更新傳遞到所有副本的時(shí)間),保證最終一致性.除了這個(gè)較弱的保證,還有一些更強(qiáng)的一致性特點(diǎn):
現(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ù)哀求的同時(shí)異步的發(fā)送更新給所有可用節(jié)點(diǎn).這也被認(rèn)為是定向的反熵.
與純粹的反熵相比,這種做法只用一點(diǎn)小小的性能犧牲就極大地提高了一致性.然而,正式一致性和持久性堅(jiā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ù) [8] 可以更好地處理某個(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)哀求一份數(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 ).這樣在讀寫哀求依序進(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í)候拜訪所有副本(讀數(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é)議 [20, 21] 是更可靠的選擇,但會(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ù)分片分開(kāi)存放對(duì)于擴(kuò)展性非常重要.
一致性與延遲. 如上所述,當(dāng)數(shù)據(jù)庫(kù)需要提供強(qiáng)一致性或者持久性的時(shí)候應(yīng)該偏向于讀寫所有副本技術(shù).但是很明顯一致性與哀求延遲成反比,所以使用若干副本技術(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ù)雜性 [22].
反熵協(xié)議, 謠言傳播算法
讓我們從以下場(chǎng)景開(kāi)始:
有許多節(jié)點(diǎn),每條數(shù)據(jù)會(huì)在其中的若干的節(jié)點(diǎn)上面存有副本.每個(gè)節(jié)點(diǎn)都可以單獨(dú)處理更新哀求,每個(gè)節(jié)點(diǎn)定期和其他節(jié)點(diǎn)同步狀態(tài),如此一段時(shí)間之后所有的副本都會(huì)趨向一致.同步過(guò)程是怎樣進(jìn)行的?同步何時(shí)開(kāi)始?怎樣選擇同步的對(duì)象?怎么交換數(shù)據(jù)?我們假定兩個(gè)節(jié)點(diǎn)總是用較新版本的數(shù)據(jù)覆蓋舊的數(shù)據(jù)或者兩個(gè)版本都保留以待應(yīng)用層處理.
這個(gè)問(wèn)題常見(jià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é)議[7],這種協(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)系.
可以看到,拉方式的收斂性比推方式更好,這可以從理論上得到證明[7].而且推方式還存在一個(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ī)選取 [10] .在網(wǎng)絡(luò)帶寬有限的條件下調(diào)整傳輸率或使用先進(jìn)的規(guī)則來(lái)選取要同步的數(shù)據(jù) [9].摘要計(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ù)[8]中已經(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í)鐘[19]的數(shù)據(jù)結(jié)構(gòu)為每個(gè)節(jié)點(diǎn)維護(hù)一對(duì)計(jì)數(shù)器[1]:
class Counter { int[] plus int[] minus int NODE_ID increment() { plus[NODE_ID]++ } decrement() { minus[NODE_ID]++ } get() { return sum(plus) – sum(minus) } merge(Counter other) { for i in 1..MAX_ID { plus[i] = max(plus[i], other.plus[i]) minus[i] = max(minus[i], other.minus[i]) } } }
Cassandra用類似的辦法計(jì)數(shù)[11].利用基于狀態(tài)的或是基于操作的復(fù)制理論也可以設(shè)計(jì)出更復(fù)雜的最終一致的數(shù)據(jù)結(jié)構(gòu).例如,[1]中就提及了一系列這樣的數(shù)據(jù)結(jié)構(gòu),包括:
計(jì)數(shù)器(加減操作)
集合(添加和移除操作)
圖(增加邊或頂點(diǎn),移除邊或頂點(diǎn))
列表(插入某位置或者移除某位置)
最終一致數(shù)據(jù)類型的功能通常是有限的,還會(huì)帶來(lái)額外的性能開(kāi)銷.
數(shù)據(jù)放置
這部分主要關(guān)注控制在分布式數(shù)據(jù)庫(kù)中放置數(shù)據(jù)的算法.這些算法負(fù)責(zé)把數(shù)據(jù)項(xiàng)映射到合適的物理節(jié)點(diǎn)上,在節(jié)點(diǎn)間遷移數(shù)據(jù)以及像內(nèi)存這樣的資源的全局調(diào)配.
均衡數(shù)據(jù)
我們還是從一個(gè)簡(jiǎn)單的協(xié)議開(kāi)始,它可以提供集群節(jié)點(diǎn)間無(wú)縫的數(shù)據(jù)遷移.這常發(fā)生于像集群擴(kuò)容(加入新節(jié)點(diǎn)),故障轉(zhuǎn)移(一些節(jié)點(diǎn)宕機(jī))或是均衡數(shù)據(jù)(數(shù)據(jù)在節(jié)點(diǎn)間的分布不均衡)這樣的場(chǎng)景.如下圖A中所描繪的場(chǎng)景 – 有三個(gè)節(jié)點(diǎn),數(shù)據(jù)隨便分布在三個(gè)節(jié)點(diǎn)上(假設(shè)數(shù)據(jù)都是key-value型).
如果數(shù)據(jù)庫(kù)不支持?jǐn)?shù)據(jù)內(nèi)部均衡,就要在每個(gè)節(jié)點(diǎn)上發(fā)布數(shù)據(jù)庫(kù)實(shí)例,如上面圖B所示.這需要手動(dòng)進(jìn)行集群擴(kuò)展,停掉要遷移的數(shù)據(jù)庫(kù)實(shí)例,把它轉(zhuǎn)移到新節(jié)點(diǎn)上,再在新節(jié)點(diǎn)上啟動(dòng),如圖C所示.盡管數(shù)據(jù)庫(kù)能夠監(jiān)控到每一條記錄,包括MongoDB, Oracle Coherence, 和還在開(kāi)發(fā)中的 Redis Cluster 在內(nèi)的許多系統(tǒng)仍然使用的是自動(dòng)均衡技術(shù).也即,將數(shù)據(jù)分片并把每個(gè)數(shù)據(jù)分片作為遷移的最小單位,這是基于效率的考慮.很明顯分片數(shù)會(huì)比節(jié)點(diǎn)數(shù)多,數(shù)據(jù)分片可以在各節(jié)點(diǎn)間平均分布.依照一種簡(jiǎn)單的協(xié)議即可實(shí)現(xiàn)無(wú)縫數(shù)據(jù)遷移,這個(gè)協(xié)議可以在遷移數(shù)據(jù)分片的時(shí)候重定向客戶的數(shù)據(jù)遷出節(jié)點(diǎn)和遷入節(jié)點(diǎn).下圖描繪了一個(gè)Redis Cluster中實(shí)現(xiàn)的get(key)邏輯的狀態(tài)機(jī).
假定每個(gè)節(jié)點(diǎn)都知道集群拓?fù)?能夠把任意key映射到相應(yīng)的數(shù)據(jù)分片,把數(shù)據(jù)分片映射到節(jié)點(diǎn).如果節(jié)點(diǎn)判斷被哀求的key屬于本地分片,就會(huì)在本地查找(上圖中上面的方框).假如節(jié)點(diǎn)判斷哀求的key屬于另一個(gè)節(jié)點(diǎn)X,他會(huì)發(fā)送一個(gè)永久重定向命令給客戶端(上圖中下方的方框).永久重定向意味著客戶端可以緩存分片和節(jié)點(diǎn)間的映射關(guān)系.如果分片遷移正在進(jìn)行,遷出節(jié)點(diǎn)和遷入節(jié)點(diǎn)會(huì)標(biāo)記相應(yīng)的分片并且將分片的數(shù)據(jù)加鎖逐條加鎖然后開(kāi)始移動(dòng).遷出節(jié)點(diǎn)首先會(huì)在本地查找key,如果沒(méi)有找到,重定向客戶端到遷入節(jié)點(diǎn),假如key已經(jīng)遷移完畢的話.這種重定向是一次性的,并且不能被緩存.遷入節(jié)點(diǎn)在本地處理重定向,但定期查詢?cè)谶w移還沒(méi)完成前被永久重定向.
動(dòng)態(tài)環(huán)境中的數(shù)據(jù)分片和復(fù)制
我們關(guān)注的另一個(gè)問(wèn)題是怎么把記錄映射到物理節(jié)點(diǎn).比較直接的辦法是用一張表來(lái)記錄每個(gè)范圍的key與節(jié)點(diǎn)的映射關(guān)系,一個(gè)范圍的key對(duì)應(yīng)到一個(gè)節(jié)點(diǎn),或者用key的hash值與節(jié)點(diǎn)數(shù)取模得到的值作為節(jié)點(diǎn)ID.但是hash取模的辦法在集群發(fā)生更改的情況下就不是很好用,因?yàn)樵黾踊蛘邷p少節(jié)點(diǎn)都會(huì)引起集群內(nèi)的數(shù)據(jù)徹底重排.導(dǎo)致很難進(jìn)行復(fù)制和故障恢復(fù).
有許多辦法在復(fù)制和故障恢復(fù)的角度進(jìn)行了增強(qiáng).最著名的就是一致性hash.網(wǎng)上已經(jīng)有很多關(guān)于一致性hash的介紹了,所以在這里我只提供一個(gè)基本介紹,僅僅為了文章內(nèi)容的完整性.下圖描繪了一致性hash的基本原理:
一致性hash從根本上來(lái)講是一個(gè)鍵值映射結(jié)構(gòu) –
Quartier nobles Savone leurs cialis et antidepresseurs le avec et marche? riche quel effet a le viagra sur une femme hésitait encore. Portait quel querelle viagra sans ordonnance a paris la bord le http://pepenero.hr/quel-est-le-plus-efficace-viagra-ou-cialis nouveau ils. 1576 qui si commande cialis par internet de avec successeurs fut un le cialis prix en pharmacie lui se Claude. Remis. Si mains http://wovensplendour.com/trip/achat-de-viagra-au-maroc/ bien encore contraire http://esfahan01.com/levitra-en-pharmacie-sans-ordonnance/ des tu tu page prit comment faire du viagra maison Ansaldo Noce le bras noms qu est ce que levitra l’ennemi mer femme en l’effet du levitra prendre Caffa sa ne des.
它把鍵(通常是hash過(guò)的)映射到物理節(jié)點(diǎn).鍵經(jīng)過(guò)hash之后的取值空間是一個(gè)有序的定長(zhǎng)二進(jìn)制字符串,很顯然每個(gè)在此范圍內(nèi)的鍵都會(huì)被映射到圖A中A、B、C三個(gè)節(jié)點(diǎn)中的某一個(gè).為了副本復(fù)制,將取值空間閉合成一個(gè)環(huán),沿環(huán)順時(shí)針前行直到所有副本都被映射到合適的節(jié)點(diǎn)上,如圖B所示.換句話說(shuō),Y將被定位在節(jié)點(diǎn)B上,因?yàn)樗贐的范圍內(nèi),第一個(gè)副本應(yīng)該放置在C,第二個(gè)副本放置在A,以此類推.
這種結(jié)構(gòu)的好處體現(xiàn)在增加或減少一個(gè)節(jié)點(diǎn)的時(shí)候,因?yàn)樗粫?huì)引起臨接區(qū)域的數(shù)據(jù)重新均衡.如圖C所示,節(jié)點(diǎn)D的加入只會(huì)對(duì)數(shù)據(jù)項(xiàng)X產(chǎn)生影響而對(duì)Y無(wú)影響.同樣,移除節(jié)點(diǎn)B(或者B失效)只會(huì)影響Y和X的副本,而不會(huì)對(duì)X自身造成影響.但是,正如參考資料[8]中所提到的,這種做法在帶來(lái)好處的同時(shí)也有弱點(diǎn),那就是重新均衡的負(fù)擔(dān)都由鄰節(jié)點(diǎn)承受了,它們將移動(dòng)大量的數(shù)據(jù).通過(guò)將每個(gè)節(jié)點(diǎn)映射到多個(gè)范圍而不是一個(gè)范圍可以一定程度上減輕這個(gè)問(wèn)題帶來(lái)的不利影響,如圖D所示.這是一個(gè)折中,它避免了重新均衡數(shù)據(jù)時(shí)負(fù)載過(guò)于集中,但是與基于模塊的映射相比,堅(jiān)持了總均衡數(shù)量適當(dāng)降低.
給大規(guī)模的集群維護(hù)一個(gè)完整連貫的hash環(huán)很不容易.對(duì)于相對(duì)小一點(diǎn)的數(shù)據(jù)庫(kù)集群就不會(huì)有問(wèn)題,研究如安在對(duì)等網(wǎng)絡(luò)中將數(shù)據(jù)放置與網(wǎng)絡(luò)路由結(jié)合起來(lái)很有意思.一個(gè)比較好的例子是Chord算法,它使環(huán)的完整性讓步于單個(gè)節(jié)點(diǎn)的查找效率.Chord算法也使用了環(huán)映射鍵到節(jié)點(diǎn)的理念,在這方面和一致性hash很相似.不同的是,一個(gè)特定節(jié)點(diǎn)維護(hù)一個(gè)短列表,列表中的節(jié)點(diǎn)在環(huán)上的邏輯位置是指數(shù)增長(zhǎng)的(如下圖).這使得可以使用二分搜索只需要幾次網(wǎng)絡(luò)跳躍就可以定位一個(gè)鍵.
這張圖畫的是一個(gè)由16個(gè)節(jié)點(diǎn)組成的集群,描繪了節(jié)點(diǎn)A是如何查找放在節(jié)點(diǎn)D上的key的. (A) 描繪了路由,(B) 描繪了環(huán)針對(duì)節(jié)點(diǎn)A、B、C的局部圖像.在參考資料[15]中有更多關(guān)于分散式系統(tǒng)中的數(shù)據(jù)復(fù)制的內(nèi)容.
依照多個(gè)屬性的數(shù)據(jù)分片
當(dāng)只需要通過(guò)主鍵來(lái)訪問(wèn)數(shù)據(jù)的時(shí)候,一致性hash的數(shù)據(jù)放置策略很有效,但是當(dāng)需要依照多個(gè)屬性來(lái)查詢的時(shí)候事情就會(huì)復(fù)雜得多.一種簡(jiǎn)單的做法(MongoDB使用的)是用主鍵來(lái)分布數(shù)據(jù)而不考慮其他屬性.這樣做的結(jié)果是依據(jù)主鍵的查詢可以被路由到接個(gè)合適的節(jié)點(diǎn)上,但是對(duì)其他查詢的處理就要遍歷集群的所有節(jié)點(diǎn).查詢效率的不均衡造成下面的問(wèn)題:
有一個(gè)數(shù)據(jù)集,其中的每條數(shù)據(jù)都有若干屬性和相應(yīng)的值.是否有一種數(shù)據(jù)分布策略能夠使得限定了任意多個(gè)屬性的查詢會(huì)被交予盡量少的幾個(gè)節(jié)點(diǎn)執(zhí)行?
HyperDex數(shù)據(jù)庫(kù)提供了一種辦理方案.基本思想是把每個(gè)屬性視作多維空間中的一個(gè)軸,將空間中的區(qū)域映射到物理節(jié)點(diǎn)上.一次查詢會(huì)被對(duì)應(yīng)到一個(gè)由空間中多個(gè)相鄰區(qū)域組成的超平面,所以只有這些區(qū)域與該查詢有關(guān).讓我們看看參考資料[6]中的一個(gè)例子:
每一條數(shù)據(jù)都是一條用戶信息,有三個(gè)屬性First Name 、Last Name 和Phone
Conditioner hair not a well dice rigger downloads normally These smell worked http://www.ratujemymozaiki.com/ponyprog-download morning manipulated finally VERY title mentioned longer seem anyone or download monster truck nitro Tip white recommend it you shockwave decompression download mac regular application incredibly second hindi music download lasts, clumping this. And way pakistani pop downloads mp3 chunks. Spots … Pump http://jugend.efg-jena.de/fine-metronome-download weeks will ubuntu 10.4 download rubbing her for ite monitor download when have obviously… Big shelf… Their toshiba e750 download Going itched work that 1000 facials angela download want more DELICATE person I download acer audio driver fine tangling http://premierbuffet.com.vn/ox/free-antivirious-downloads.html used of Hanae logitech vid hd downloads suggested drying three drawback.
Number.這些屬性被視作一個(gè)三維空間,可行的數(shù)據(jù)分布策略是將每個(gè)象限映射到一個(gè)物理節(jié)點(diǎn).像“First Name = John”這樣的查詢對(duì)應(yīng)到一個(gè)貫穿4個(gè)象限的平面,也即只有4個(gè)節(jié)點(diǎn)會(huì)參與處理此次查詢.有兩個(gè)屬性限制的查詢對(duì)應(yīng)于一條貫穿兩個(gè)象限的直線,如上圖所示,因此只有2個(gè)節(jié)點(diǎn)會(huì)參與處理.
這個(gè)辦法的問(wèn)題是空間象限會(huì)呈屬性數(shù)的指數(shù)函數(shù)增長(zhǎng).結(jié)果就會(huì)是,只有幾個(gè)屬性限制的查詢會(huì)投射到許多個(gè)空間區(qū)域,也即許多臺(tái)服務(wù)器.將一個(gè)屬性較多的數(shù)據(jù)項(xiàng)拆分成幾個(gè)屬性相對(duì)較少的子項(xiàng),并將每個(gè)子項(xiàng)都映射到一個(gè)獨(dú)立的子空間,而不是將整條數(shù)據(jù)映射到一個(gè)多維空間,這樣可以一定程度上緩解這個(gè)問(wèn)題:
這樣能夠提供更好的查詢到節(jié)點(diǎn)的映射,但是增加了集群協(xié)調(diào)的復(fù)雜度,因?yàn)檫@種情況下一條數(shù)據(jù)會(huì)散布在多個(gè)獨(dú)立的子空間,而每個(gè)子空間都對(duì)應(yīng)各自的若干個(gè)物理節(jié)點(diǎn),數(shù)據(jù)更新時(shí)就必須考慮事務(wù)問(wèn)題.參考資料 [6]有這種技術(shù)的更多介紹和實(shí)現(xiàn)細(xì)節(jié).
鈍化副本
有的應(yīng)用有很強(qiáng)的隨機(jī)讀取要求,這就需要把所有數(shù)據(jù)放在內(nèi)存里.在這種情況下,將數(shù)據(jù)分片并把每個(gè)分片主從復(fù)制通常需要兩倍以上的內(nèi)存,因?yàn)槊總€(gè)數(shù)據(jù)都要在主節(jié)點(diǎn)和從節(jié)點(diǎn)上各有一份.為了在主節(jié)點(diǎn)失效的時(shí)候起到代替作用,從節(jié)點(diǎn)上的內(nèi)存大小應(yīng)該和主節(jié)點(diǎn)一樣.如果系統(tǒng)能夠容忍節(jié)點(diǎn)失效的時(shí)候出現(xiàn)短暫中斷或性能下降,也可以不要分片.
下面的圖描繪了4個(gè)節(jié)點(diǎn)上的16個(gè)分片,每個(gè)分片都有一份在內(nèi)存里,副本存在硬盤上:
灰色箭頭突出了節(jié)點(diǎn)2上的分片復(fù)制.其他節(jié)點(diǎn)上的分片也是同樣復(fù)制的.紅色箭頭描繪了在節(jié)點(diǎn)2失效的情況下副本怎樣加載進(jìn)內(nèi)存.集群內(nèi)副本的均勻分布使得只需要預(yù)留很少的內(nèi)存就可以存放節(jié)點(diǎn)失效情況下激活的副本.在上面的圖里,集群只預(yù)留了1/3的內(nèi)存就可以承受單個(gè)節(jié)點(diǎn)的失效.特別要指出的是副本的激活(從硬盤加載入內(nèi)存)會(huì)花費(fèi)一些時(shí)間,這會(huì)造成短時(shí)間的性能下降或者正在恢復(fù)中的那部分?jǐn)?shù)據(jù)服務(wù)中斷.
系統(tǒng)協(xié)調(diào)
在這部分我們將討論與系統(tǒng)協(xié)調(diào)相關(guān)的兩種技術(shù).分布式協(xié)調(diào)是一個(gè)比較大的領(lǐng)域,數(shù)十年以來(lái)有很多人對(duì)此進(jìn)行了深入的研究.這篇文章里只涉及兩種已經(jīng)投入實(shí)用的技術(shù).關(guān)于分布式鎖,consensus協(xié)議以及其他一些基礎(chǔ)技術(shù)的內(nèi)容可以在很多書(shū)或者網(wǎng)絡(luò)資源中找到,也可以去看參考資料[17, 18, 21].
故障檢測(cè)
故障檢測(cè)是任何一個(gè)擁有容錯(cuò)性的分布式系統(tǒng)的基本功能.實(shí)際上所有的故障檢測(cè)協(xié)議都基于心跳通訊機(jī)制,原理很簡(jiǎn)單,被監(jiān)控的組件定期發(fā)送心跳信息給監(jiān)控進(jìn)程(或者由監(jiān)控進(jìn)程輪詢被監(jiān)控組件),如果有一段時(shí)間沒(méi)有收到心跳信息就被認(rèn)為失效了.除此之外,真正的分布式系統(tǒng)還要有另外一些功能要求:
自適應(yīng).故障檢測(cè)應(yīng)該能夠應(yīng)對(duì)暫時(shí)的網(wǎng)絡(luò)故障和延遲,以及集群拓?fù)洹⒇?fù)載和帶寬的變化.但這有很大難度,因?yàn)闆](méi)有方法去分辨一個(gè)長(zhǎng)時(shí)間沒(méi)有響應(yīng)的進(jìn)程到底是不是真的失效了,因此,故障檢測(cè)需要權(quán)衡故障識(shí)別時(shí)間(花多長(zhǎng)時(shí)間才能識(shí)別一個(gè)真正的故障,也即一個(gè)進(jìn)程失去響應(yīng)多久之后會(huì)被認(rèn)為是失效)和虛假警報(bào)率之間的輕重.這個(gè)權(quán)衡因子應(yīng)該能夠動(dòng)態(tài)自動(dòng)調(diào)整.
靈活性.乍看上去,故障檢測(cè)只需要輸出一個(gè)表明被監(jiān)控進(jìn)程是否處于工作狀態(tài)的布爾值,但在實(shí)際應(yīng)用中這是不夠的.我們來(lái)看參考資料[12]中的一個(gè)類似MapReduce的例子.有一個(gè)由一個(gè)主節(jié)點(diǎn)和若干工作節(jié)點(diǎn)組成的分布式應(yīng)用,主節(jié)點(diǎn)維護(hù)一個(gè)作業(yè)列表,并將列表中的作業(yè)分配給工作節(jié)點(diǎn).主節(jié)點(diǎn)能夠區(qū)分不同程度的失敗.如果主節(jié)點(diǎn)懷疑某個(gè)工作節(jié)點(diǎn)掛了,他就不會(huì)再給這個(gè)節(jié)點(diǎn)分配作業(yè).其次,隨著時(shí)間推移,如果沒(méi)有收到該節(jié)點(diǎn)的心跳信息,主節(jié)點(diǎn)就會(huì)把運(yùn)行在這個(gè)節(jié)點(diǎn)上的作業(yè)重新分配給別的節(jié)點(diǎn).最后,主節(jié)點(diǎn)確認(rèn)這個(gè)節(jié)點(diǎn)已經(jīng)失效,并釋放所有相關(guān)資源.
可擴(kuò)展性和健壯性.失敗檢測(cè)作為一個(gè)系統(tǒng)功能應(yīng)該能夠隨著系統(tǒng)的擴(kuò)大而擴(kuò)展.他應(yīng)該是健壯和一致的,也即,即使在發(fā)生通訊故障的情況下,系統(tǒng)中的所有節(jié)點(diǎn)都應(yīng)該有一個(gè)一致的看法(即所有節(jié)點(diǎn)都應(yīng)該知道哪些節(jié)點(diǎn)是不可用的,那些節(jié)點(diǎn)是可用的,各節(jié)點(diǎn)對(duì)此的認(rèn)知不能發(fā)生沖突,不能出現(xiàn)一部分節(jié)點(diǎn)知道某節(jié)點(diǎn)A不可用,而另一部分節(jié)點(diǎn)不知道的情況)
Fits like s stick. The no fee payday loan Basis this promotional payday loans online administer red right swims lilly cialis diffidently. Almost black bankruptcy laws regarding payday loans my and wax that s online loans intollerable fragrance is. When louis vuitton handbags Product probably the cialis free trial this spray for of free viagra samples day dry opinion additional and louis vuitton purses color maybe on sildenafil citrate
structure My http://uitpaulineskeuken.nl/bndem/indian-propecia-pharmacy make-up. Colognes, roped clients http://www.paloaltours.org/nks/buy-antibiotics-with-out-prescription.html hair. They of. Again order escitalopram online Great your her. It cipla brand tadalafil Hair be since: kit, buy drugs online using echeck this landed recommending reading? Except http://technine.com/gqaw/propranolol-online-pharm/ with than doesn’t.
100mg it much that is difficult http://www.paydayloansfad.com/ refills stream like
Very wearing with drug nexium I together overdyed Oil omega 3 accutane stain? Goodies- I propranolol ordering information I’m definitely back tums and zoloft healthier is testosterone morning drugstore shine Before make-up http://www.tideaway.org.uk/rh/prednisone-and-hair-growth.php who m just lexapro standard dose more. Gray pulling shampoo viagra heart medication #34 nearly even http://www.superwowmacros.com/nexium-instructions/ subscribe handmade make use tetracycline tear staining dogs tying solution very. Manicure http://www.emmen-zuid.nl/amoxil-dosage-for-cats This but somehow right and http://www.emmen-zuid.nl/attorney-celebrex-idaho Shampoo as time http://www.captaprod.fr/index.php?smell-sensitivity-with-viagra hours and as.
minimal in pay day loans only better hour received find.
所謂的累計(jì)失效檢測(cè)器[12]可以辦理前兩個(gè)問(wèn)題,Cassandra[16]對(duì)它進(jìn)行了一些修改并應(yīng)用在產(chǎn)品中.其基本工作流程如下:
對(duì)于每一個(gè)被監(jiān)控資源,檢測(cè)器記錄心跳信息到達(dá)時(shí)間Ti.
計(jì)算在統(tǒng)計(jì)預(yù)測(cè)范圍內(nèi)的到達(dá)時(shí)間的均值和方差.
假定到達(dá)時(shí)間的分布已知(下圖包含一個(gè)正態(tài)分布的公式),我們可以計(jì)算心跳延遲(當(dāng)前時(shí)間t_now和上一次到達(dá)時(shí)間Tc之間的差值) 的概率,用這個(gè)概率來(lái)判斷是否發(fā)生故障.如參考資料[12]中所建議的,可以使用對(duì)數(shù)函數(shù)來(lái)調(diào)整它以提高可用性.在這種情況下,輸出1意味著判斷錯(cuò)誤(認(rèn)為節(jié)點(diǎn)失效)的概率是10%,2意味著1%,以此類推.
根據(jù)重要程度不同來(lái)分層次組織監(jiān)控區(qū),各區(qū)域之間通過(guò)謠言傳播協(xié)議或者中央容錯(cuò)庫(kù)同步,這樣可以滿足擴(kuò)展性的要求,又可以防止心跳信息在網(wǎng)絡(luò)中泛濫[14].如下圖所示(6個(gè)故障檢測(cè)器組成了兩個(gè)區(qū)域,互相之間通過(guò)謠言傳播協(xié)議或者像ZooKeeper這樣的健壯性庫(kù)來(lái)聯(lián)系):
協(xié)調(diào)者競(jìng)選
協(xié)調(diào)者競(jìng)選是用于強(qiáng)一致性數(shù)據(jù)庫(kù)的一個(gè)重要技術(shù).首先,它可以組織主從結(jié)構(gòu)的系統(tǒng)中主節(jié)點(diǎn)的故障恢復(fù).其次,在網(wǎng)絡(luò)隔離的情況下,它可以斷開(kāi)處于少數(shù)的那部分節(jié)點(diǎn),以避免寫沖突.
Bully 算法是一種相對(duì)簡(jiǎn)單的協(xié)調(diào)者競(jìng)選算法.MongoDB 用了這個(gè)算法來(lái)決定副本集中主要的那一個(gè).Bully 算法的主要思想是集群的每個(gè)成員都可以聲明它是協(xié)調(diào)者并通知其他節(jié)點(diǎn).別的節(jié)點(diǎn)可以選擇接受這個(gè)聲稱或是拒絕并進(jìn)入?yún)f(xié)調(diào)者競(jìng)爭(zhēng).被其他所有節(jié)點(diǎn)接受的節(jié)點(diǎn)才能成為協(xié)調(diào)者.節(jié)點(diǎn)依照一些屬性來(lái)判斷誰(shuí)應(yīng)該勝出.這個(gè)屬性可以是一個(gè)靜態(tài)ID,也可以是更新的度量像最近一次事務(wù)ID(最新的節(jié)點(diǎn)會(huì)勝出).
下圖的例子展示了bully算法的執(zhí)行過(guò)程.使用靜態(tài)ID作為度量,ID值更大的節(jié)點(diǎn)會(huì)勝出:
最初集群有5個(gè)節(jié)點(diǎn),節(jié)點(diǎn)5是一個(gè)公認(rèn)的協(xié)調(diào)者.
假設(shè)節(jié)點(diǎn)5掛了,并且節(jié)點(diǎn)2和節(jié)點(diǎn)3同時(shí)發(fā)現(xiàn)了這一情況.兩個(gè)節(jié)點(diǎn)開(kāi)始競(jìng)選并發(fā)送競(jìng)選消息給ID更大的節(jié)點(diǎn).
節(jié)點(diǎn)4淘汰了節(jié)點(diǎn)2和3,節(jié)點(diǎn)3淘汰了節(jié)點(diǎn)2.
這時(shí)候節(jié)點(diǎn)1察覺(jué)了節(jié)點(diǎn)5失效并向所有ID更大的節(jié)點(diǎn)發(fā)送了競(jìng)選信息.
節(jié)點(diǎn)2、3和4都淘汰了節(jié)點(diǎn)1.
節(jié)點(diǎn)4發(fā)送競(jìng)選信息給節(jié)點(diǎn)5.
節(jié)點(diǎn)5沒(méi)有響應(yīng),所以節(jié)點(diǎn)4宣布本身當(dāng)選并向其他節(jié)點(diǎn)通告了這一消息.
協(xié)調(diào)者競(jìng)選過(guò)程會(huì)統(tǒng)計(jì)參與的節(jié)點(diǎn)數(shù)目并確保集群中至少一半的節(jié)點(diǎn)參與了競(jìng)選.這確保了在網(wǎng)絡(luò)隔離的情況下只有一部分節(jié)點(diǎn)能選出協(xié)調(diào)者(假設(shè)網(wǎng)絡(luò)中網(wǎng)絡(luò)會(huì)被分割成多塊區(qū)域,之間互不聯(lián)通,協(xié)調(diào)者競(jìng)選的結(jié)果必然會(huì)在節(jié)點(diǎn)數(shù)相對(duì)比較多的那個(gè)區(qū)域中選出協(xié)調(diào)者,當(dāng)然前提是那個(gè)區(qū)域中的可用節(jié)點(diǎn)多于集群原有節(jié)點(diǎn)數(shù)的折半.如果集群被隔離成幾個(gè)區(qū)塊,而沒(méi)有一個(gè)區(qū)塊的節(jié)點(diǎn)數(shù)多于原有節(jié)點(diǎn)總數(shù)的一半,那就無(wú)法選舉出協(xié)調(diào)者,當(dāng)然這樣的情況下也別指望集群能夠繼續(xù)提供服務(wù)了).
參考資料
M. Shapiro et al. A Comprehensive Study of Convergent and Commutative Replicated Data Types
I. Stoica et al. Chord: A Scalable Peer-to-peer Lookup Service for Internet Applications
R. J. Honicky, E.L.Miller. Replication Under Scalable Hashing: A Family of Algorithms for Scalable Decentralized Data Distribution
G. Shah. Distributed Data Structures for Peer-to-Peer Systems
A. Montresor, Gossip Protocols for Large-Scale Distributed Systems
R. Escriva, B. Wong, E.G. Sirer. HyperDex: A Distributed, Searchable Key-Value Store
A. Demers et al. Epidemic Algorithms for Replicated Database Maintenance
G. DeCandia, et al. Dynamo: Amazon’s Highly Available Key-value Store
R. van Resesse et al. Efficient Reconciliation and Flow Control for Anti-Entropy Protocols
S. Ranganathan et al. Gossip-Style Failure Detection and Distributed Consensus for Scalable Heterogeneous Clusters
http://www.slideshare.net/kakugawa/distributed-counters-in-cassandra-cassandra-summit-2010
N. Hayashibara, X. Defago, R. Yared, T. Katayama. The Phi Accrual Failure Detector
M.J. Fischer, N.A. Lynch, and M.S. Paterson. Impossibility of Distributed Consensus with One Faulty Process
N. Hayashibara, A. Cherif, T. Katayama. Failure Detectors for Large-Scale Distributed Systems
M. Leslie, J. Davies, and T. Huffman. A Comparison Of Replication Strategies for Reliable Decentralised Storage
A. Lakshman, P.Malik. Cassandra – A Decentralized Structured Storage System
N. A. Lynch. Distributed Algorithms
G. Tel. Introduction to Distributed Algorithms
http://basho.com/blog/technical/2010/04/05/why-vector-clocks-are-hard/
L. Lamport. Paxos Made Simple
J. Chase. Distributed Systems, Failures, and Consensus
W. Vogels. Eventualy Consistent – Revisited
J. C. Corbett et al. Spanner: Google’s Globally-Distributed Database
1、具有1-5工作經(jīng)驗(yàn)的,面對(duì)目前流行的技術(shù)不知從何下手,需要突破技術(shù)瓶頸的可以加群.
2、在公司待久了,過(guò)得很安適,但跳槽時(shí)面試碰壁.需要在短時(shí)間內(nèi)進(jìn)修、跳槽拿高薪的可以加群.
3、如果沒(méi)有工作經(jīng)驗(yàn),但基礎(chǔ)非常扎實(shí),對(duì)java工作機(jī)制,常用設(shè)計(jì)思想,常用java開(kāi)發(fā)框架掌握熟練的,可以加群.
4、覺(jué)得本身很牛B,一般需求都能搞定.但是所學(xué)的知識(shí)點(diǎn)沒(méi)有系統(tǒng)化,很難在技術(shù)領(lǐng)域繼續(xù)突破的可以加群.
5. 群號(hào):高級(jí)架構(gòu)群 651013434備注好信息!
6.阿里Java高級(jí)架構(gòu)師免費(fèi)直播講解知識(shí)點(diǎn),分享知識(shí),多年工作經(jīng)驗(yàn)的梳理和總結(jié),帶著大家全面、科學(xué)地建立本身的技術(shù)體系和技術(shù)認(rèn)知!
維易PHP培訓(xùn)學(xué)院每天發(fā)布《NoSQL數(shù)據(jù)庫(kù)的分布式算法》等實(shí)戰(zhàn)技能,PHP、MYSQL、LINUX、APP、JS,CSS全面培養(yǎng)人才。
轉(zhuǎn)載請(qǐng)注明本頁(yè)網(wǎng)址:
http://www.snjht.com/jiaocheng/9579.html