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