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

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

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