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

十三、本质总结

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

相关推荐
计算机安禾23 分钟前
【c++面向对象编程】第25篇:仿函数(函数对象):重载operator()
开发语言·c++·算法
周末也要写八哥1 小时前
在C++中使用预定义宏
开发语言·c++·算法
学会870上岸华师1 小时前
C 语言程序设计——第一章课后编程题
c语言·开发语言·学习·算法
小马过河R2 小时前
RAG检索优化策略:系统性四层框架解析
人工智能·python·算法·ai·llm·rag·问答
AI技术控2 小时前
论文解读:AE-TCN-SA——基于自编码器、TCN 与自注意力机制的锂电池内短路诊断方法
人工智能·python·深度学习·算法·机器学习·自然语言处理
ʚ希希ɞ ྀ2 小时前
动态规划基础知识---爬楼梯
算法·动态规划
计算机安禾2 小时前
【c++面向对象编程】第26篇:对象的内存模型:成员变量与成员函数的存储分离
开发语言·c++·算法
贩卖黄昏的熊2 小时前
陕西省ICPC省赛总结
算法
jieyucx2 小时前
Go 语言进阶:构造函数、父子结构体与组合复用详解
服务器·算法·golang·继承·结构体·构造函数
澈2072 小时前
滑动窗口算法:双指针高效解题秘籍
数据结构·c++·算法