学习算法时候突然想到这个问题,先留个大致印象好了。
看了几篇博文,仍然不知所云,而这篇:
http://www.jiacheo.org/blog/174
通过比较普通集群、哈希集群与一致性哈希集群,得出了一致性哈希的优点。进而阐述一致性哈希为什么要具备四个条件:
1、平衡性
2、单调性
3、负载
4、分散性
简单说,传统的集群方式是通过普通映射(例如1-->1,2-->2)或者哈希映射(例如1 mod 3 = 1,2 mod 3 = 2,N mod M),但是缺点在于,如果节点挂掉,需要进行大量的数据迁移。普通映射的迁移代价类似数组中插入或删除元素,需要整体迁移;哈希映射变动后需要重新选择M,并对存在的节点数据进行迁移。
一致性哈希的优点在于,先将节点映射到2^32这样一个超级大环中,然后将需要cache的对象计算hashCode() mod 2^32也映射到这个环上,接着按照事先定好的顺序(如顺时针或逆时针)将对象一一存储到节点上,创造性地提出了将存储节点与存储对象放到同一个环上的思想。这样做的好处在于,当其中某个节点挂掉后,受影响的仅仅是映射到本节点的这些对象,我们只需要将这些对象重新映射到下一个节点上。增加节点的时候同理。
在映射量不是很大的时候,可能造成不平衡,这里可以引入虚拟节点来对对象进行二次映射,即Object--->virtual node--->real node
有空再附上自己理解的图片。
那么问题来了:
1、如何解决冲突?
2、如果节点的哈希和对象的哈希相等时候怎么处理?
3、如何保证数据迁移的可靠性?
参考资料:
每天进步一点点——五分钟理解一致性哈希算法(consistent hashing) http://blog.csdn.net/cywosp/article/details/23397179
一致性哈希算法(Consistent Hashing)http://blog.csdn.net/x15594/article/details/6270242