一致性 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 核心结构:哈希环

  1. 设定一个固定哈希取值范围:0 ~ 2³²−1,把首尾连起来,形成一个环形哈希空间
  2. 第一步:把所有真实服务器节点,各自算出哈希值,摆到圆环对应的位置上。
  3. 存放 / 查询某个 Key 的规则: ① 计算这个 Key 的哈希值,定位到环上一个点; ② 沿着圆环顺时针往前走,遇到的第一个服务器节点,就是这个 Key 的存放节点。

简单举例

环上顺时针排布节点:A → B → C

  1. Key 哈希落在 A~B 区间:顺时针找到 B,数据存在 B
  2. Key 哈希落在 B~C 区间:顺时针找到 C,数据存在 C
  3. Key 哈希落在 C~A 区间:顺时针找到 A,数据存在 A

三、增减节点优势(核心优点)

1、新增节点

只影响新增节点逆时针相邻区间里的一部分 Key,只有这一小部分数据需要迁移,绝大部分 KV 数据不用动。

2、某个节点宕机下线

下线节点对应的所有 Key,会顺延顺时针找下一个节点承接,同样只有局部数据迁移,不会全局洗牌。

对比普通取模哈希:普通哈希改总数 = 全量数据搬迁;一致性哈希只有少量数据搬迁。

四、一致性 Hash 天生缺陷:数据倾斜

如果节点在哈希环上分布不均匀,有的节点占据圆环很大一段区间,存海量数据;有的节点区间很小,数据很少,负载严重不均衡。

解决方案:虚拟节点

给每一台真实物理节点,虚拟出成百上千个虚拟节点,计算哈希打散均匀散布在整个环上。 寻址逻辑不变:Key 找到虚拟节点后,再映射回对应的真实机器。 好处:

  1. 数据在多台机器分布更均匀,负载均衡;
  2. 某台机器下线,数据会分摊给多个后继节点,不会瞬间压垮单台服务器。

极简总结

  • 一致性 Hash 构建 0~2³² 环形哈希空间,节点与 Key 映射到环上,Key 顺时针匹配首个节点完成存储分配;
  • 增减节点仅少量数据迁移,解决普通哈希扩容大规模数据搬迁问题;
  • 引入虚拟节点解决数据倾斜、节点负载不均问题;
  • 作用是 KV 数据分片路由,和 Raft 多副本一致性属于不同层面的分布式方案