没有一致性hash算法之前,我们确定存放数据的节点,主要是通过对存放数据key进行hash,得到一个数值,然后对节点数量进行取模,根据得到的余数,确定数据存放位置。
那你可能要说了:
如果新增数据节点,那么需要对所有的数据key进行一次hash运算,然后对新的总数进行取余,来确定每个数据的新的位置,这可以能涉及所有数据存储位置的变动,对业务影响巨大!
有没有一种方法尽可能减少这种key变动?
那就是一致性hash算法。
它的一个主要思路是我们先假设将所有的数据分为2^32,将所有的这些数连起来构成一个环,其中0 和 2^32 首尾相连。
对这个环上节点的一个唯一性标志(如ip或nodeId),做hash运算,使得它的结果分布在环中某个位置。
当我们存放key或者获取key时,首先对这个key进行hash运算,对运算值做2^32取模,使得它的结果分布在环中某个位置,然后顺时针查找距它最近的节点。
当你新 增数/减少 数据节点时,只需要变动少部分数据。
理解算法的思想胜于算法的实现
一致性哈希作为一种非常经典的算法思想,被广泛的用于各大分布式项目当中,用于解决各种分片问题,任务分发问题。
在这里要纠正一个认识,很多人都在网上说 redis 使用了一致性哈希。这是错的,redis 只是使用了一致性哈希的思想。比如一致性哈希中的环分布,再比如虚拟节点对应真实节点的思想。但是 redis 并没有使用任何哈希算法去计算分布,如果有兴趣的读者,可以仔细去看下有关内容。
对 redis cluster 来说, crc16(key) / 16384 = slot位置,slot在哪,数据就在哪个节点,没有一致性哈希中 顺时针找数据节点的说法。
从 redis 的例子上来说,我们可以看到,只有理解了算法的思想,我们才能更容易更灵活地因地制宜的分解、修正、改进算法,让算法能更切合实际的融入到我们的项目之中。
参考
一文读懂哈希和一致性哈希算法
https://mp.weixin.qq.com/s/C5w8qt22sqrHQpWg9xNGHw
面试官问:一致性哈希算法是什么?怎么判定哈希算法的好坏?
https://mp.weixin.qq.com/s/CA9a4EQ1xKHZm6cExYnr1Q
图解一致性哈希算法,看这文就够了
https://mp.weixin.qq.com/s/l8m7oAVzBO1Bul7_bv_3Jg
如何优雅扩缩容,一致性哈希算法
https://mp.weixin.qq.com/s/iVLtOuBvwFULAYA7FYFREQ
redis哈希槽的作用
https://www.cnblogs.com/lishanbiaosMark/p/16012034.html
深入理解redis cluster原理
https://zhuanlan.zhihu.com/p/411081357