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

十三、本质总结

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

相关推荐
退休倒计时9 小时前
【每日一题】LeetCode 88. 合并两个有序数组 TypeScript
算法·leetcode·职场和发展·typescript
键盘会跳舞9 小时前
C++:函数对象与 std::function 源码级深度拆解——泛型算法的策略内核与可调用对象统一封装
c++·算法·仿函数
手写码匠9 小时前
华为云Flexus+DeepSeek征文|Agent 评测体系实战:用 DeepSeek-R1 当裁判,打造 Dify Agent 的自动化回归测试流水线
人工智能·深度学习·算法·aigc
LONGZETECH9 小时前
无人机实训高成本痛点解法:虚拟仿真实现 70% 耗材损耗下降
大数据·算法·unity·架构·无人机
不会就选b9 小时前
算法日常・每日刷题--<队列,宽搜>4
算法
码字的特恩9 小时前
微软确认暂不为 Windows 11 加入透明效果自定义功能,建议用户使用第三方工具
人工智能·windows·算法·microsoft·计算机·大模型·编程
星轨初途10 小时前
LeetCode 热题 100——day10 和为 K 的子数组
开发语言·c++·算法·leetcode
数模竞赛Paid answer10 小时前
2021年深圳杯数学建模C题配电网可靠性和故障软自愈研究解题全过程论文及程序
算法·数学建模·数据分析·深圳杯
有点。10 小时前
C++广度优先搜索(二)-练习题
c++·算法·宽度优先
疯狂打码的少年10 小时前
【数据结构】队列的应用:循环队列
数据结构·笔记·算法