此时必然造成大量数据集中到Server 1上,而只有极少量会定位到Server
2上。为了解决这种数据倾斜问题,一致性哈希算法引入了虚拟节点机制,即对每一个服务节点计算多个哈希,每个计算结果位置都放置一个此服务节点,称为虚拟节点。具体做法可以在服务器ip或主机名的后面增加编号来实现。例如上面的情况,我们决定为每台服务器计算三个虚拟节点,于是可以分别计算“Memcached
Server 1#1”、“Memcached Server 1#2”、“Memcached Server
1#3”、“Memcached Server 2#1”、“Memcached Server 2#2”、“Memcached
Server 2#3”的哈希值,于是形成六个虚拟节点:
同时数据定位算法不变,只是多了一步虚拟节点到实际节点的映射,例如定位到“Memcached Server
1#1”、“Memcached Server 1#2”、“Memcached Server
1#3”三个虚拟节点的数据均定位到Server
1上。这样就解决了服务节点少时数据倾斜的问题。在实际应用中,通常将虚拟节点数设置为32甚至更大,因此即使很少的服务节点也能做到相对均匀的数据分布。