标准答案

  1. 对节点生成多个带权虚拟节点并排序,Key 哈希后用二分查找定位首个不小于它的位置。
  2. 节点加入或删除只重新映射其相邻区间,迁移量通常小于全量取模方案。
  3. 需要处理空环、节点权重、哈希碰撞和节点列表版本一致性。

题目解析

一致性 Hash 将节点和 Key 映射到同一环,节点变化时主要影响相邻区间,迁移量通常小于全量取模。虚拟节点可以改善分布,但不能消除真实业务热点。

所有客户端必须使用一致的节点列表版本、Hash 算法和虚拟节点配置,否则同一个 Key 会被路由到不同节点。节点下线和空环也要有明确的降级或重试行为。

路由均匀不等于负载均匀:大 Key、热 Key 和节点容量不同都会造成倾斜。应观察每节点 QPS、内存、网络和迁移量,必要时对热点做复制或拆分。

代码示例

路由核心:

TypeScript
const point = hash(key)
const index = lowerBound(sortedPoints, point) % sortedPoints.length
return sortedPoints[index].node

常见误区

  • 误区:节点变化后所有 Key 都重新取模。改正:使用一致性 Hash 或其他稳定分片方案,减少无关 Key 迁移。
  • 误区:没有虚拟节点导致节点负载严重倾斜。改正:使用虚拟节点和容量权重,并通过指标验证实际分布。
  • 误区:不同客户端使用不同节点列表版本。改正:版本化拓扑并保证路由配置一致,切换时处理迁移和读写失败。

作者信息