为了解决分布不均匀的情况,Consistent Hashing引入了“虚拟节点”的概念。
“虚拟节点”(virtual node)是实际节点在hash空间的复制品(replica),一个实际节点对应了若干个“虚拟节点”,对应个数也成为“复制个数”,“虚拟节点”在hash空间中以hash值排列。
仍以部署cacheA和cacheC的情况为例,在图3.17中我们已经看到,cache分布并不均匀。现在我们引入虚拟节点,并设置“复制个数”为2,这就意味着一共会存在4个“虚拟节点”,cacheA1和cacheA2代表了cacheA,cacheC1和cacheC2代表了cacheC。
此时对象到虚拟节点的映射关系为:object1 -> cacheA2 object2 -> cacheA1 object3 -> cacheC1 object4 -> cacheC2 因此平衡性大大提高
引入“虚拟节点”后,映射关系就从{对象 -> 节点}转换到{对象 -> 虚拟节点}。查询对象所在cache时的映射关系如图3.20所示:
“虚拟节点”的hash计算可以采用对应节点IP地址加上数字后缀的方式。例如:假设cacheA的IP地址为202.168.14.241
引入“虚拟节点”前,计算cacheA的hash值:
Hash("202.168.14.214")
引入“虚拟节点”后,分别计算“虚拟节点”cacheA1和cacheA2的hash值:
Hash("202.168.14.214#1")
Hash("202.168.14.214#2")