Consistent Hashing:新增一台缓存服务器,为什么不用搬走所有数据?

TL;DR

一致性哈希把节点与数据键映射到同一条环上,让扩容或缩容主要影响局部区间,减少缓存集群的全量迁移与冷启动。

一致性哈希把节点与数据键映射到同一条环上,让扩容或缩容主要影响局部区间,减少缓存集群的全量迁移与冷启动。

Consistent Hashing:新增一台缓存服务器,为什么不用搬走所有数据?

缓存集群最怕的一件事,是新增一台机器后所有键都要重新分配。如果哈希结果直接对服务器数量取模,节点数从 4 变成 5,几乎每个键的归属都可能改变,缓存命中率会突然下降。Consistent Hashing(一致性哈希)把键和节点放到同一条环上,只让变化影响局部范围。

想象一只标有数字的圆环。每台服务器占据环上的一个或多个位置,每个数据键也映射到环上的位置,然后沿顺时针方向寻找第一个服务器。新增一台服务器时,它只接管自己与前一个节点之间那一小段键;删除一台服务器时,受影响的键转交给下一个节点,其他区域保持不动。

真实系统通常使用虚拟节点,让一台物理服务器在环上占据多个位置。这样可以把键更均匀地分布,避免某两个节点之间的区间过大。虚拟节点数量、权重和重新平衡策略会影响负载方差;如果节点能力不同,还可以给强机器更多环上位置。

一致性哈希减少的是拓扑变化造成的数据迁移,不会自动消除热点。某个热门键仍可能把大量请求集中到单个节点,通常要叠加副本、热点拆分、请求合并或限流。节点上下线也需要传播新环视图,版本切换不当可能造成短暂的双写或读不到。

它的核心不是“哈希更准确”,而是让映射函数对成员集合的变化更稳定。对于分布式缓存、分片存储和路由选择,这种稳定性可以减少冷启动和迁移成本,把扩容从全量搬家变成局部换租。

环的稳定性也依赖节点视图一致。扩容时,如果一部分客户端先看到新节点,另一部分仍使用旧环,同一个键可能短暂地落到不同位置。生产系统通常需要版本化环、迁移状态和双读策略,把映射变化从瞬间切换变成可观测、可回滚的过程。

如果业务还要求高可用,一致性哈希通常会在主节点之外安排副本节点,并在映射环上继续选择后继位置。这样一台机器故障时,键可以迅速落到副本,但读写一致性、复制延迟和热点副本又成为新的设计问题。环只解决定位稳定性,不会替代存储协议。

资料来源:Consistent Hashing and Random Trees

KEEP READING