📘 教案 22:一致性哈希(Consistent Hashing)
一、问题背景
在分布式系统中,需要解决一个基本问题:
如何将大量数据分布到多个服务器上?
典型场景
- 缓存系统(Redis 集群)
- 分布式数据库分片
- 负载均衡
二、最直观的方法(问题的起点)
方法:取模
node=hash(key)mod N\]\[ node = hash(key) \\mod N \]\[node=hash(key)modN
示例
text
服务器数 N = 3
key → hash → %3 → 节点
三、取模的问题(核心缺陷)
当服务器数量变化:
text
N = 3 → N = 4
结果:
👉 几乎所有数据重新映射
问题本质
数据分布对节点数量"高度敏感"
四、一致性哈希的核心思想
将"节点"和"数据"统一映射到同一个哈希空间中
构建方式
1️⃣ 构建一个哈希环
text
0 ------------------------ 2^32
(首尾相连)
2️⃣ 将服务器映射到环上
text
Server A → hash(A)
Server B → hash(B)
3️⃣ 将 key 映射到环上
text
key → hash(key)
4️⃣ 分配规则
顺时针找到第一个服务器
示例
text
key → 落在环上 → 顺时针找到节点
五、节点变化的影响
新增节点
text
插入一个新节点
影响:
👉 只影响该节点前一段区间的数据
删除节点
text
删除一个节点
影响:
👉 数据只迁移到下一个节点
🔥 关键优势
节点变化时,仅有 局部数据迁移
六、核心性质
1️⃣ 局部性(Locality)
节点变化只影响局部数据
2️⃣ 单调性(Monotonicity)
新增节点不会导致已有数据"乱跳"
3️⃣ 平衡性(Balance)
数据分布尽量均匀
七、问题:分布不均
如果节点少:
text
数据可能集中在某些节点
八、解决方案:虚拟节点(Virtual Nodes)
思想
每个物理节点对应多个"虚拟节点"
示例
text
Server A → A1, A2, A3...
👉 分布更均匀
九、查找过程(工程实现)
通常使用:
- 有序结构(TreeMap / SortedList)
查找:
text
hash(key) → 在环上找 ≥ key 的第一个节点
十、复杂度
- 查找:(O(\log N))
- 插入节点:(O(\log N))
十一、典型应用
1️⃣ 分布式缓存(Redis Cluster)
2️⃣ 分布式存储(Cassandra / Dynamo)
3️⃣ CDN 负载均衡
4️⃣ 微服务路由
十二、与普通哈希的对比
| 方法 | 节点变化影响 |
|---|---|
| hash % N | 全局重排 |
| 一致性哈希 | 局部调整 |
十三、本质总结
一致性哈希通过将节点与数据映射到同一哈希空间,并基于环结构进行分配,使得在节点动态变化时,仅需对局部数据进行迁移,从而显著降低系统重平衡成本。