一致性哈希是什么?虚拟节点如何减少扩容时的数据迁移?
🧑💻 面试官:一致性哈希解决什么?
🙋♂️ 我:保证分布式数据一致。
🧑💻 面试官:这里的一致性是读写副本一致,还是节点增减时映射稳定?
🙋♂️ 我:是映射稳定。
🧑💻 面试官:加了虚拟节点就不会热点了吗?节点扩容时数据会自己搬过去吗?
一致性哈希的“一致”,是映射变化尽量局部,不是副本强一致,也不是自动扩容。
面试速答(60 秒版)
直接 hash(key) mod N 分配节点,N 改变时很多键会重新映射。一致性哈希把键和节点映射到同一空间,常见环模型中由顺时针后继节点负责键,增减节点主要改变局部归属。
虚拟节点让一个物理节点拥有多个位置,可以改善分布并按权重安排,但不能解决单个热键,也不无条件保证完全均匀。
它只定义映射,复制、迁移、路由版本和故障恢复仍需设计。扩容过程中要防止不同客户端使用不同节点视图。
Redis Cluster 的固定哈希槽也是减少路由变化的另一种间接映射方案,不应说它就是本文这个哈希环实现。

知识点详解:节点变了,哪些键跟着变
取模的问题,来自分母改变
假设原来三个节点按 hash(key) mod 3 分配,扩容后改为 mod 4。即使键和哈希函数都不变,余数也可能变化。
结果不是只把四分之一新数据给新节点,已有大量键也可能改归属。缓存场景会同时失效,存储场景还要迁移。
如果节点只变机器地址但逻辑分区不变,问题又不同,所以先区分物理节点与逻辑分区。
环模型让新节点接管一个局部区间
在简化环上,键落在某位置,沿约定方向找到后继节点。插入一个新节点,只会切开它前方对应的一段区间,其他区间仍归原节点。
删除节点时,其负责区间转交给后继。比例是否理想取决于分布,不能仅凭环形图就宣称每台一定平均。
顺时针只是所选模型的约定,关键是所有参与者使用同样哈希、位置和查找规则。
虚拟节点改善分散,不会把一个热键拆开
一个物理节点在环上有多个位置,就能分到多个较小区间,降低少数位置偶然不均匀的影响。权重也可以通过相关安排表达。
但假设一个键承载绝大多数请求,它通常还是映射到某个负责节点。再多虚拟位置也不会自动把这个键的处理负载均摊。
需要另外考虑复制读取、热点分拆、缓存和流量控制。按键数平均,也不意味着按请求数或字节数平均。
真正扩容要处理旧图和新图共存
先确定新的归属,再搬数据并验证,最后切换访问。迁移中是双读、转发还是短暂限制写入,要根据系统设计选择。
若两个客户端持有不同节点列表,同一键可能被送到不同位置。需要路由版本、协调发布和纠错机制,不能只用本地计算就认定可靠。
测试要看迁移键数、迁移字节数、热点与失效后的回源压力,而不是只画节点从三变四。
本题机制参考:Karger 等一致性哈希论文、Azure Sharding、Redis Cluster 规范。
面试官继续追问
一致性哈希保证强一致吗?
不保证。它是分配映射方法,副本读写协议是另一个问题。
虚拟节点越多越好吗?
不一定。元数据、查找和维护成本会增加,要结合负载衡量。
Redis Cluster 是哈希环吗?
常规 Redis Cluster 使用固定 16384 槽及槽到节点映射,不是本题的后继哈希环。
面试速记卡
- 目的:节点变化时减少映射大范围变化。
- 环模型:键找约定方向的后继节点。
- 虚拟节点:改善分布,不消除单热键。
- 边界:映射不代替复制、迁移与一致性。
- 验收:路由版本、迁移量与缓存回源压力。
公司面试真题
真题根据求职者公开面经整理,题意经过概括,非逐字原话或公司官方题库;本文为 Sunday 的独立解析。
阿里巴巴 · Java后端 · 社招
一致性哈希怎样处理数据倾斜?(题意整理)
社招一年半面经分享 · 阿里部分 ↗
历史面经,面试年份未明确;页面编辑于 2024-07-19