Hash-15-聊一聊哈希负载均衡之一致性哈希 Consistent Hashing
2018年5月30日大约 4 分钟
拓展阅读
todo
工具包包的封装+文档
资源可视化
前后端===》项目
弱点解决===》场景解决方案/技术咨询
chat
详细介绍一下 一致性哈希
一致性哈希(Consistent Hashing)是一种为了解决分布式系统中节点频繁增删带来的数据重分布问题的哈希算法,广泛应用于缓存系统(如:Redis Cluster、Memcached)、分布式存储系统(如:Cassandra、Ceph)和负载均衡等场景。
✨ 背景问题:为什么需要一致性哈希?
常规哈希的缺点
假设我们要将数据分配到 3 台缓存服务器上,通常做法是:
hash(key) % N
其中 N = 3
是服务器数量。
但问题是:
- 当服务器增减时,比如从 3 台变成 4 台,所有 key 的
hash(key) % 4
的结果都会改变。 - 这导致几乎所有的数据都需要重新映射和迁移,效率极低,也不利于系统稳定。
🧠 一致性哈希的核心思想
一致性哈希的核心是将整个哈希值空间组织成一个“环”(0 ~ 2³² - 1),然后:
将服务器映射到哈希环上:
对每个服务器节点计算哈希值,放到哈希环上对应的位置。将数据映射到哈希环上:
对每个数据的 key 也计算哈希值,找到环上“第一个顺时针大于等于该值的节点”,将其存储在该节点。当节点增加或删除时,仅影响局部数据的重新分布,大大减少了数据迁移量。
🎯 一致性哈希的具体流程
1. 构造哈希环
- 使用一个固定范围的哈希函数(如
MD5
),将整个哈希空间看作一个 0 到 2³²-1 的环。 - 每个服务器节点根据其 IP 或名称哈希成一个点,放在环上。
2. 数据存储策略
- 对数据 key 哈希后,顺时针找第一个服务器节点。
- 如果到了最大值也找不到,则回环到最开始。
3. 增删节点操作
增加节点:
只会影响该节点“前一个节点”和它之间的数据,这部分数据会迁移到新节点。删除节点:
该节点负责的数据迁移到它的下一个节点即可。
🎮 举个例子
环上服务器分布:
服务器 | 哈希值 |
---|---|
A | 100 |
B | 300 |
C | 600 |
现在 key = user123
,哈希值为 250:
它会顺时针映射到 B 节点(300)。
若插入一个新节点 D(哈希值 = 200),
user123
将落到 D。- 其他 key 不变。
这样,就只迁移了极少量的数据。
🧩 虚拟节点(Virtual Nodes)
现实中服务器节点不可能完全均匀分布,为了解决数据倾斜问题,引入了虚拟节点。
- 每个物理节点对应多个虚拟节点(如 ServerA-1, ServerA-2 等),映射到不同位置。
- 数据映射还是按虚拟节点来,虚拟节点内部再映射到真实服务器。
- 这样可以均衡数据分布,防止某个节点压力过大。
🏗 应用场景
分布式缓存系统
- 如:Memcached、Redis Cluster
- 解决节点扩容/缩容导致的大规模缓存失效问题
分布式存储系统
- 如:Cassandra、HBase、Riak
- 数据分区和副本路由
负载均衡系统
- 动态添加、下线后端服务器时,尽量减少请求扰动
✅ 一致性哈希的优点
- 节点变动影响最小:只迁移局部数据
- 支持节点动态增删
- 结合虚拟节点后负载均衡效果更好
- 非常适合大规模分布式环境
⚠️ 注意事项 / 缺点
- 实现相对复杂,哈希函数选择影响均匀性
- 虚拟节点过多会增加维护成本
- 哈希环理论基础需要一定学习成本
总结一句话:
一致性哈希通过把节点和数据映射到一个虚拟的哈希环中,结合顺时针查找策略,实现了高效的数据分布和最小的数据迁移,是分布式系统中解决“节点变动引起数据重分布”的核心算法之一。
如你需要,我可以画一张图来直观展示整个哈希环、节点与 key 的映射过程。是否需要?