文章目录
引出
一致性哈希算法(Consistent Hashing Algorithm)是一种分布式算法,常用于负载均衡。
随着业务的扩展,流量的剧增,单体项目逐渐划分为分布式系统。对于经常使用的数据,我们可以使用Redis作为缓存机制,减少数据层的压力。因此,重构后的系统架构如下图所示:
解决上述问题我们可以使用普通哈希算法:
普通哈希算法,我们把一个数据,进行哈希算法得到哈希值,然后对服务器数取模。然后将该数均匀存储到相应的数据库服务器中。
我们需要稍稍改变一些key存入Redis的规则:使用hash算法
例如,有三台Redis,对于每次的访问都可以通过计算hash来求得hash值。
如公式 h=hash(key)%3,我们把Redis编号设置成0,1,2来保存对应hash计算出来的值,h的值等于Redis对应的编号。
但是该算法存在一个缺陷,就是如果我们增加或者删除了服务器数量,那么我们取数的时候,很多原有的数据就无法找到了。也就是说扩展性出现了问题,这样就不能够取到正确的数。为了解决该问题,我们使用一致性哈希算法。
一致性哈希步骤
-
形成环空间,将0~(2^32)-1 对应的数围成一个环,形成闭环。然后将服务器的ip得知的哈希值和(232)取模,将该服务器放入环中。然后将数据的进行hash值并对(232)取模,放入环中,顺时针找到离他最近的一个服务器,将数据放入该服务器。
-
优点:如果使用之前的hash算法,服务器数量发生改变时,所有服务器的所有缓存在同一时间失效了,而使用一致性哈希算法时,服务器的数量如果发生改变,并不是所有缓存都会失效,而是只有部分缓存会失效。
-
hash环偏移:如果服务器被映射成下图中的模样,那么被缓存的对象很有可能大部分集中缓存在某一台服务器上。这样还是会对单个服务器造成叫答应较大影响
参考资料
https://www.zsythink.net/archives/1182
https://blog.csdn.net/cywosp/article/details/23397179
https://juejin.cn/post/6844903750860013576
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。