[导入]Dynamo(一):一切从DHT开始

[导入]Dynamo(一):一切从DHT开始
DHT全称Distributed Hash Table ( en.wikipedia.org/wiki/Distributed_hash_table),在P2P系统中经常用来定位数据所属机器。这就涉及到一致哈希(consistent hashing)思想,分布式系统中经常出现机器上下线,如果采用通常的Hash方法来查找数据所属机器,机器上下线将导致整个集群的数据分布被打乱。这是因为,机器上下线将导致机器序号及Hash函数的改变,一致哈希做了简单调整:每台机器存储哈希值和它最为接近的数据。在Chord系统中,顺时针到达的第一台机器即为最近的机器。
外部的数据可能首先传输至集群中的任意一台机器,为了找到数据所属机器,要求每台机器维护一定的集群机器信息用于定位。最直观的想法当然是每台机器分别维护它的前一台及后一台机器的信息,机器的编号可以为机器IP的Hash值,定位机器最坏情况下复杂度为O(N)。可以采用平衡化思想来优化(如同平衡二叉树优化数组/链表),使每一台机器存储O(logN)的集群机器信息,定位机器最坏情况下复杂度为O(logN)。
首先考虑每台机器维护前一台及后一台机器信息的情况,这里的问题是机器上下线导致缓存信息的不一致,我们需要设计协议使得在确定一段比较短的时间内能够纠正这种错误。对于新机器加入,首先进行一次查找操作找到该机器的下一台机器,并记录下一台机器的信息。机器内的每台机器都定时向它的后继发送心跳信息,如果后继记录的前一台机器编号在二者之间,说明有新机器加入,这时需要更新后一台机器编号为新加入编号;收到心跳信息的后继也需要检查,如果发送心跳的机器编号较为接近则更新为前一台机器。机器下线将导致机器循环链表断开,所以,每台机器都维护了R个(一般取R值为3)最近的后继信息,发现后继节点下线时将通知其它后继节点并加入新的替换节点。如果R个后继节点同时下线,需要操作人员手工介入修复循环链。
Chord中的每台机器维护O(logN)的机器信息是一种空间换时间的做法,实现时需要引入额外的消息交换协议。这种做法依赖于如下前提:每台机器维护的前一台机器及后一台机器除了短时间不一致外总是正确的。

问题1:机器缓存短时间不一致有什么影响?数据正确性依靠什么保证?
短时间可能出现缓存的机器信息不正确的情况。比如有A, C, D, E四台机器,再加入一台机器B,机器加入的过程中,原本属于B的数据可能写入到B或者C,这都是允许的。又如删除机器C,访问机器C的节点得不到数据。数据的可用性及一致性还需要通过额外的replication及冲突处理协议解决。
问题2:DHT能否处理网络分区问题?
DHT不能处理网络分区问题,理论上存在整个DHT被分成多个子集的情况。我想,这时侯需要外部的机制介入,如维护一台外部机器保存所有机器列表等。 阅读全文
类别: 默认分类  查看评论
文章来源: http://hi.baidu.com/knuthocean/blog/item/cca1e711221dcfcca6ef3f1d.html

你可能感兴趣的:([导入]Dynamo(一):一切从DHT开始)