一致性哈希(Consistent Hashing)和取模哈希(Modulo Hashing)经常被放在一起比较,尤其是在 分布式缓存 / 分布式存储 / 负载均衡 场景下。
一、取模哈希的特点
公式:
node = hash(key) % N
-
优点
- 实现简单,计算效率高。
- 只要节点数 N 固定,映射关系稳定。
-
缺点
- 节点数 N 变化时(增减机器),几乎所有 key 的映射都要重新计算。
- 导致 大规模缓存失效 或 数据迁移成本高。
举个例子:
- 原来有 4 台缓存,
key=100落在hash(100) % 4 = 0。 - 新增一台变成 5 台:
hash(100) % 5 = 3。 - 结果 key 被重新分配,几乎所有数据都要迁移。
二、一致性哈希的特点
原理
- 将哈希空间(0 ~ 2^32-1)首尾相连,形成一个环。
- 节点通过
hash(node)映射到环上。 - key 通过
hash(key)映射到环上,从该位置顺时针找到的第一个节点就是它的归属。
优点
-
节点增减影响小
- 只会影响环上相邻一部分 key 的归属,而不是所有 key。
- 极大减少了数据迁移量。
- 例如新增一个节点,只会接收原来某个区间的 key。
-
负载更均衡(配合虚拟节点)
- 给每个节点分配多个虚拟节点,打散在环上,避免热点集中。
- 这样 key 更均匀分布在各个节点上。
缺点
- 实现复杂度比取模高。
- 查找时需要额外的数据结构(如有序环、红黑树)支持。
- 如果没有虚拟节点,分布可能不均匀。
三、对比总结
| 对比点 | 取模哈希 | 一致性哈希 |
|---|---|---|
| 实现复杂度 | 简单 | 相对复杂(需环/虚拟节点) |
| 节点变更时数据迁移 | 大规模迁移 | 仅局部迁移 |
| 负载均衡 | 均匀(N 固定时) | 需配合虚拟节点,效果更好 |
| 适用场景 | 节点数固定的集群 | 节点数经常变动的分布式系统 |
四、典型应用
-
取模哈希:适合节点数量固定、几乎不变的场景(如数据库分表,固定 64 张表)。
-
一致性哈希:适合动态集群(缓存、分布式存储、分布式队列),如:
- Redis 集群(部分实现)
- 分布式缓存(Memcached、Ehcache 集群)
- 分布式消息队列分区路由
- Nginx / LVS 负载均衡
结论:
在 节点数可能变动 的分布式系统里,一致性哈希比取模更优,因为它能显著减少数据迁移,保证系统稳定性。
但如果 节点数固定(例如数据库分表),取模哈希更简单直接,性能也更好。
2084

被折叠的 条评论
为什么被折叠?



