微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

分布式系统 —— 一致性哈希算法

文章目录

引出

一致性哈希算法(Consistent Hashing Algorithm)是一种分布式算法,常用于负载均衡

随着业务的扩展,流量的剧增,单体项目逐渐划分为分布式系统。对于经常使用的数据,我们可以使用Redis作为缓存机制,减少数据层的压力。因此,重构后的系统架构如下图所示:

在这里插入图片描述

优化最简单的策略就是,把常用的数据保存到Redis中,为了实现高可用使用了3台Redis。每次Redis请求会随机发送到其中一台,但是这种策略会引发如下两个问题:

  1. 同一份数据可能在多个Redis数据库,造成数据冗余
  2. 某一份数据在其中一台Redis数据库已存在,但是再次访问Redis数据库,并没有命中数据已存在的库而是命中了其他数据库

解决上述问题我们可以使用普通哈希算法
普通哈希算法,我们把一个数据,进行哈希算法得到哈希值,然后对服务器数取模。然后将该数均匀存储到相应的数据库服务器中。
我们需要稍稍改变一些key存入Redis的规则:使用hash算法
例如,有三台Redis,对于每次的访问都可以通过计算hash来求得hash值。
如公式 h=hash(key)%3,我们把Redis编号设置成0,1,2来保存对应hash计算出来的值,h的值等于Redis对应的编号。

但是该算法存在一个缺陷,就是如果我们增加或者删除了服务器数量,那么我们取数的时候,很多原有的数据就无法找到了。也就是说扩展性出现了问题,这样就不能够取到正确的数。为了解决该问题,我们使用一致性哈希算法。

一致性哈希步骤

  1. 形成环空间,将0~(2^32)-1 对应的数围成一个环,形成闭环。然后将服务器的ip得知的哈希值和(232)取模,将该服务器放入环中。然后将数据的进行hash值并对(232)取模,放入环中,顺时针找到离他最近的一个服务器,将数据放入该服务器。

    在这里插入图片描述

  2. 优点:如果使用之前的hash算法,服务器数量发生改变时,所有服务器的所有缓存在同一时间失效了,而使用一致性哈希算法时,服务器的数量如果发生改变,并不是所有缓存都会失效,而是只有部分缓存会失效。

    在这里插入图片描述

  3. hash环偏移:如果服务器被映射成下图中的模样,那么被缓存的对象很有可能大部分集中缓存在某一台服务器上。这样还是会对单个服务器造成叫答应较大影响

在这里插入图片描述

4. 使用虚拟节点解决。我们将ABC服务器复制出虚拟节点,让他们分布更均匀一些,这样就能够更均匀的让数据分配到各个服务器中。还可以虚拟出更多节点,然后将虚拟节点映射到实际服务器。

在这里插入图片描述

参考资料

https://www.zsythink.net/archives/1182
https://blog.csdn.net/cywosp/article/details/23397179
https://juejin.cn/post/6844903750860013576

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐