大家好,这里是程序员阿亮,今天来讲解一下一种很热门的哈希算法—一致性哈希
前言
在分布式系统中,数据分布和负载均衡是核心问题。传统哈希算法在节点动态变化时会导致大量数据迁移,而一致性哈希正是为了解决这个问题而诞生的。
正如MySQL做分片,我们是使用hash+模运算去实现的,那么当我们的分片集群增减节点的时候,就会因为数据的重新mod运算导致大量的数据迁移。
为了解决这个问题,就有了一致性hash算法。
一、一致性哈希算法是什么?
继续来讲一下引言中的例子–MySQL增减节点的结果
假设我们有3个节点,使用简单的哈希取模:
int nodeIndex = hash(key) % 3;
当节点数量从3变为4时,几乎所有数据都需要重新分配,这在生产环境中是灾难性的。
一致性哈希将整个哈希值空间组织成一个虚拟的圆环(哈希环),范围通常是0到2^32-1。
核心步骤:
到这里肯定很难理解,那么接下来继续跟着我走
二、详细流程
1.构造哈希环
首先,我们将会构造一个哈希环,这个哈希环有固定个节点数量,比如说本例子的2^32个节点

2.表映射节点
我们将128个表先映射到哈希环上
通过hash运算加mod,也就是
hash(table_0000)mod2^32….

3.数据映射
用相同的hash算法对数据进行计算并取mod
hash(id)%2^32
就这样把所有的数据映射到环上

这样这些数据就映射到了环上
4.选点存储
对于每个映射到环上的数据,选顺时针最近或者逆时针的表节点存储

那么就这样,只要表数量不变,每个数据只要计算一次就能知道在哪个分库的表中了,在分库分表的场景中。
5.增减表节点
当我们的表节点减少的时候,我们就把那个表节点从环上取出,那么这样,实际上迁移的数据也并不多
或者增加节点的话,实际迁移的数据也不会很多

通过这种算法,可以显著减少数据的迁移量。
总结
那么总结一下这个算法。一致性hash实际上就是通过讲表和数据都映射到我们的哈希环上,让数据选择最近的一个表节点存储数据的一种算法,这种算法可以在增减表节点的时候显著减少数据迁移量,提高效率。
优点:
- 最小化数据迁移:节点变化时,只影响相邻节点的数据
- 负载均衡:通过虚拟节点实现较好的数据分布
- 扩展性好:支持动态添加和删除节点
缺点:
- 实现复杂度:比简单哈希算法复杂
- 热点问题:某些节点可能负载过高
- 查询效率:需要二分查找,时间复杂度O(log n)
哈希倾斜
如果我们的数据过于集中,导致我们某些表数据量很大,导致我们在迁移数据的时候成本过高,那么这个时候可以通过增加节点或者将一个节点映射成多个虚拟节点解决问题。


