一致性hash算法

应用场景

一致性hash算法在1997年由麻省理工学院在解决分布式Cache中提出的,设计目标是为了解决因特网中的热点(Hot spot)问题。在分布式系统中也得到了广泛应用。

hash取余

hash(object)%N

假设,我们有一个redis集群用来存储图片资源,图片的名称是不一样的,当我们对同一个图片名称做相同的哈希计算时,得出的结果是不变的,如果我们有3台服务器,使用哈希后的结果对3求余,那么余数一定是0、1或2。
如果求余的结果为0, 我们就把这个图片缓存在0号服务器上;如果余数为1,就缓存在1号服务器上;如果余数为2,就缓存在2号服务器上。那么,当我们访问任意一个图片的时候,只要再次对图片名称进行上述运算,即可得出对应的图片应该存放在哪一台缓存服务器上,我们只要在这一台服务器上查找图片即可,如果图片在对应的服务器上不存在,则证明对应的图片没有被缓存,也不用再去遍历其他缓存服务器了。

问题:
但是,使用上述HASH算法进行缓存时,在服务器数量变动的时候,会出现一些问题,所有缓存的位置都要发生改变!
如果3台缓存服务器已经不能满足我们的缓存需求,假设,我们增加了一台缓存服务器,那么缓存服务器的数量就由3台变成了4台,此时,如果仍然使用上述方法对同一张图片进行缓存,那么这张图片所在的服务器编号必定与原来3台服务器时所在的服务器编号不同,因为除数由3变为了4,被除数不变,余数就会不同,这种情况带来的结果就是当服务器数量变动时,所有缓存的位置都发生了改变,也就是说,当服务器数量改变时,缓存在一定时间内是失效的,当应用无法从缓存中获取数据时,则会向后端服务器请求数据,由于大量缓存在同一时间失效,造成了缓存的雪崩,此时前端缓存已经无法起到承担部分压力的作用,后端服务器将会承受巨大的压力,整个系统很有可能会崩溃。

一致性hash

一致性Hash算法将整个哈希值空间组织成一个0~2^32-1无符号整数的虚拟圆环,圆环按顺时间方向组织。
1、将各个服务器IP使用Hash函数计算散列到hash环上。
在这里插入图片描述
2、将key使用Hash函数计算散列到hash环上。
在这里插入图片描述
key在hash环上映射的位置顺时针方向寻找遇到最近的一个node就是其定位到的服务器。由此可见,key1数据落在node1上,key2、key3、key4数据落在node2上。
3、服务器伸缩扩展及容错性
在这里插入图片描述
假如node1节点宕机了,只是对key1的数据有影响,其它数据不受影响,key1数据会被重新定位到node2节点。
4、数据倾斜
我们可以看到,大部分数据落到了node2节点,node3节点没有数据,在一定程度上造成了数据倾斜问题。为了解决这种数据倾斜问题,一致性Hash算法引入了虚拟节点机制,即对每一个服务节点计算多个哈希,每个计算结果位置都放置一个此服务节点,称为虚拟节点。企图更加均匀的散列在hash环上。jedis中完成了虚拟节点的实现。
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值