出于成本等方面的考慮,Dynamo中很多服務器托管采用的是普通PC主機(無顯示器、鍵盤)。普通PC硬盤的性能和專業(yè)的服務器硬盤的性能相比相距甚遠,出錯在所難免,因此容錯機制在Dynamo中非常重要。機器故障包括臨時故障和永久性故障,下面從這兩方面分別介紹Dynamo容錯機制。
1)臨時故障處理機制
Dynamo臨時故障處理機制主要體現(xiàn)在兩方面,首先,在數(shù)據(jù)讀寫中采用了一種稱為弱quorum (Sloppy quorum)的機制,涉及三個參數(shù)W、R、N,見其中W代表一次成功的寫操作至少需要寫入的副本數(shù),R代表一次成功讀操作需由服務器返回給用戶的最小副本數(shù),N是每個數(shù)據(jù)存儲的副本數(shù)。Dynamo要求R+W〉N,滿足這個要求,保證用戶讀取數(shù)據(jù)時,始終可以獲得一個最新的數(shù)據(jù)版本。用戶可以自行配置R和W,調節(jié)可用性和容錯性之間的平衡。如果將E、W配低,則系統(tǒng)的可用性好于容錯性,反之提高系統(tǒng)的容錯性會降低可用性。從用戶的角度來看,如果用戶對于讀操作要求較髙,可以將R設置為1,W設置成N,保證只要有一個節(jié)點可用,就可以進行讀操作,反之則可以保證在只有一個節(jié)點情況下也可以進行寫操作。這種固定N的設置方式和傳統(tǒng)的quorum機制類似,但是Dynamo采用的弱quorum機制對其做了改進。這種機制規(guī)定系統(tǒng)對每個數(shù)據(jù)的存儲量仍為N,但此時的N并不限定為preference list的N個節(jié)點,而是將N限制為前N個正常節(jié)點。巧妙之處在于,一方面當preference list中前N個節(jié)點中有出現(xiàn)臨時故障的,則會自動由后面的正常節(jié)點接替其工作,增強了系統(tǒng)的容錯性。另一方面,一旦某個節(jié)點出現(xiàn)問題,則將這個節(jié)點值傳送給preference list中的下一個正常節(jié)點,并在這個數(shù)據(jù)副本的元數(shù)據(jù)中記錄失效的節(jié)點位置,便于數(shù)據(jù)回傳;然后,由這個節(jié)點上一個臨時空間進行存儲和處理數(shù)據(jù),同時該節(jié)點還對失效的節(jié)點進行監(jiān)測,一旦失效的節(jié)點重新可用,則將自己所保存的最新數(shù)據(jù)回傳給它,然后刪除自己開辟的臨時空間數(shù)據(jù)。簡單地說這是一種帶有監(jiān)聽的數(shù)據(jù)回傳機制(HintedHandoff)。圖3-7是pynamo臨時故障處理機制示意圖。
2)永久性故陣處理機制
節(jié)點出現(xiàn)永久性故障時,Dynamo必須檢査和保持數(shù)據(jù)的同步 ,Dynamo采用一種稱為反熵協(xié)議(Anti-entropy Protocol)的手段來保證數(shù)據(jù)的同步。為了減少數(shù)據(jù)同步檢測中需要傳輸?shù)臄?shù)據(jù)量,加快檢測速度,Dynamo使用了Merkle哈希樹技術,每個虛擬節(jié)點保存三顆Merkle樹,即每個鍵值區(qū)間建立一個Merkle樹。Dynamo中Merkle哈希樹的葉子節(jié)點是存儲每個數(shù)據(jù)分區(qū)內所有數(shù)據(jù)對應的哈希值,父節(jié)點是其所有子節(jié)點的哈希值。圖3-8是兩棵不同的Merkle哈希樹A和B。
系統(tǒng)比較兩棵同一鍵值區(qū)的Merkle哈希樹時,首先査看根節(jié)點,如果相同則說明數(shù)據(jù)一致,不需要進行數(shù)據(jù)同步,否則需要繼續(xù)比較,直到哈希值不同的葉子節(jié)點,快速定位差異。例如,圖3-8中A和B的根節(jié)點不同,說明需要進行數(shù)據(jù)同步。緊接著比較A和B的子節(jié)點,發(fā)現(xiàn)右子樹的根節(jié)點2≠5,繼續(xù)比較右予樹根節(jié)點的子節(jié)點,按同樣的步驟一直進行下去,發(fā)現(xiàn)需要同步的數(shù)據(jù)位置。Merkle樹最大特點是只要比較某個子樹就可以完成數(shù)據(jù)同步檢測和定位,進而進行同步,大大減少了同步過程中所需傳輸數(shù)據(jù)量,提高了系統(tǒng)效率。