每天学一个算法--一致性哈希(Consistent Hashing)

📘 教案 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 全局重排
一致性哈希 局部调整

十三、本质总结

一致性哈希通过将节点与数据映射到同一哈希空间,并基于环结构进行分配,使得在节点动态变化时,仅需对局部数据进行迁移,从而显著降低系统重平衡成本。

相关推荐
无限进步_2 小时前
C++ 继承机制完全解析:从基础原理到菱形继承问题
java·开发语言·数据结构·c++·vscode·后端·算法
superior tigre2 小时前
45 跳跃游戏2
算法·leetcode·游戏
不知名的忻2 小时前
并查集(QuickUnion)
java·数据结构·算法·并查集
leo__5202 小时前
基于时延的麦克风声源定位 - C实现
c语言·开发语言·算法
攻防_SRC2 小时前
面向分组密码差分故障分析的属性推导与验证平台
人工智能·算法·机器学习
likerhood2 小时前
Java实现选择题选项乱序算法
java·开发语言·算法
小鱼~~2 小时前
最小二乘&均方误差MSE&平均绝对误差MAE
python·算法·机器学习
田梓燊3 小时前
力扣:138.随机链表的复制
算法·leetcode·链表
不忘不弃3 小时前
皇后摆放问题优化求解法
算法