前文說到,Dynamo DHT能夠定位數據所屬的節點,為了處理節點失效的情況(DHT環中刪除節點),需要對節點的數據進行replication。思路如下:假設數據存儲K份,DHT定位到的數據所屬節點為N,則數據存儲在節點N, N+1, ..., N+K-1上。如果第i (0 <= i <= K-1) 臺機器宕機,則往后找一臺機器N+K臨時替代。臨時替代的機器定時ping機器N+i,等到它重啟后將這些臨時數據重新寫入N+i。機器N+i宕機的這段時間內,所有的讀寫均落入到機器[N, N+i-1]和[N+i+1, N+K]中,這段時間會出現數據一致性問題,需要引入專門的沖突解決協議,在Dynamo中是通過Lamport的vector clock實現的。如果機器N+i永久失效,機器N+K需要進行同步操作。一般來說,從機器N+i宕機開始到被認定為永久失效的時間不會太長,積累的寫操作也不會太多,可以采用Merkle Tree對機器的數據文件進行快速同步。
為了在可用性和效率之間權衡,Dynamo的設計中允許用戶指定讀/寫個數R和W值。R和W分別表示每個讀/寫操作需要操作的副本數。只要滿足R+W > K,就可以保證在存在不超過一臺機器故障的時候,至少能夠讀到一份有效的數據。如果應用重視讀效率,可以設置W = K, R = 1;如果應用需要在讀/寫之間權衡,一般可設置W = 2, R = 2,K = 3。
問題1:Dynamo中如何解決網絡分區問題?
前面已經提到,DHT協議本身是無法處理網絡分區的。在Dynamo中,引入種子節點,服務器定期向種子節點輪詢整個機群的機器信息,種子節點的選擇符合一定的策略使得網絡分區問題出現概率降至工程可以接受的水平。
問題2:如何將數據復制到多個數據中心?
每份數據都被復制到N, N+1, ..., N+K-1這K臺機器中,為了保證這些機器屬于不同的數據中心,需要合理地設計獲取數據節點號的Hash算法。當然,Dynamo通過直接手工配置每臺機器的編號解決。看起來很山寨,不過很實用,呵呵。 閱讀全文
類別:默認分類 查看評論
文章來源:http://hi.baidu.com/knuthocean/blog/item/f085d72a06d4ee27d52af170.html