你了解一致性哈希算法吗?

1、使用Hash算法好处

假设使用Redis缓存图片资源,key值为图片名称,value为该图片所在文件服务器路径,我们需要根据图片名称查找该文件所在文件服务器上的路径,数据量大概有2000W左右,采用随机分配规则,部署8台缓存服务器,每台服务器大概含有500W条数据,并且进行主从复制。
在这里插入图片描述
实际上,这样也能满足我们的要求,但如果这样做,当我们需要访问某个缓存项时,则需要遍历4台缓存服务器,遍历的过程效率太低,时间太长。我们考虑使用HashMap底层哈希结构,按照Hash值、取模规则来分配,即 hash(图片名称)% N。

如果我们使用Hash的方式,每一张图片在进行分库的时候都可以定位到特定的服务器。
在这里插入图片描述
假设我们查找的是"a.png",由于有4台服务器(排除从库),因此公式为hash(a.png) % 4 = 2 ,可知定位到了第2号服务器,这样的话就不会遍历所有的服务器,大大提升了性能!

2、为什么要有一致性Hash算法?

上述方式虽然提升了性能,我们不再需要对整个Redis服务器进行遍历。但使用上述Hash算法进行缓存时,会出现一些缺陷,主要体现在服务器数量变动的时候,所有缓存的位置都要发生改变。

如果我们增加一台缓存服务器,那么规则由 hash(a.png) % 4 = 2 的公式就变成了hash(a.png)% 5 = ?;减少一台缓存服务器,规则由hash(a.png) % 4 = 2 的公式就变成了hash(a.png)% 3 = ?。这种情况带来的结果就是当服务器数量变动时,所有缓存位置都要发生改变。换句话说,当服务器数量发生改变时,所有缓存在一定时间内是失效的,当应用无法从缓存中获取数据时,则会向后端数据库请求数据,可能会出现缓存雪崩

所以,我们应该想办法不让这种情况发生,但是由于上述Hash算法本身的缘故,使用取模法进行缓存时,这种情况是无法避免的,为了解决这些问题,一致性Hash算法诞生了!

3、什么是一致性Hash算法?

一致性哈希算法主要应用在分布式数据存储系统中,按照一定的策略将数据尽可能均匀分布到所有的存储节点上去,使得系统具有良好的负载均衡性能和扩展性。

一致性Hash算法也是使用取模的方法,只不过刚才描述的取模法是对服务器数量进行取模,而一致性Hash算法是对 2^32 取模。我们把 2^32 想象成一个圆,整个空间按顺时针方向组织,把这个由 2^32 个点组成的圆环称为hash环
在这里插入图片描述

假设将上文中四台服务器使用IP地址哈希,即 hash(服务器A的IP地址) % 2^32,环空间的位置如下:

在这里插入图片描述
到目前为止,我们已经把缓存服务器与hash环联系在了一起。接下来使用如下算法定位数据访问到相应服务器:将数据key使用相同的函数Hash计算出哈希值,并确定此数据在环上的位置,从此位置沿环顺时针"行走",第一台遇到的服务器就是其应该定位到的服务器!

如:我们有Object A、Object B、Object C、Object D四个数据对象,经过哈希计算后,在环空间上的位置如下:
在这里插入图片描述
根据一致性Hash算法,数据A会被定为到Node A上,B被定为到Node B上,C被定为到Node C上,D被定为到Node D上。

4、一致性Hash算法的容错性和可扩展性

假设Node C不幸宕机,可以看到此时对象A、B、D不会受到影响,只有C对象被重定位到Node D。
在这里插入图片描述
假设在系统中增加一台服务器Node X

在这里插入图片描述
此时对象Object A、B、D不受影响,只有对象C需要重定位到新的Node X 。

综上,一致性Hash算法对于节点的增减都只需重定位环空间中的一小部分数据,具有较好的容错性和可扩展性。

5、Hash环的数据倾斜

一致性Hash算法在服务节点太少时,容易因为节点分部不均匀而造成数据倾斜(被缓存的对象大部分集中缓存在某一台服务器上)问题,如:系统中只有3台服务器,被缓存的对象很有可能大部分集中缓存在某一台服务器上,造成数据分配不均匀。
在这里插入图片描述

此时必然造成大量数据集中到Node A上,而只有极少量会定位到Node B上。为了解决这种数据倾斜问题,我们想要均衡的将缓存分布到3台服务器上,最好能让这3台服务器尽量多的、均匀的出现在hash环上,但真实的服务器资源只有3台,我们考虑将现有的物理节点通过虚拟的方法复制出来,一致性Hash算法引入了虚拟节点机制,即对每一个服务节点计算多个哈希,每个计算结果位置都放置一个此服务节点,这些由实际节点虚拟复制而来的节点被称为虚拟节点
在这里插入图片描述
采用虚拟节点机制,解决了服务节点少时数据倾斜的问题,hash环上的节点就越多,缓存被均匀分布的概率就越大。

【参考资料】:
什么是一致性Hash算法?
一致性哈希算法

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值