什么是一致性哈希
一致性哈希把节点与数据键都映射到同一个哈希环上,数据按顺时针方向归属到最近的节点。增删节点时只影响相邻弧段的数据,而不是全量重映射。为避免节点少时分布不均,每个物理节点会映射多个虚拟节点(如 A#1 到 A#100)。它广泛用于缓存分片、分库分表路由与负载均衡。
基本信息
| 核心机制 | 键哈希后顺时针找最近节点;节点增减只迁移相邻弧段 |
|---|---|
| 虚拟节点 | 每个物理节点映射多个环上位置,摊平负载倾斜 |
| 调参项 | 副本数(虚拟节点数)、哈希函数、环状态同步方式 |
| 常见实现 | Ketama 算法、Redis Cluster 槽位、各类客户端分片库 |
典型使用场景
- 缓存分片:多台缓存节点间分配键,扩容时尽量少迁移数据
- 分库分表路由:按业务键定位库表,避免全量重分布
- 无状态服务路由:按会话或键把请求稳定路由到同一实例
- 消息分区分配:消费者与分区之间的稳定绑定关系
- 边缘路由:请求按键就近落到边缘节点并保持稳定
- 本地缓存亲和:让同一键反复落在同一实例,提高命中率
虚拟节点数量与效果
| 副本数 | 负载偏差 | 说明 |
|---|---|---|
| 1 | 明显倾斜 | 节点少时热点集中,个别节点承压 |
| 约 100 | 偏差收敛 | 常见工程取值,兼顾分布与内存 |
| 约 1000 | 偏差更小 | 路由表内存与查找开销上升 |
数据迁移与验证
数据迁移与验证
# 扩容带来的迁移量(示意)
# 均匀分布时,N 个节点扩到 N+1,平均迁移比例约为 1/(N+1)
# 例:4 台扩到 5 台,理论迁移约 20% 的键
# 验证步骤
- 记录扩容前后各节点键数量,确认分布偏差在可接受范围
- 抽样比对键到节点的映射是否稳定(未受影响的键不应迁移)
- 观察迁移期命中率与回源压力,必要时限速迁移
# 注意:环状态(节点表与副本数)必须在所有客户端保持一致虚拟节点数量需要调参:太少仍会倾斜,太多会增加路由表内存与查找开销,常见取值在几十到几百之间。
各客户端持有的环状态必须一致:节点表或副本数不一致会导致同一个键被路由到不同节点,读不到刚写入的数据。