一致性哈希算法

一致性哈希是一种常永于负载均衡的分布式算法。首先我们看一个案例:

1、我们有3台服务器S0、S1、S2.

2、与此同时我们还有10万张图片需要均匀的缓存在这三台服务器上

如何实现将图片均匀的缓存在三台服务器上来减轻缓存的压力

一、传统哈希算法

  1. 首先对图片名称进行哈希计算得到哈希值
  2. 用这个哈希值对机器数取模算出该放在哪一个服务器上

假设对图片名称进行哈希计算得到的数值为6,此时服务器数为3,6 % 3 == 0,那么就应该将这张图片缓存在S0服务器上。

因为对同一张图片进行相同的哈希计算值是不变的,同理,对图片进行哈希计算再对机器数取模即可得知该图片在哪一个服务器上

缺陷:

      假设将服务器数提升到了四台,那么此时再用哈希值对服务器数取模,以上述图片为例:6 % 4 = 2,此时在S2服务器上肯定找不到该图片。这里由于服务器数量发生变化,导致不能正常访问缓存数据。如果无法正常找到图片就去后端服务器请求,由于大量缓存在同一时间失效,就会导致大量请求转移到后端服务器,导致后端服务器崩溃。

二、一致性哈希算法

原理:

  1. 假设有一个周长为2^32的圆,圆上有2^32个点,称这个圆为哈希环
  2. 我们用服务器的编号对2^32次方取模,得到的值一定是一个0 ~2^32次方的值
  3. 我们将对服务器编号取模得到的值对应到哈希环上,表示服务器的位置
  4. 对图片进行哈希计算之后也对2^32取模,得到的值肯定也可以对应到哈希环上,然后顺时针找最近的服务器进行缓存即可

      这样假设增加一个服务器,只会有一小部分的数据出现访问错误,大多数数据是可以正常访问的。这样即使某个服务器出现问题,也不会导致整个系统缓存崩溃。

但此时 还有一个问题就是:哈希偏斜

哈希偏斜:对于上述算法,我们理想的认为三台服务器均匀的分配在哈希环上,但是实际上三台服务器很“偏斜”的分布在一块的,此时会导致大量的照片缓存在一个服务器上,并不能解决负载均衡的问题

      对此,可以增加虚拟结点的概念。比如我们可以将服务器A虚拟为A1、A2......An个结点,将这些点也对应在哈希环上,这样虚拟的点越多,就相当于在哈希环上的服务器越多,就可以做到逻辑上使服务器均匀的分布在哈希环上。

      当访问服务器的时候,首先可能会哈希计算再取模可能到一个虚拟的服务器结点,比如通过计算得到了A2,那么A2是服务器是A虚拟的结点,此时去A服务器上去缓存照片即可。

通过虚拟结点即可解决哈希偏斜的问题。

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值