IT袋

当前位置:主页 > 经验教程 > 建站编程 >

什么是一致性hash算法

什么是一致性hash算法

时间:2023-12-13 13:59:39 来源:IT袋 作者:马勇
导读:什么是一致性hash算法,本文为您带来的是什么是一致性hash算法的教程内容,具体详情如下: 理论 一致性哈希算法是一种常用的分布式算法,其主要用途是在分布式系统中,将数据根据其键(

什么是一致性hash算法

本文为您带来的是什么是一致性hash算法的教程内容,具体详情如下:

理论

一致性哈希算法是一种常用的分布式算法,其主要用途是在分布式系统中,将数据根据其键(key)进行散列(hash),然后将散列结果映射到环上,再根据数据节点的数量,将环划分为多个区间,每个节点负责处理环上一定区间范围内的数据。

普通哈希的问题

分布式集群中,对机器的添加删除,或者机器故障后自动脱离集群这些操作是集群管理最基本的功能。

如果采用常用的hash(object)%N取模的方式,在节点进行添加或者删除后,需要重新进行迁移改变映射关系,否则可能导致原有的数据无法找到。

举个例子

随着业务和流量的增加,假如我们的Redis查询服务节点扩展到了3个,为了将查询请求进行均衡,每次请求都在相同的Redis中,使用hv = hash(key) % 3的方式计算,对每次查询请求都通过hash值计算,得出来0、1 、2的值分别对应服务节点的编号,计算得到的hv的值就去对应的节点处理。

什么是一致性hash算法

但是这里有个问题,服务增减是需要对此时的key进行重新计算,比如减少一个服务的时候,此时需要按 hv = hash(key) % 2计算,而增加一个服务节点的时候需要按hv = hash(key) % 4计算,而这种取模基数的变化会改变大部分原来的映射关系,导致数据查询不到。

什么是一致性hash算法

这个时候只能进行数据迁移,真是太麻烦了,而一致性哈希算法显然是一个更好选择!

一致性hash算法

一致性哈希同样使用了取模的方式,不同的是对 2^32 这个固定的值进行取模运算。

在使用一致哈希算法后,哈希表槽位数(大小)的改变平均只需要对 K/n 个关键字重新映射,其中K是关键字的数量, n是槽位数量,而不需要对所有的映射关系进行重新映射!

Hsh环

我们可以把一致哈希算法是对 2^32 进行取模运算的结果值虚拟成一个圆环,环上的刻度对应一个 0~2^32 – 1 之间的数值,如下图:

什么是一致性hash算法

节点入环

下图我们三个节点(A/B/C)经过哈希计算,放入下面环中,一般我们会根据服务器的IP或者唯一别名进行哈希计算。

相关阅读