随笔 - 16  文章 - 1  trackbacks - 0
<2009年12月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

常用链接

留言簿

随笔档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜

前文说到,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
posted on 2009-12-03 13:43 Programmers 阅读(317) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航: