本文主要介紹分布式數(shù)據(jù)庫sql(分布式數(shù)據(jù)庫sqlserver),下面一起看看分布式數(shù)據(jù)庫sql(分布式數(shù)據(jù)庫sqlserver)相關(guān)資訊。
盡管nosql運(yùn)動沒有給分布式數(shù)據(jù)處理帶來根本性的技術(shù)變革,但它也導(dǎo)致了對各種協(xié)議和算法的鋪天蓋地的研究和實(shí)踐。在本文中,我將對nosql數(shù)據(jù)庫的分布式特征進(jìn)行系統(tǒng)的描述。系統(tǒng)的可擴(kuò)展性是推動nosql運(yùn)動發(fā)展的主要原因,包括分布式系統(tǒng)的協(xié)調(diào)、故障轉(zhuǎn)移、資源管理等諸多特性。這讓nosql聽起來像一個大籃子,一切都可以留在nosql運(yùn)動。雖然分布式數(shù)據(jù)處理并沒有帶來根本性的技術(shù)變革,但它仍然會導(dǎo)致對各種協(xié)議和算法的絕大多數(shù)研究和實(shí)踐。正是通過這些努力,逐漸總結(jié)出了一些行之有效的數(shù)據(jù)庫建設(shè)方法。在本文中,我將對nosql數(shù)據(jù)庫的分布式特征進(jìn)行系統(tǒng)的描述。接下來,我們將研究一些分布式策略,如故障檢測中的復(fù)制。這些策略用粗體字標(biāo)出,分為三段:1。數(shù)據(jù)一致性. nosql需要分布式系統(tǒng)的一致性、容錯性和性能、低延遲和高可用性的平衡。一般來說,數(shù)據(jù)一致性是一個必要的選項(xiàng),所以這一節(jié)主要是關(guān)于數(shù)據(jù)復(fù)制和數(shù)據(jù)恢復(fù)。2。數(shù)據(jù)放置。數(shù)據(jù)庫產(chǎn)品應(yīng)該能夠應(yīng)對不同的數(shù)據(jù)分布、集群拓?fù)浜陀布渲?。在本?jié)中,我們將討論如何分配和調(diào)整數(shù)據(jù)的分布,為及時解決問題提供持續(xù)的保證,有效的查詢和保證集群中資源的均衡使用,如內(nèi)存和硬盤空間。3.對等系統(tǒng)。很多數(shù)據(jù)庫產(chǎn)品都采用了leader election等技術(shù)來實(shí)現(xiàn)強(qiáng)容錯和數(shù)據(jù)一致性。然而,即使分布式數(shù)據(jù)庫(沒有中心)應(yīng)該遵循它們的全局狀態(tài),并檢測故障和拓?fù)渥兓竟?jié)也將介紹幾種技術(shù)來保持系統(tǒng)的一致性。數(shù)據(jù)一致性眾所周知,分布式系統(tǒng)經(jīng)常會遇到網(wǎng)絡(luò)隔離或延遲。在這種情況下,隔離部分不可用。因此,在不犧牲一致性的情況下保持高可用性是不可能的。這一事實(shí)通常被稱為上限理論。但是,一致性在分布式系統(tǒng)中是一件非常昂貴的事情,所以我們經(jīng)常需要做出一些讓步,不僅是為了可用性,也是為了各種權(quán)衡,為了研究這些權(quán)衡,我們注意到分布式系統(tǒng)的一致性問題是由數(shù)據(jù)隔離和復(fù)制引起的,所以我們將從復(fù)制的特性入手??捎眯評3002in在網(wǎng)絡(luò)隔離的情況下,其余的仍然可以響應(yīng)讀寫請求。讀寫延遲,讀寫請求可以短時間處理。閱讀和寫作的可塑性。讀寫壓力可以通過多個節(jié)點(diǎn)來平衡。容錯。讀寫請求的處理不依賴于任何特定的節(jié)點(diǎn)。數(shù)據(jù)持久性:特定條件下的節(jié)點(diǎn)故障不會導(dǎo)致數(shù)據(jù)丟失。統(tǒng)一u3002c協(xié)調(diào)的作用比以前復(fù)雜得多,所以我們需要詳細(xì)討論一些不同的觀點(diǎn)。但是我們贏了。;不涵蓋許多一致性和并發(fā)模型,因?yàn)檫@超出了本文的范圍。我只能用一些簡單的功能組成一個精簡的系統(tǒng)。從讀寫的角度來看,數(shù)據(jù)庫的基本目標(biāo)是使副本的收斂時間盡可能短,即向所有副本交付更新以保證最終一致性的時間。除了這種弱保證,還有一個更強(qiáng)的一致性特性:寫后寫一致性。在數(shù)據(jù)項(xiàng)x上寫的效果,在后續(xù)對x的讀操作中總能看到,讀后讀一致性。在讀取數(shù)據(jù)項(xiàng)x之后,x的后續(xù)讀取操作應(yīng)該返回與第一個返回值相同或更新的值。寫一致性。分區(qū)數(shù)據(jù)庫中經(jīng)常發(fā)生寫。數(shù)據(jù)庫應(yīng)該能夠處理這種,并確保不同的分區(qū)不會處理多個寫請求:原子被寫入。如果數(shù)據(jù)庫提供api,寫操作只能是單個原子賦值。避免的方法是找出每個數(shù)據(jù)的最新版本,這使得所有節(jié)點(diǎn)在更新結(jié)束時獲得相同的版本,但與更新后的順序無關(guān)。由網(wǎng)絡(luò)故障和延遲引起的節(jié)點(diǎn)的不同順序更新。數(shù)據(jù)的版本可以由用戶指定的代表通過時間戳或值來表示。這是卡桑德拉使用它的。原子化讀寫應(yīng)用的變化。有時需要讀-修改-寫順序操作,而不是單個原子寫操作。如果兩個客戶端讀取相同版本的數(shù)據(jù),并且修改后的數(shù)據(jù)被修改并寫回其中,則根據(jù)原子寫入模式,更新時間將覆蓋前一時間。在某些情況下,這種行為是不正確的(例如,兩個客戶端使用相同的新值添加一個列表值)。該數(shù)據(jù)庫至少提供了兩種解決辦法:預(yù)防。讀-修改-寫可以認(rèn)為是一個特例,所以分布式鎖,或者與paxos一致的協(xié)議可以解決這個問題。這項(xiàng)技術(shù)支持原子讀取重寫語義和任意隔離級別的事務(wù)。另一種方法是避免分布式并發(fā)寫操作,寫一個特定數(shù)據(jù)項(xiàng)的節(jié)點(diǎn)(可以是全局主節(jié)點(diǎn),也可以是分區(qū)主節(jié)點(diǎn))。為了避免,數(shù)據(jù)庫必須犧牲網(wǎng)絡(luò)隔離的可用性。這種方法常用于許多系統(tǒng)中,以提供強(qiáng)一致性保證(例如,大多數(shù)關(guān)系數(shù)據(jù)庫、hbase、mondb)。檢測、數(shù)據(jù)庫跟蹤、并發(fā)更新和回滾的一個或兩個版本由客戶保留。并發(fā)更新通常與向量時鐘跟蹤(這是一種樂觀鎖定)或完整版本的版本歷史保持相關(guān)聯(lián)。采用這種方法的危險,伏地魔couchdb?,F(xiàn)在讓我們 讓我們仔細(xì)看看常用的復(fù)制技術(shù)和分類,并根據(jù)它們的特點(diǎn)來描述它們。第一張圖描述了不同的技術(shù)以及不同技術(shù)之間的權(quán)衡。協(xié)調(diào)系統(tǒng)的一致性、可擴(kuò)展性、可用性和延遲之間的邏輯關(guān)系。附圖詳細(xì)描述了每項(xiàng)技術(shù)。復(fù)合因子為4,讀/寫協(xié)調(diào)。服務(wù)器可以是外部客戶端或內(nèi)部代理節(jié)點(diǎn)。根據(jù)各方共識,我們將采用由弱到強(qiáng)的技術(shù):在策略上,(a,反熵)一致性最弱,寫的時候會選擇任意一個節(jié)點(diǎn)更新。讀取時,如果新數(shù)據(jù)沒有傳輸?shù)焦?jié)點(diǎn)并通過后臺反熵協(xié)議讀取,那么仍然讀取舊數(shù)據(jù)(反熵協(xié)議將在下一節(jié)詳細(xì)介紹):過大的傳播延遲使得使用的數(shù)據(jù)很難同步,所以典型的用法是檢測和維護(hù)的計劃輔助功能。cassandra使用一種反熵算法來調(diào)用數(shù)據(jù)庫的拓?fù)浣Y(jié)構(gòu)和各個節(jié)點(diǎn)之間的一些其他元數(shù)據(jù)信息。一致性保證弱:即使沒有失敗,也會出現(xiàn)寫和讀寫差異。網(wǎng)絡(luò)隔離下的高可用性和健壯性,異步批處理逐一替代,性能優(yōu)異。持久性很弱,因?yàn)樾聰?shù)據(jù)起初只是一個副本。(b)上述模式的一個改進(jìn)是異步向所有可用節(jié)點(diǎn)發(fā)送更新,同時任意節(jié)點(diǎn)接收到一個更新數(shù)據(jù)請求,也視為方向反熵。與簡單的反熵相比,該方法大大提高了一致性,只犧牲了一點(diǎn)點(diǎn)性能,但形式一致性和持久性保持不變。如果由于網(wǎng)絡(luò)故障或節(jié)點(diǎn)故障而無法獲得某些節(jié)點(diǎn),更新將最終通過反熵傳播過程傳遞到該節(jié)點(diǎn)。(c)在以前的模式中,使用快速轉(zhuǎn)移技術(shù)可以更好地處理一個節(jié)點(diǎn)的操作失敗,無效節(jié)點(diǎn)的更新被記錄在一個附加的代理節(jié)點(diǎn)中,表明一旦更新被傳遞到該節(jié)點(diǎn),該特征節(jié)點(diǎn)是可用的。這提高了一致性并減少了復(fù)制時間。(d),讀寫一次,因?yàn)樵诟轮?,提示切換的節(jié)點(diǎn)也可能失效。在這種情況下,必須通過所謂的讀取修復(fù)來確保一致性,每個讀取操作都將啟動一個異步過程,并向存儲數(shù)據(jù)的所有節(jié)點(diǎn)請求數(shù)據(jù)摘要(如簽名或哈希)。如果發(fā)現(xiàn)各個節(jié)點(diǎn)返回的摘要不一致,那么各個節(jié)點(diǎn)的數(shù)據(jù)版本就會統(tǒng)一。我們稱之為一次性讀寫結(jié)合a、b、c、d的技術(shù)。它們不提供嚴(yán)格的一致性保證,但作為一種自帶的方法,已經(jīng)應(yīng)用到實(shí)踐中。上述策略(例如,讀取和寫入)是一種啟發(fā)式增強(qiáng),用于減少復(fù)制的收斂時間。為了保證更大的一致性,需要犧牲可用性來保證閱讀和寫作有一定的重疊。通常的做法是同時寫w份而不是一份,讀r份。首先,您可以配置寫入副本的數(shù)量w 1。其次,由于r w是綁定節(jié)點(diǎn)之間的重疊讀寫,在數(shù)據(jù)的多個副本中至少會有一個新數(shù)據(jù)被讀取(w = 2,r = 3,n = 4)。這樣,在執(zhí)行讀寫請求時,它們可以保證一致性(讀寫用戶的一致性),但不能保證全局一致性。根據(jù)下圖的例子,r = 2,w = 2,n。= 3,因?yàn)閮蓚€寫賦值的更新是非事務(wù)。當(dāng)更新未完成時,您可以讀取兩個舊值或一個新值。對于某些讀取延遲,設(shè)置不同的r和w值可以調(diào)整寫入延遲和寫入持續(xù)時間,反之亦然。如果wn/2可以確保原子讀重寫在檢測到時處于反轉(zhuǎn)模式。嚴(yán)格來說,這種模型可以容忍單個節(jié)點(diǎn)失效,但是網(wǎng)絡(luò)隔離的容錯性不好。在實(shí)踐中,這種近似的方法經(jīng)常被用來犧牲一些一致性來提高某些場景的可用性。讀取數(shù)據(jù)時,讀取所有副本(讀取數(shù)據(jù)或檢查匯總)可以緩解讀取一致性問題。這確保了只要至少一個節(jié)點(diǎn)上的數(shù)據(jù)被更新,讀者就可以看到新數(shù)據(jù)。但在網(wǎng)絡(luò)隔離的情況下,這種保障就不起作用了。(g,主從)這種技術(shù)通常用于提供讀寫的連續(xù)重寫作為原子寫或檢測級別,以達(dá)到預(yù)防的級別,需要使用集中管理模式或鎖。最簡單的策略是將一個主從式的特定數(shù)據(jù)項(xiàng)的路徑復(fù)制到一個中心節(jié)點(diǎn),然后順序執(zhí)行。在這種情況下,主節(jié)點(diǎn)將成為瓶頸,所以我們必須將數(shù)據(jù)劃分到獨(dú)立的部門(不同的塊,不同的主),以提供可擴(kuò)展性。(h)更新多個副本的方法可以使用事務(wù)控制技術(shù)來避免寫。著名的方法是使用兩階段提交協(xié)議。但是,兩階段提交并不完全可靠,因?yàn)槿藶楣收峡赡軙?dǎo)致資源阻塞paxos的提交。協(xié)議是更可靠的選擇,但會損失一些性能。在此基礎(chǔ)上,下一個小步驟是在一個事務(wù)中讀取所有副本并更新副本。它提供了很強(qiáng)的容錯能力,但是會損失一些性能和可用性。以上分析中的一些取舍需要再次強(qiáng)調(diào)。一致性和可用性,cap理論給出了嚴(yán)格的權(quán)衡,在網(wǎng)絡(luò)隔離的情況下,數(shù)據(jù)庫既可以設(shè)置數(shù)據(jù),又可以接受數(shù)據(jù)丟失的風(fēng)險。一致性和可伸縮性,可以看出即使是一致的讀寫保證也會降低副本集的可伸縮性。只有在原子寫模式下,才能以相對可擴(kuò)展的處理寫。原子讀重寫模型避免了,增加了臨時全局鎖的數(shù)據(jù)量。這表明,數(shù)據(jù)或操作之間的依賴,即使在小范圍或短時間內(nèi),也會損害的可擴(kuò)展性。因此,設(shè)計良好的數(shù)據(jù)模型和單獨(dú)存儲的數(shù)據(jù)的可伸縮性非常重要。一致性和延遲,如上所述,當(dāng)數(shù)據(jù)庫需要提供強(qiáng)一致性或持久性時,應(yīng)該偏向于讀寫所有的復(fù)制技術(shù),但明顯與請求延遲一致,與副本數(shù)量成反比,所以使用這種技術(shù)會是一種更客觀的衡量標(biāo)準(zhǔn)。故障轉(zhuǎn)移和一致性/可擴(kuò)展性/延遲。有趣的是,容錯和一致,和拖延都不是暴力。通過合理地放棄一些性能和一致性性,集群可以容忍盡可能多的節(jié)點(diǎn)故障。這種折衷和paxos協(xié)議的區(qū)別是顯而易見的。在另一個例子中,這種折衷是添加特定的一致性保證,例如使用嚴(yán)格的會話進(jìn)程讀寫,但這增加了故障轉(zhuǎn)移的復(fù)雜性。反熵協(xié)議和謠言傳播算法let s從以下幾點(diǎn)入手:有多個節(jié)點(diǎn),每個節(jié)點(diǎn)有一個副本,每個節(jié)點(diǎn)可以單獨(dú)處理更新請求,每個節(jié)點(diǎn)定期與其他節(jié)點(diǎn)同步。在此期間,所有副本將保持一致。如何完成同步過程,何時開始同步,如何選擇同步對象,如何交換數(shù)據(jù)。我們假設(shè)兩個節(jié)點(diǎn)總是用新版本的數(shù)據(jù)覆蓋舊數(shù)據(jù),或者保留兩個版本用于應(yīng)用層處理。這個問題常見于數(shù)據(jù)一致性維護(hù)和集群狀態(tài)同步,比如集群成員信息分發(fā)。雖然該負(fù)責(zé)人介紹,監(jiān)控數(shù)據(jù)庫和同步方案可以解決這個問題,但分散數(shù)據(jù)庫可以提供更好的容錯能力。集中的主要方法是使用設(shè)計良好的傳染協(xié)議,該協(xié)議相對簡單,但它提供了良好的收斂時間,并且可以容忍任何節(jié)點(diǎn)故障和網(wǎng)絡(luò)隔離。雖然有許多感染類型的算法,但我們只關(guān)注反熵協(xié)議,因?yàn)閚osql數(shù)據(jù)庫使用它。反熵協(xié)議假設(shè)同步將根據(jù)固定的時間表來執(zhí)行。每個節(jié)點(diǎn)定期選擇另一個節(jié)點(diǎn)交換數(shù)據(jù)以消除差異。根據(jù)一定的規(guī)則,有三種反熵協(xié)議:推、拉和組合。推送協(xié)議的原理是簡單地選擇一個隨機(jī)的節(jié)點(diǎn)來發(fā)送數(shù)據(jù)。這顯然是愚蠢的,把所有的數(shù)據(jù)放在實(shí)際應(yīng)用中,所以節(jié)點(diǎn)一般以如下所示的工作。作為同步發(fā)起者的節(jié)點(diǎn)準(zhǔn)備數(shù)據(jù)的摘要,該摘要被包括在a的數(shù)據(jù)指紋中。在接收到摘要之后,節(jié)點(diǎn)b將數(shù)據(jù)與本地數(shù)據(jù)和作為摘要返回的數(shù)據(jù)進(jìn)行比較,返回最終的摘要,向b發(fā)送一個,向b更新一個,然后更新數(shù)據(jù)。拉模式和混合方法之間的協(xié)議是相似的,如上圖所示。反熵協(xié)議提供了良好的收斂時間和可擴(kuò)展性。下圖顯示了在100個節(jié)點(diǎn)的集群中傳播更新的結(jié)果。在每次迭代中,每個節(jié)點(diǎn)只與一個隨機(jī)選擇的節(jié)點(diǎn)相關(guān)聯(lián)??梢娎J绞諗勘鹊耐品椒ɡ碚撋鲜强梢宰C明的,還有一個問題,收斂到底。經(jīng)過多次迭代,雖然幾乎所有的節(jié)點(diǎn)都過去了,但仍有一些不受影響的混合方法。它比簡單的推挽方法更有效,所以在實(shí)際應(yīng)用中,反熵是可擴(kuò)展的,平均轉(zhuǎn)換時間的增加是簇大小的對數(shù)函數(shù)形式。雖然這些技術(shù)看起來很簡單,但仍然有許多研究專注于不同約束下的反熵協(xié)議的性能,其中使用了更有效的網(wǎng)絡(luò)拓?fù)涠皇请S機(jī)選擇。使用有限的傳輸速率調(diào)整網(wǎng)絡(luò)帶寬,或者使用高級規(guī)則選擇數(shù)據(jù)同步。匯總計算也面臨挑戰(zhàn),數(shù)據(jù)庫將保持更新。用于匯總計算的新日志。在上一節(jié)中,我們假設(shè)兩個節(jié)點(diǎn)總是合并它們的數(shù)據(jù)版本,但是解決更新并不容易,所有副本最終都能達(dá)到語義正確的值也就不足為奇了。讓 假設(shè)一個例子來說明這個問題:數(shù)據(jù)庫維護(hù)一個邏輯全局計數(shù)器,每個節(jié)點(diǎn)可以增加或減少這個數(shù)字。雖然每個節(jié)點(diǎn)都可以保持它的局部值,但是這些地方不能通過簡單的加減運(yùn)算來合并。假設(shè)有三個節(jié)點(diǎn)a、b和c,每個節(jié)點(diǎn)執(zhí)行額外的操作。如果你取b的值加到本地副本,那么c得到b的值,然后c得到值,然后c的最終值是4,這是不對的。解決這個問題的方法是使用類似于向量時鐘的數(shù)據(jù)結(jié)構(gòu)來保持每個節(jié)點(diǎn)對計數(shù)器。class inverse { int plus } int minus international node _ id increment{ node _ id plus { } } minus{ node _ id minus { } } get{ return and(sum)-and(負(fù)號)} merge(counter other){我在1。max_id {plus {i max = max (plus {},其他。加{})減去最大值(減{,},再減} } } cassandra也是類似的設(shè)計。一個更復(fù)雜和最終一致的數(shù)據(jù)結(jié)構(gòu)也可以用一個狀態(tài)或基于復(fù)制理論來設(shè)計。比如提到了一系列這樣的數(shù)據(jù)結(jié)構(gòu),包括:counter(加減)set(加減運(yùn)算)graph(加一條邊)。這一部分重點(diǎn)介紹分布式數(shù)據(jù)庫中控制數(shù)據(jù)放置的算法,這些算法負(fù)責(zé)將數(shù)據(jù)項(xiàng)映射到適當(dāng)?shù)奈锢砉?jié)點(diǎn),在節(jié)點(diǎn)之間遷移數(shù)據(jù)以及全局分配資源(如內(nèi)存)。平衡數(shù)據(jù)我們通過簡單的協(xié)議提供集群節(jié)點(diǎn)之間的無縫數(shù)據(jù)遷移。當(dāng)集群擴(kuò)展時(例如添加新節(jié)點(diǎn)(節(jié)點(diǎn)故障轉(zhuǎn)移)和一些停機(jī)時間)或平衡數(shù)據(jù)時(節(jié)點(diǎn)間不均勻的數(shù)據(jù)分布),通常會出現(xiàn)這種情況。場景描述圖1如下——三個節(jié)點(diǎn)和三個節(jié)點(diǎn)的數(shù)據(jù)是隨機(jī)分布的(假設(shè)數(shù)據(jù)是核心值)。如果數(shù)據(jù)庫不支持?jǐn)?shù)據(jù)的內(nèi)部平衡,則數(shù)據(jù)庫實(shí)例會在每個節(jié)點(diǎn)中發(fā)布,如圖b所示。這需要對停止遷移的數(shù)據(jù)庫實(shí)例進(jìn)行手動集群擴(kuò)展,這會移動到新節(jié)點(diǎn)并在新節(jié)點(diǎn)開始,如圖所示。雖然數(shù)據(jù)庫監(jiān)控每一條記錄,但是包括mondb、oracle coherence、redis clust——,將鍵(通常是哈希)映射到物理節(jié)點(diǎn),鍵的哈希值空間是一個有序的定長二進(jìn)制字符串。很明顯,這個范圍內(nèi)的每個鍵都會映射到圖a的一個三節(jié)點(diǎn)副本,值空間會封閉成一個環(huán),沿著環(huán)順時針方向,直到所有副本都映射到對應(yīng)的節(jié)點(diǎn),如圖b所示,換句話說,你會位于節(jié)點(diǎn)b,因?yàn)樵赽的范圍內(nèi),第一個副本要放在c,第二個副本放在一,以此類推。這種結(jié)構(gòu)的優(yōu)點(diǎn)是增加或刪除一個節(jié)點(diǎn),因?yàn)樗槐3窒噜弲^(qū)域的數(shù)據(jù)平衡。如圖c所示,添加節(jié)點(diǎn)d只會影響數(shù)據(jù)項(xiàng)x和y是否受影響。同樣的,節(jié)點(diǎn)b的移除(或者b只失效)會影響y和x的副本,不會影響x本身。但這種有利有弊,即經(jīng)濟(jì)負(fù)擔(dān)由鄰居節(jié)點(diǎn)承擔(dān),會移動大量數(shù)據(jù)。每個節(jié)點(diǎn)映射到一個范圍而不是一個范圍,這不是問題??梢栽谝欢ǔ潭壬辖档陀绊?,如圖d所示,這是一種權(quán)衡。重新平衡數(shù)據(jù)時避免過載。但是,與基于模塊的映射相比,它適當(dāng)?shù)販p少了總體平衡的數(shù)量。維護(hù)一個完全一致的大型哈希環(huán)集群并不容易。這對于相對較小的數(shù)據(jù)庫集群來說沒有問題,研究如何在對等網(wǎng)絡(luò)中將數(shù)據(jù)放置與路由網(wǎng)絡(luò)結(jié)合起來是很有趣的。比較好的例子是chord算法,它使得環(huán)的完整性認(rèn)可單個節(jié)點(diǎn)的搜索效率。chord算法也采用了環(huán)映射關(guān)鍵節(jié)點(diǎn)的思想,在這方面類似于一致性哈希。不同的是,一個特定的節(jié)點(diǎn)維護(hù)一個鏈表,鏈表中節(jié)點(diǎn)和環(huán)的邏輯位置是相乘的(如下圖所示),這就使得用兩點(diǎn)搜索定位鍵w只需要很少的網(wǎng)絡(luò)跳數(shù)。這張圖片是一個由16個節(jié)點(diǎn)組成的集群,描述了節(jié)點(diǎn)a如何尋找放置在節(jié)點(diǎn)d上的密鑰..(a)描述了路由,(b)描述了節(jié)點(diǎn)a、b和c的環(huán)的部分圖像。在參考文獻(xiàn)中,有關(guān)于分布式系統(tǒng)中的數(shù)據(jù)復(fù)制的更多信息。根據(jù)多個屬性進(jìn)行數(shù)據(jù)分片當(dāng)使用哈希訪問數(shù)據(jù)時,一致的數(shù)據(jù)放置策略是有效的,但會更加復(fù)雜。當(dāng)查詢多個屬性時,一個簡單的方法(使用mondb)是使用主鍵分配的數(shù)據(jù),而不考慮其他屬性。結(jié)果是基于主鍵的查詢可以路由到合適的節(jié)點(diǎn),但是查詢效率的不平衡會導(dǎo)致以下問題:有一個數(shù)據(jù)集,其中每個數(shù)據(jù)都有很多屬性和對應(yīng)的值。是否存在一種數(shù)據(jù)分布策略,允許盡可能少地執(zhí)行具有任意數(shù)量屬性的查詢,這提供了一種解決方案。其基本思想是將每個屬性視為多維空間中的一個軸和映射區(qū)域在空間中的一個物理節(jié)點(diǎn),查詢將匹配到幾個相鄰區(qū)域空間中的一個超平面,因此只有這些區(qū)域中的查詢是相關(guān)的。讓 讓我們看一下參考示例。每個數(shù)據(jù)是一個用戶 的信息,它有三個屬性,名、姓和號碼。這些屬性被視為三維空間中可行數(shù)據(jù)分布策略圖的每個象限中的一個物理節(jié)點(diǎn),查詢name = john對應(yīng)一個貫穿四個象限的平面。是的,只有四個節(jié)點(diǎn)參與查詢處理。對應(yīng)于具有兩個屬性約束的查詢的直線穿過兩個象限。如最后一幅圖所示,只有兩個節(jié)點(diǎn)將參與處理。這種方法的問題是空間象限增加了屬性數(shù)量的指數(shù)函數(shù)。所以只有幾個屬性的查詢會被投影到很多空間區(qū)域,也就是很多服務(wù)器上,更多的屬性數(shù)據(jù)項(xiàng)會被分成幾個屬性相對較少的子項(xiàng),每個子項(xiàng)會被映射到多維空間中的一個獨(dú)立空間,而不是整個數(shù)據(jù),可以在一定程度上緩解這個問題。這種映射可以為節(jié)點(diǎn)提供更好的查詢,但是增加了集群的協(xié)調(diào)性。因?yàn)檫@種情況下的數(shù)據(jù)會分散在幾個獨(dú)立的子空間中,每個子空間對應(yīng)幾個物理節(jié)點(diǎn),所以數(shù)據(jù)更新必須考慮問題。鈍化副本有些應(yīng)用對隨機(jī)讀取有很強(qiáng)的需求,要求所有數(shù)據(jù)都存儲在內(nèi)存中。在這種情況下,通常是從節(jié)點(diǎn)從每個段復(fù)制數(shù)據(jù)兩次以上,因?yàn)槊總€數(shù)據(jù)都在主節(jié)點(diǎn)和從節(jié)點(diǎn)的一部分來代替主節(jié)點(diǎn),從節(jié)點(diǎn)的內(nèi)存大小應(yīng)該和主節(jié)點(diǎn)的一樣。如果系統(tǒng)可以容忍短期中斷或性能下降,那么當(dāng)節(jié)點(diǎn)出現(xiàn)故障時,它也可以是不可分的。下圖描述了4個節(jié)點(diǎn)上的16個數(shù)據(jù)段,每個節(jié)點(diǎn)在內(nèi)存中都有一個部分,在硬盤上也有一個副本?;疑^突出顯示了節(jié)點(diǎn)2上的分段副本。其他節(jié)點(diǎn)上的切片也會被復(fù)制。紅色箭頭描述了將副本加載到內(nèi)存中時節(jié)點(diǎn)2的故障。集群中的副本是均勻分布的,這可以將活動副本的故障存儲在幾個保留內(nèi)存的節(jié)點(diǎn)中。在上圖中,集群只保留1/3的內(nèi)存,可以承受單節(jié)點(diǎn)故障。特別指出的是,復(fù)制激活(從硬盤加載到內(nèi)存)需要一定的時間,這會導(dǎo)致性能下降或短時間內(nèi)部分?jǐn)?shù)據(jù)服務(wù)中斷和恢復(fù)。系統(tǒng)協(xié)調(diào)在本節(jié)中,我們將討論這兩種技術(shù)都與系統(tǒng)協(xié)調(diào)有關(guān)。分布式協(xié)調(diào)是一個比較大的領(lǐng)域,很多人研究了幾十年。在本文中,只涉及兩種實(shí)用技術(shù)。分布式鎖、內(nèi)容一致性協(xié)議和其他基本技術(shù)可以在許多書籍或網(wǎng)絡(luò)資源中找到。故障檢測和容錯分布式系統(tǒng)的基本功能。其實(shí)所有基于心跳故障檢測協(xié)議的通信機(jī)制原理都很簡單。組件定期發(fā)送心跳監(jiān)視信息,如果在一段時間內(nèi)沒有接收到心跳信息,則監(jiān)視過程(或由監(jiān)視組件監(jiān)視的輪詢過程)被視為失敗。此外,真正的分布式系統(tǒng)還有其他一些功能需求。自適應(yīng)故障檢測應(yīng)該能夠處理臨時網(wǎng)絡(luò)故障和延遲,以及改變負(fù)載和帶寬的集群拓?fù)?。但是,這是非常困難的,因?yàn)闆]有辦法知道長期無響應(yīng)的過程是否是真正的失敗。因此,在故障檢測和故障識別中需要權(quán)衡的時間(確定一個真正的故障需要多長時間,也就是經(jīng)過一個無響應(yīng)過程后多長時間才會被認(rèn)為是故障)和誤報率的權(quán)重是權(quán)衡因素。乍一看,故障檢測只需要輸出一個指示監(jiān)控進(jìn)程是否工作的布爾值,但在實(shí)際應(yīng)用中不受e的影響。讓 讓我們看看mapreduce的參考示例。有一個分布式應(yīng)用程序,它有一個主節(jié)點(diǎn)和多個工作節(jié)點(diǎn)。主節(jié)點(diǎn)維護(hù)一個工作列表并分配工作列表中的工作節(jié)點(diǎn),主節(jié)點(diǎn)可以區(qū)分不同程度的故障。如果主節(jié)點(diǎn)懷疑工作節(jié)點(diǎn)被掛起,他不會再把工作分配給該節(jié)點(diǎn)。其次,隨著時間的推移,如果沒有收到節(jié)點(diǎn)的心跳信息,主節(jié)點(diǎn)會將工作重新分配給其他節(jié)點(diǎn)。最后,主節(jié)點(diǎn)確認(rèn)該節(jié)點(diǎn)出現(xiàn)故障,并且所有相關(guān)資源都被釋放??蓴U(kuò)展性和健壯性。故障檢測作為一個系統(tǒng)的功能,應(yīng)該能夠隨著系統(tǒng)而擴(kuò)展。它應(yīng)該是強(qiáng)大的、一致的,即即使通信失敗,系統(tǒng)中的所有節(jié)點(diǎn)也應(yīng)該有一致的看法(即所有節(jié)點(diǎn)都應(yīng)該知道哪些節(jié)點(diǎn)不可用,哪些節(jié)點(diǎn)可用,不,認(rèn)知節(jié)點(diǎn)不能出現(xiàn)在節(jié)點(diǎn)a不可用的一部分節(jié)點(diǎn),而節(jié)點(diǎn)的其他部分不知道情況)。所謂累積故障檢測器可以解決第一個問題。cassandra做了一些修改,并應(yīng)用到產(chǎn)品的基本工作過程中,具體如下:對于每個監(jiān)測資源,計算探測器記錄的心跳信息的到達(dá)時間,統(tǒng)計預(yù)測范圍內(nèi)到達(dá)時間的均值和方差。假設(shè)到達(dá)時間的分布已知(下圖包含一個正態(tài)分布的公式),我們可以計算心跳延遲的概率(當(dāng)前時間t_now的最后到達(dá)時間tc之差),用這個概率來判斷是否存在故障。對數(shù)函數(shù)可以調(diào)整以提高可用性。在這種情況下,輸出1意味著誤判(節(jié)點(diǎn)故障)的概率是10%,2是1%,以此類推。根據(jù)重要程度的不同,要按級別組織監(jiān)控區(qū)域。這個區(qū)域是謠言通信協(xié)議或中央容錯庫的同步,可以滿足可擴(kuò)展性的要求,防止心跳信息在網(wǎng)絡(luò)中泛濫。如下圖所示,6個故障檢測器組成了兩個區(qū)域,這兩個區(qū)域通過謠言傳播協(xié)議或者像城市動物園這樣強(qiáng)大的庫連接在一起。協(xié)調(diào)運(yùn)動協(xié)調(diào)活動是強(qiáng)一致性數(shù)據(jù)庫的一項(xiàng)重要技術(shù)。一種是利用主從結(jié)構(gòu)組織系統(tǒng)中主要節(jié)點(diǎn)的故障恢復(fù),另一種是在網(wǎng)絡(luò)隔離的情況下斷開少數(shù)節(jié)點(diǎn),避免。欺負(fù)算法是一種相對簡單的協(xié)調(diào)移動算法,mondb使用這種算法來確定一個主副本集。欺負(fù)算法的主要思想是,集群中的每個成員都可以聲明自己被協(xié)調(diào)并通知其他節(jié)點(diǎn),其他節(jié)點(diǎn)可以選擇接受這個聲明或者拒絕進(jìn)入?yún)f(xié)調(diào)者的競爭。節(jié)點(diǎn)的其他節(jié)點(diǎn)都可以協(xié)調(diào),節(jié)點(diǎn)判斷誰該贏。根據(jù)某些屬性,這個屬性可以是一個靜態(tài)id,也可以是一個像上次事務(wù)id一樣的可測更新(最新的節(jié)點(diǎn)會贏)。下面的例子演示了欺負(fù)算法的執(zhí)行。使用靜態(tài)id作為度量,id較大的節(jié)點(diǎn)將勝出:在初始集群中,有5個節(jié)點(diǎn),節(jié)點(diǎn)5是公認(rèn)的協(xié)調(diào)器。假設(shè)節(jié)點(diǎn)5和節(jié)點(diǎn)2掛機(jī),三個節(jié)點(diǎn)同時被發(fā)現(xiàn)。兩個節(jié)點(diǎn)開始發(fā)送的消息的id。選擇節(jié)點(diǎn)4、節(jié)點(diǎn)2、節(jié)點(diǎn)3,并排除節(jié)點(diǎn)2和節(jié)點(diǎn)3。此時,節(jié)點(diǎn)1的節(jié)點(diǎn)5發(fā)送選舉失敗。具有較大id的所有節(jié)點(diǎn)的感知信息。節(jié)點(diǎn)2、3和4,節(jié)點(diǎn)1和節(jié)點(diǎn)4都被消除。發(fā)送選舉信息的節(jié)點(diǎn)5沒有響應(yīng),因此節(jié)點(diǎn)4宣布它當(dāng)選為宣布此消息的另一個節(jié)點(diǎn)。協(xié)調(diào)活動中涉及的節(jié)點(diǎn)數(shù)量,確保集群中至少有一半的節(jié)點(diǎn)參與選舉。這樣就保證了網(wǎng)絡(luò)協(xié)調(diào)器選擇的網(wǎng)絡(luò)中只有一部分節(jié)點(diǎn)可以被隔離(假設(shè)網(wǎng)絡(luò)被劃分為不同的區(qū)域,這些區(qū)域互不相連,選舉結(jié)果的協(xié)調(diào)器會導(dǎo)致節(jié)點(diǎn)數(shù),課程協(xié)調(diào)器會有一個比較大的區(qū)域,前提是可用節(jié)點(diǎn)的面積是集群中原來節(jié)點(diǎn)數(shù)的一半。如果集群被分成幾個塊,則不能選擇具有更大節(jié)點(diǎn)總數(shù)的節(jié)點(diǎn)協(xié)調(diào)器。當(dāng)然,預(yù)計在這種情況下,集群可以繼續(xù)提供服務(wù)。
了解更多分布式數(shù)據(jù)庫sql(分布式數(shù)據(jù)庫sqlserver)相關(guān)內(nèi)容請關(guān)注本站點(diǎn)。