一致性哈希

把节点与数据都映射到哈希环上,按顺时针就近归属;增删节点时只影响相邻区段的数据,配以虚拟节点缓解负载倾斜,常用于缓存与分片路由。

什么是一致性哈希

一致性哈希把节点与数据键都映射到同一个哈希环上,数据按顺时针方向归属到最近的节点。增删节点时只影响相邻弧段的数据,而不是全量重映射。为避免节点少时分布不均,每个物理节点会映射多个虚拟节点(如 A#1 到 A#100)。它广泛用于缓存分片、分库分表路由与负载均衡。

基本信息

核心机制键哈希后顺时针找最近节点;节点增减只迁移相邻弧段
虚拟节点每个物理节点映射多个环上位置,摊平负载倾斜
调参项副本数(虚拟节点数)、哈希函数、环状态同步方式
常见实现Ketama 算法、Redis Cluster 槽位、各类客户端分片库

典型使用场景

  • 缓存分片:多台缓存节点间分配键,扩容时尽量少迁移数据
  • 分库分表路由:按业务键定位库表,避免全量重分布
  • 无状态服务路由:按会话或键把请求稳定路由到同一实例
  • 消息分区分配:消费者与分区之间的稳定绑定关系
  • 边缘路由:请求按键就近落到边缘节点并保持稳定
  • 本地缓存亲和:让同一键反复落在同一实例,提高命中率

虚拟节点数量与效果

副本数负载偏差说明
1明显倾斜节点少时热点集中,个别节点承压
约 100偏差收敛常见工程取值,兼顾分布与内存
约 1000偏差更小路由表内存与查找开销上升

数据迁移与验证

数据迁移与验证
# 扩容带来的迁移量(示意)
# 均匀分布时,N 个节点扩到 N+1,平均迁移比例约为 1/(N+1)
# 例:4 台扩到 5 台,理论迁移约 20% 的键
# 验证步骤
- 记录扩容前后各节点键数量,确认分布偏差在可接受范围
- 抽样比对键到节点的映射是否稳定(未受影响的键不应迁移)
- 观察迁移期命中率与回源压力,必要时限速迁移
# 注意:环状态(节点表与副本数)必须在所有客户端保持一致
虚拟节点数量需要调参:太少仍会倾斜,太多会增加路由表内存与查找开销,常见取值在几十到几百之间。
各客户端持有的环状态必须一致:节点表或副本数不一致会导致同一个键被路由到不同节点,读不到刚写入的数据。

易错点

  • 未引入虚拟节点,节点数少时负载严重倾斜,热点节点先扛不住
  • 环状态在客户端之间不同步,键被路由到不同节点,出现「写了读不到」
  • 扩容窗口内迁移不限速,命中率骤降叠加回源压力把数据库打满
  • 把有状态数据的一致性完全交给哈希环,未处理节点故障时的数据迁移

数据来源与参考

  • Karger 等《Consistent Hashing and Random Trees》(STOC 1997)
  • 《数据密集型应用系统设计》(Kleppmann)第 6 章
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌