一、哈希Hash算法好坏的标准
1.1 平衡性
哈希的结果能够分布到所有的节点上。
1.2 单调性
如果内容已经哈希分布到某个节点上,又有新的节点加入到系统,原来的内容应该哈希到原有节点或新的节点上,而不应该哈希到原有的其他节点上。
普通哈希Hash一般都能满足平衡性,一致性哈希Hash可以满足平衡性和单调性。
二、一致性哈希Hash
2.1 原理
1. 环形Hash桶空间
按照常用的Hash算法将key哈希到2^32个桶空间,即0~2^32-1数字空间。
将这些数字首尾相连形成一个闭合的环形。
2. 将内容通过Hash算法映射到环上
假设内容为object1、object2、object3、object4
Hash(object1) = key1
Hash(object2) = key2
Hash(object3) = key3
Hash(object4) = key4
3. 将机器通过Hash算法映射到环上
假设机器为node1、node2、node3
Hash(node1) = KEY1
Hash(node2) = KEY2
Hash(node3) = KEY3
按顺时针方向将object放到距离最近的node上
2.2 单调性分析
添加机器时:
将相应的object从原来的node上删除,放到新的node上。
删除机器时:
将删除机器上的object,放到最近的node上即可。
2.3 平衡性分析
上述实现,满足了单调性,不能满足平衡性,删除node时可能会导致部分node上有过多的object。
为了实现平行性,引入了“虚拟节点”,即每个节点(node)有若干个复制节点(虚拟节点),然后将所有的复制节点作为新的节点进行Hash。
参考资料:
五分钟理解一致性哈希(consistent hashing):http://blog.csdn.net/cywosp/article/details/23397179