出于成本等方面的考慮,Dynamo中很多服務(wù)器托管采用的是普通PC主機(jī)(無顯示器、鍵盤)。普通PC硬盤的性能和專業(yè)的服務(wù)器硬盤的性能相比相距甚遠(yuǎn),出錯(cuò)在所難免,因此容錯(cuò)機(jī)制在Dynamo中非常重要。機(jī)器故障包括臨時(shí)故障和永久性故障,下面從這兩方面分別介紹Dynamo容錯(cuò)機(jī)制。
1)臨時(shí)故障處理機(jī)制
Dynamo臨時(shí)故障處理機(jī)制主要體現(xiàn)在兩方面,首先,在數(shù)據(jù)讀寫中采用了一種稱為弱quorum (Sloppy quorum)的機(jī)制,涉及三個(gè)參數(shù)W、R、N,見其中W代表一次成功的寫操作至少需要寫入的副本數(shù),R代表一次成功讀操作需由服務(wù)器返回給用戶的最小副本數(shù),N是每個(gè)數(shù)據(jù)存儲的副本數(shù)。Dynamo要求R+W〉N,滿足這個(gè)要求,保證用戶讀取數(shù)據(jù)時(shí),始終可以獲得一個(gè)最新的數(shù)據(jù)版本。用戶可以自行配置R和W,調(diào)節(jié)可用性和容錯(cuò)性之間的平衡。如果將E、W配低,則系統(tǒng)的可用性好于容錯(cuò)性,反之提高系統(tǒng)的容錯(cuò)性會降低可用性。從用戶的角度來看,如果用戶對于讀操作要求較髙,可以將R設(shè)置為1,W設(shè)置成N,保證只要有一個(gè)節(jié)點(diǎn)可用,就可以進(jìn)行讀操作,反之則可以保證在只有一個(gè)節(jié)點(diǎn)情況下也可以進(jìn)行寫操作。這種固定N的設(shè)置方式和傳統(tǒng)的quorum機(jī)制類似,但是Dynamo采用的弱quorum機(jī)制對其做了改進(jìn)。這種機(jī)制規(guī)定系統(tǒng)對每個(gè)數(shù)據(jù)的存儲量仍為N,但此時(shí)的N并不限定為preference list的N個(gè)節(jié)點(diǎn),而是將N限制為前N個(gè)正常節(jié)點(diǎn)。巧妙之處在于,一方面當(dāng)preference list中前N個(gè)節(jié)點(diǎn)中有出現(xiàn)臨時(shí)故障的,則會自動由后面的正常節(jié)點(diǎn)接替其工作,增強(qiáng)了系統(tǒng)的容錯(cuò)性。另一方面,一旦某個(gè)節(jié)點(diǎn)出現(xiàn)問題,則將這個(gè)節(jié)點(diǎn)值傳送給preference list中的下一個(gè)正常節(jié)點(diǎn),并在這個(gè)數(shù)據(jù)副本的元數(shù)據(jù)中記錄失效的節(jié)點(diǎn)位置,便于數(shù)據(jù)回傳;然后,由這個(gè)節(jié)點(diǎn)上一個(gè)臨時(shí)空間進(jìn)行存儲和處理數(shù)據(jù),同時(shí)該節(jié)點(diǎn)還對失效的節(jié)點(diǎn)進(jìn)行監(jiān)測,一旦失效的節(jié)點(diǎn)重新可用,則將自己所保存的最新數(shù)據(jù)回傳給它,然后刪除自己開辟的臨時(shí)空間數(shù)據(jù)。簡單地說這是一種帶有監(jiān)聽的數(shù)據(jù)回傳機(jī)制(HintedHandoff)。圖3-7是pynamo臨時(shí)故障處理機(jī)制示意圖。

2)永久性故陣處理機(jī)制
節(jié)點(diǎn)出現(xiàn)永久性故障時(shí),Dynamo必須檢査和保持?jǐn)?shù)據(jù)的同步 ,Dynamo采用一種稱為反熵協(xié)議(Anti-entropy Protocol)的手段來保證數(shù)據(jù)的同步。為了減少數(shù)據(jù)同步檢測中需要傳輸?shù)臄?shù)據(jù)量,加快檢測速度,Dynamo使用了Merkle哈希樹技術(shù),每個(gè)虛擬節(jié)點(diǎn)保存三顆Merkle樹,即每個(gè)鍵值區(qū)間建立一個(gè)Merkle樹。Dynamo中Merkle哈希樹的葉子節(jié)點(diǎn)是存儲每個(gè)數(shù)據(jù)分區(qū)內(nèi)所有數(shù)據(jù)對應(yīng)的哈希值,父節(jié)點(diǎn)是其所有子節(jié)點(diǎn)的哈希值。圖3-8是兩棵不同的Merkle哈希樹A和B。

系統(tǒng)比較兩棵同一鍵值區(qū)的Merkle哈希樹時(shí),首先査看根節(jié)點(diǎn),如果相同則說明數(shù)據(jù)一致,不需要進(jìn)行數(shù)據(jù)同步,否則需要繼續(xù)比較,直到哈希值不同的葉子節(jié)點(diǎn),快速定位差異。例如,圖3-8中A和B的根節(jié)點(diǎn)不同,說明需要進(jìn)行數(shù)據(jù)同步。緊接著比較A和B的子節(jié)點(diǎn),發(fā)現(xiàn)右子樹的根節(jié)點(diǎn)2≠5,繼續(xù)比較右予樹根節(jié)點(diǎn)的子節(jié)點(diǎn),按同樣的步驟一直進(jìn)行下去,發(fā)現(xiàn)需要同步的數(shù)據(jù)位置。Merkle樹最大特點(diǎn)是只要比較某個(gè)子樹就可以完成數(shù)據(jù)同步檢測和定位,進(jìn)而進(jìn)行同步,大大減少了同步過程中所需傳輸數(shù)據(jù)量,提高了系統(tǒng)效率。