一致性哈希算法:分布式系统中的关键技术

定义

一致性hash算法本质上也是一种取模算法。不过,不同于传统的 hash 算法按服务器的数量取模,一致性hash是对固定值2^32取模。

原理

哈希环的构建

一致性哈希算法首先将整个哈希值空间(通常是一个很大的整数范围,比如 0 到 2^32 - 1)想象成一个环形结构,这个环被称为哈希环。

我们可以通过对节点(如服务器)的标识或名称进行哈希计算,将节点映射到哈希环上的某个位置。

例如,我们有三个节点 A、B、C,分别计算它们的哈希值,然后将它们映射到对应的哈希环上的位置。

在这里插入图片描述

数据的映射

当有数据需要存储或访问时,同样对数据进行哈希计算,得到其哈希值h(data)进行映射。然后在哈希环上沿着顺时针方向查找,找到第一个遇到的节点,就将该数据存储在这个节点上。例如,数据data1经过哈希值h(data1)映射后位于哈希环上节点 A 和节点 B 之间,那么data1就会被存储在节点 B 上。
在这里插入图片描述

比如,现在有 3 个数据 data1、data2、data3,经过哈希函数计算后,它们与服务器的映射关系如下

在这里插入图片描述

服务器扩容

假如现在需要增加一台节点 D,经过哈希计算后,该节点 D 在哈希环上的位置在节点 A 和节点 B 之间。

在这里插入图片描述
此时,只有节点 A 和节点 B 之间的数据需要重新分配,data1 被重新分配到节点 D,其他区间数据则不受影响。

服务器缩容

假如此时节点 C 下线,则存储在节点 C 上的数据,则需要重新分配到节点 A 上,其他数据不变。

可以看出来,受影响的只有节点 A 和 节点 C 之间的部分数据。

在这里插入图片描述

虚拟节点

在上面的例子中,为了方便理解,服务器几乎是被均匀分配到了哈希环上的。

但是在实际场景中很难选取到一个Hash函数能这么完美的将各个服务器散列到Hash环上。

此时,在服务器节点数量太少的情况下,很容易因为节点分布不均匀而造成数据倾斜问题。

比如,下图中的 3 个节点都被映射到了哈希环的右半边,就会导致数据都被存储在节点 A 上,而且在节点分布不均匀时,服务器的扩容和缩容,容易发生雪崩式的连锁反应。

如果节点 A 被移除了,根据一致性哈希算法规则,节点 A 的数据全部都要迁移到节点 B 上,如果节点 B 的处理能力有限,则就会导致节点 B 的崩溃。
在这里插入图片描述

为了解决节点在哈希环上分布不均匀的问题,一致性哈希算法引入了虚拟节点的概念。

一个实际的节点可以对应多个虚拟节点,这些虚拟节点均匀地分布在哈希环上。例如,节点 A 可以对应虚拟节点A1、A2、A3等。当计算数据的存储位置时,是先找到对应的虚拟节点,再映射到实际节点上。这样可以使得数据在节点上的分布更加均匀,提高系统的负载均衡性。

假设物理节点与虚拟节点的关系如下:

  • nodeA:nodeA-1、nodeA-2
  • nodeB:nodeB-1、nodeB-2
  • nodeC:nodeC-1、nodeC-2

在这里插入图片描述
数据与虚拟节点、虚拟节点与物理节点映射关系如下:
在这里插入图片描述
另外,当某个物理节点移除时,其对应的虚拟节点也将被移除,而这些被移除的虚拟节点按顺时针方向的下一个虚拟节点,可能会对应着不同的物理节点,这些不同的物理节点共同承担着节点变化导致的压力。

有了虚拟节点后,还可以为硬件配置更好的物理节点增加权重,为权重更高的节点配置更多的虚拟节点。

特点

扩展性

当系统中需要添加新的节点时,只会影响到哈希环上相邻的节点。

例如,在哈希环上添加一个新节点 D,只有原本存储在节点 C 到节点 D 之间的数据(按照顺时针方向)会受到影响,需要重新映射到新节点 D 上,而其他大部分数据的存储位置并不需要改变。这种特性使得系统在扩展时能够减少数据的迁移量,降低对系统性能的影响。

均衡性

通过虚拟节点的引入,一致性哈希算法能够有效地改善数据在节点上的分布均衡性。即使节点的实际数量较少,虚拟节点也能让数据在哈希环上看起来更加均匀地分布,从而避免某些节点负载过高,而其他节点负载过低的情况,提高了系统的整体性能和稳定性。

容错性

当系统中的某个节点出现故障时,同样只会影响到哈希环上相邻的节点。

例如,节点 B 发生故障,那么原本存储在节点 B 上的数据需要重新分配到节点 C 上(按照顺时针方向找到的下一个节点)。其他未受影响的节点上的数据仍然可以正常访问,系统的整体可用性得到了保障。这种容错性使得分布式系统在面对节点故障时能够更加稳健地运行。

应用场景

分布式缓存系统

在分布式缓存系统中,一致性哈希算法被广泛应用于数据的分布和缓存节点的管理。

例如,Redis 集群等分布式缓存架构就采用了一致性哈希算法。通过将数据均匀地分布在各个缓存节点上,可以提高缓存的命中率,减少数据访问的延迟。当缓存节点发生变化(如新增或删除节点)时,一致性哈希算法能够最小化数据的重新分布,保证缓存系统的高效运行。

分布式存储系统

在分布式存储领域,一致性哈希算法用于将数据存储在不同的存储节点上。它可以确保数据的均匀分布,提高存储系统的读写性能和扩展性。当需要扩展存储容量时,添加新的存储节点不会导致大量数据的迁移,从而降低了系统维护的成本和对业务的影响。同时,在节点故障时,能够快速地将数据重新分配到其他正常节点上,保证数据的可靠性和可用性。

负载均衡

在分布式系统的负载均衡中,一致性哈希算法可以根据后端服务器的负载情况和性能特点,将请求合理地分配到不同的服务器上。通过将服务器映射到哈希环上,根据请求的特征进行哈希计算,然后将请求转发到对应的服务器上。这样可以避免单点故障,提高系统的整体吞吐量和响应速度。例如,在大型网站的后端服务器集群中,一致性哈希算法可以有效地实现负载均衡,提升用户的访问体验。

CDN 内容分发网络

CDN 网络用于将内容快速分发到全球各地的用户。一致性哈希算法在 CDN 中用于将用户的请求分配到离其最近的缓存服务器上。通过对用户的 IP 地址或请求 URL 进行哈希计算,然后在哈希环上找到对应的缓存服务器节点,从而实现内容的快速交付。当 CDN 网络中添加或删除缓存服务器时,一致性哈希算法能够保证用户的请求仍然能够准确地路由到合适的服务器上,减少内容分发的延迟和网络拥塞。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值