研究与学习 · 概念讲解
用一张环讲清楚一致性哈希
你有 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)(环上做二分) |
| 典型用户 | 数组分片、简单 LB | Dynamo、Cassandra、Memcached 客户端、Envoy |
什么时候你会遇到它
只要你在一个会动态增减的集群上分散状态,就会遇到它:缓存池、分片队列、对象存储、 带粘性会话的请求路由都是。生产系统真正在跑的其实是 虚拟节点变体——每台物理机在环上占很多个小弧段,而不是一个大弧段, 这样负载更平滑,再平衡也更温和。