一致性哈希(Consistent Hashing)
传统来讲,数据的存储位置是通过hash(object)%N来计算的,这样造成的问题是如果新的机器添加进来或是某台机器down掉了,通过这种算法计算出来的存储位置会和以前的不同,造成了大量数据的迁移,如果有新的机器添加进来也会造成同样的问题,所以容错性和扩展性都不好。一致性哈希算法的主要目的是尽量减少数据的迁移。
一致性哈希假设有一个闭合圆环空间,上面有2**31个位置,数据通过特定的hash算法被分布到哈希圆环上。机器也通过特定的hash算法(输入值为机器的IP或是机器唯一的别名)放到圆环上,然后沿顺时针方向把数据(object)存储到离它最近的机器上。假设某一机器down掉了,就把原先存储在这台机器上的数据沿顺时针方向存储到最近的其他机器上。假设有新的机器添加进来,如果有数据离它的距离比原先存放的位置更近,则存放的新的机器上,这样大大减少了数据迁移的次数。
一致性哈希通过引入虚拟node解决了hotspot问题。Hotspot的出现是因为数据的分配不均匀,比如大量数据存放在某一节点上,其他节点的利用率很低。那么如何生成虚拟节点呢?假如node1要生成属于node1的三个虚拟node, 具体实现如下:
hash(node1's ip#1) -> node1-1
hash(node1's ip#2) -> node1-2
hash(node1's ip#3) -> node1-3
这个思路非常像Network Mobile Systems课上的virtual layer 2,思路是通过abstraction来增加分散性。然后将虚拟节点映射到实际节点上来实现查询。
Reference:
http://blog.csdn.net/cywosp/article/details/23397179/