研究与学习 · 概念讲解

用一张环讲清楚一致性哈希

你有 K 个 key 分布在 N 台缓存服务器上。一台机器挂了,或者你加了一台—— 到底要搬动多少 key?最朴素的 hash(key) mod N 答案是「几乎全部」。 一致性哈希能把它压到大约 K / N。下面看为什么。

诀窍:把 hash 落到环上,而不是一条线上

节点和 key 都映射到同一个 上(也就是把 hash 的输出空间首尾相连)。 一个 key 属于谁?从它的位置顺时针走,遇到的第一个节点就是它的 owner。 当一个节点下线,只有落在它弧段里的 key 需要重新分配—— 交给下一个节点,其余 key 原地不动。

4
32
4 个节点 · 32 个 key · 上次变更迁移了

不同颜色的弧段表示归属。移除一个节点,它的弧段会交给顺时针方向的下一个邻居; 弧段之外的每一个点颜色都不变——这就是全部要点。

对比 mod N

hash mod N一致性哈希
N→N+1 时迁移的 key约占总数的 (N−1)/N约 1/(N+1)
热点风险天然均匀不均匀——靠虚拟节点修正
查找开销O(1)O(log N)(环上做二分)
典型用户数组分片、简单 LBDynamo、Cassandra、Memcached 客户端、Envoy

什么时候你会遇到它

只要你在一个会动态增减的集群上分散状态,就会遇到它:缓存池、分片队列、对象存储、 带粘性会话的请求路由都是。生产系统真正在跑的其实是 虚拟节点变体——每台物理机在环上占很多个小弧段,而不是一个大弧段, 这样负载更平滑,再平衡也更温和。