美文网首页already一致性
【一致性哈希】一致性哈希算法,分布式横向扩容

【一致性哈希】一致性哈希算法,分布式横向扩容

作者: Bogon | 来源:发表于2022-06-01 00:01 被阅读0次

    没有一致性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

    相关文章

      网友评论

        本文标题:【一致性哈希】一致性哈希算法,分布式横向扩容

        本文链接:https://www.haomeiwen.com/subject/jykgprtx.html