一致性哈希算法

本文为参考 朱双印 大佬博客内容的整理,有兴趣的同学可以点击下方链接,查看原文。

参考连接:白话解析:一致性哈希算法 consistent hashing


场景描述

假设有N台缓存服务器,在分布式情况下,要将资源均匀的缓存到这3台服务器上,可以使用下面的算法定位需要操作资源的位置:

hash(资源ID)% N

但是,当缓存服务器数量发生变化时,可能出现以下问题

  1. 会引起缓存的雪崩,可能会引起整体系统压力过大而崩溃(大量缓存同一时间失效)。
  2. 几乎所有缓存的位置都会发生改变,怎样才能尽量减少受影响的缓存呢?

一致性哈希算法的基本概念

一致性哈希算法是对2^32取模,将这些哈希槽顺时针排列,想象为一个 hash 环。
hash环
这里我们将 3 台服务器的IP通过此算法进行取模(hash(服务器的IP地址) % 2^32),并映射到这个环上。后续的资源也通过此算法哈希自己的 ID 并定位到环上。资源在环上顺时针找到的第一台服务器就是它存储的服务器(如:2、1 存放在 A 服务器)。
3台服务器与4个资源定位在hash环上

一致性哈希算法的优点

假设,服务器B 出现了故障,我们现在需要将服务器B移除,那么,我们将上图中的服务器B 从 hash 环上移除即可。此时客户端取资源 3 的缓存将到服务器C 中获取,资源3的缓存后续也存在服务器C 中。
服务器B宕机

如果使用之前的hash算法,服务器数量发生改变时,所有服务器的所有缓存在同一时间失效了,将引起缓存雪崩。

而使用一致性哈希算法时,服务器的数量如果发生改变,并不是所有缓存都会失效,而是只有部分缓存会失效,前端的缓存仍然能分担整个系统的压力,而不至于所有压力都在同一时间集中到后端服务器上。

hash环的偏斜

hash环的偏斜的概念

在实际的映射中,服务器可能会被映射成如下模样。A、B、C 三台服务器并没有被合理的平均的充分利用,缓存分布的极度不均匀,而且,如果此时服务器A出现故障,那么失效缓存的数量也将达到最大值,在极端情况下,仍然有可能引起系统的崩溃,下图中的情况则被称之为 hash环的偏斜
hash环的偏斜

hash环的偏斜的解决方式:虚拟节点

将现有的物理节点通过虚拟的方法复制出来,这些由实际节点虚拟复制而来的节点被称为”虚拟节点”。
各复制一台虚拟节点
引入虚拟节点的概念后,缓存的分布就均衡多了,如果你还不放心,可以虚拟出更多的虚拟节点,以便减小hash环偏斜所带来的影响,虚拟节点越多,hash环上的节点就越多,缓存被均匀分布的概率就越大。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值