redis分布式一致性hash算法

        当我们在部署redis节点时,用户链接redis存储数据会通过hash算法来定位具体链接那个redis节点,在redis节点数量没有改变的前提下,之前的用户通过hash算法会固定的链接某一台redis节点,但是若此时我们增加了redis节点,用户再次hash时,能会hash到别的redis机器上,导致用户在redis节点上读取不到对应的数据,这就是redis命中的问题。

redis一致性hash算法:

将用户和redis节点的hash值对应到一个32位的环形数据结构上,环形结构首尾封闭,用户通过hash算法来定位在环形结构上,redis节点也通过hash算法来定位到环形结构上,此时的命中问题就变成了,用户节点通过顺时针旋转,在旋转的过程中若碰到redis节点,就在该节点上读取数据,若此时在环形结构上增加新的redis节点,由于是顺时针寻找对应的redis节点,所以用户此时的redis命中率还是很高的,不会因为增加了一台redis节点就导致大量的用户命中失败的情况出现。

hash倾斜:

上述情况是发生在redis节点均匀分布在环形结构上的情况下,但是若redis节点分布密集,并且集中在环形结构上一侧,那么就会出现,大量的用户节点请求同一台redis服务器,而其余redis服务器处于低请求的情况,若此时再加入一个redis节点,那么同样会导致命中率失败变高。这种情况叫做    hash倾斜。

hash倾斜的解决办法:

增加虚拟节点,假如有1 ,2两台redis节点分布在32位环形结构上,那么我们可以增加大量的虚拟的 1, 2节点在环形结构上。用户命中到虚拟节点之后,在hash到真实的redis机器上。

虽然增加虚拟节点可以解决此问题,但是依然存在hash倾斜的问题,但是随着虚拟节点的大量增加,就会使得出现hash命中失败的现象降到最低。一致性hash算法公式:1-n/(n + m) * 100%   n表示真实的redis节点,m表示增加的虚拟节点,可以看到随着虚拟节点的增加,命中失败越来越低。

猜你喜欢

转载自blog.csdn.net/qq_32182461/article/details/81737556