一致性 Hash 超通俗讲解
一、普通哈希分配 KV 有什么致命问题
假设我们有 3 台服务器,用来存大量 KV 数据:节点 A、节点 B、节点 C 常规分配规则公式:节点下标 = hash(Key) % 总机器数 N
举例: N=3,某个 Key 算出来哈希取模是 0 → 存 A;模 1 存 B;模 2 存 C。
痛点:增减一台机器,几乎所有数据都要搬家
如果再加一台节点 D,总机器数 N=4 原来所有 Key 取模结果全部变了,绝大多数 Key 匹配的服务器全部错乱,需要大规模迁移数据,系统卡顿、压力巨大。 一致性 Hash 就是专门解决扩容 / 缩容时数据迁移量太大的算法。
二、一致性 Hash 核心结构:哈希环
- 设定一个固定哈希取值范围:
0 ~ 2³²−1,把首尾连起来,形成一个环形哈希空间。 - 第一步:把所有真实服务器节点,各自算出哈希值,摆到圆环对应的位置上。
- 存放 / 查询某个 Key 的规则: ① 计算这个 Key 的哈希值,定位到环上一个点; ② 沿着圆环顺时针往前走,遇到的第一个服务器节点,就是这个 Key 的存放节点。
简单举例
环上顺时针排布节点:A → B → C
- Key 哈希落在 A~B 区间:顺时针找到 B,数据存在 B
- Key 哈希落在 B~C 区间:顺时针找到 C,数据存在 C
- Key 哈希落在 C~A 区间:顺时针找到 A,数据存在 A
三、增减节点优势(核心优点)
1、新增节点
只影响新增节点逆时针相邻区间里的一部分 Key,只有这一小部分数据需要迁移,绝大部分 KV 数据不用动。
2、某个节点宕机下线
下线节点对应的所有 Key,会顺延顺时针找下一个节点承接,同样只有局部数据迁移,不会全局洗牌。
对比普通取模哈希:普通哈希改总数 = 全量数据搬迁;一致性哈希只有少量数据搬迁。
四、一致性 Hash 天生缺陷:数据倾斜
如果节点在哈希环上分布不均匀,有的节点占据圆环很大一段区间,存海量数据;有的节点区间很小,数据很少,负载严重不均衡。
解决方案:虚拟节点
给每一台真实物理节点,虚拟出成百上千个虚拟节点,计算哈希打散均匀散布在整个环上。 寻址逻辑不变:Key 找到虚拟节点后,再映射回对应的真实机器。 好处:
- 数据在多台机器分布更均匀,负载均衡;
- 某台机器下线,数据会分摊给多个后继节点,不会瞬间压垮单台服务器。
极简总结
- 一致性 Hash 构建 0~2³² 环形哈希空间,节点与 Key 映射到环上,Key 顺时针匹配首个节点完成存储分配;
- 增减节点仅少量数据迁移,解决普通哈希扩容大规模数据搬迁问题;
- 引入虚拟节点解决数据倾斜、节点负载不均问题;
- 作用是 KV 数据分片路由,和 Raft 多副本一致性属于不同层面的分布式方案
