一致性哈希算法

一致性哈希(Consistent Hashing)是一种特殊的哈希算法,主要用于解决分布式系统中的数据分区问题。它的核心思想是:当分布式集群中的服务器节点发生变化(增加或删除)时,能够尽可能少地改变已存在的服务请求与处理请求服务器之间的映射关系。

为什么需要一致性哈希?

在传统映射算法中,最简单的是求余映射。比如有 100 个 ip 要映射到 3 个 机器上,通过 hash(ip)% 3 计算出映射关系。机器数量是会经常变动的,比如 3 台机器增加到了 4 台,需要重写计算映射关系,重新映射后,会导致大量原来的映射关系发生变动。这在业务上通常是不能接受的,特别是对于如今分布式系统,容器化部署的时代。

一致性哈希算法就是为了解决这个大量映射关系变化的问题。说实话,互联网行业是真的擅长取名字造概念,这个名字取的高大上,实际上原理真的很简单。如果是我,直接给他取个环形哈希算法,多简单直接。

工作原理

  1. 哈希环: 将整个哈希值空间映射成一个虚拟的圆环,整个哈希空间的取值范围为0~2^32-1。

  1. 节点映射: 计算每个服务器节点的哈希值,并映射到哈希环上。比如 3个机器哈希后落在如下位置。

  1. 数据映射: 计算数据的哈希值,并映射到哈希环上。比如 ip 经过映射后落在哈希环的以下位置

  1. 寻找节点: 从数据所在的哈希值位置开始顺时针查找,找到的第一个服务器节点就是该数据的归属节点。

扩容

当扩容增加节点时,先将节点映射到哈希环上。该节点和其上一个相邻节点之间的数据就重新归属于新增节点了。其他数据不会发生改变。
缩容也是一样的我就不画图了。

通过以上分析,可以看到,一致性哈希算法可以保证在节点变化时,只有部分数据需要重新映射,从而减少数据迁移的开销。

数据倾斜

在某些极端情况下,可能出现数据倾斜的问题。比如下图这种,大量数据都映射到了 node_1 上,造成部分机器压力过大,部分机器又空闲浪费资源的情况。

如何解决数据倾斜问题呢?

观察分析原因,发现倾斜的本质是因为节点和数据之间映射不均匀造成的。只要使他们分布均匀即可解决。

为了解决一致性哈希算法可能导致数据分布不均匀的问题,引入了虚拟节点的概念。虚拟节点是逻辑上的节点,一个物理节点可以对应多个虚拟节点。通过增加虚拟节点的数量,可以提高数据的分布均匀性。

总结

一致性哈希算法是一种非常优秀的分布式哈希算法,在分布式系统中得到了广泛的应用。它解决了传统哈希算法在动态环境中难以适应的问题,保证了数据分布的均衡性和系统的稳定性。

互联网世界发生了数据倾斜,可以通过二次分配的方式使得数据分配均匀。现实世界资源分配不均的问题,从人类发展至今依旧无法解决,反而愈发严重。如果上帝存在大概不会允许这种情况发生的吧,除非上帝才是获取资源最大的那个。

SystemCaller
SystemCaller

https://gravatar.com/noisily745e35dad0

文章: 47

留下评论

您的邮箱地址不会被公开。 必填项已用 * 标注