每天学一个算法--一致性哈希(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 全局重排
一致性哈希 局部调整

十三、本质总结

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

相关推荐
wzdark2 分钟前
数据压缩算法的时间复杂度与压缩率权衡4
算法
小陈phd20 分钟前
深入理解agent学习笔记(一)——现代agent介绍
人工智能·算法
晴天的雨.9923 小时前
【C++算法】和为s的两个数
开发语言·数据结构·c++·算法
aramae10 小时前
MySQL复合查询(8)
java·c语言·开发语言·后端·算法
荆棘鸟智能11 小时前
城市感知设备怎么统一接入?从多协议网关到设备模型的中间件架构设计
人工智能·算法·边缘计算
INGNIGHT15 小时前
270 · 电话号码的字母组合II(Trie)
linux·算法
2401_8390805415 小时前
C++常见八股
数据结构·c++·算法
青山是哪个青山15 小时前
LeetCode 188:买卖股票的最佳时机 IV
算法
mikuyyds15 小时前
geo-toolbox 插件算法解析:RUSLE 与 MUSLE 的工程化落地
算法·rust·gis
a1879272183116 小时前
【算法】树(二):队列与祖先——BFS 骨架三配件、短路透传与合流
算法·leetcode·二叉树··bfs·算法讲解·树遍历