为了解决分布不均匀的情况,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所示:

    34D3C0AB84F5E646FC2AD9CB77D52079.jpg4AF528BAE724F52CE8B0BB8C98D1B951.jpg
    F33CBBDAD03C20C7AFF655E4488EA146.jpg
    “虚拟节点”的hash计算可以采用对应节点IP地址加上数字后缀的方式。例如:假设cacheA的IP地址为202.168.14.241
    引入“虚拟节点”前,计算cacheA的hash值:

    1. Hash("202.168.14.214")
    1. 引入“虚拟节点”后,分别计算“虚拟节点”cacheA1cacheA2hash值:
    1. Hash("202.168.14.214#1")
    2. Hash("202.168.14.214#2")