Sunday面试指南

一致性哈希是什么?虚拟节点如何减少扩容时的数据迁移?

🧑‍💻 面试官:一致性哈希解决什么?

🙋‍♂️ 我:保证分布式数据一致。

🧑‍💻 面试官:这里的一致性是读写副本一致,还是节点增减时映射稳定?

🙋‍♂️ 我:是映射稳定。

🧑‍💻 面试官:加了虚拟节点就不会热点了吗?节点扩容时数据会自己搬过去吗?

一致性哈希的“一致”,是映射变化尽量局部,不是副本强一致,也不是自动扩容。

面试速答(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 的独立解析。

浏览公司面试真题 →
简历汪永久免费在线制作简历,模板直接套用、导出无水印,永久免费、下载免费,不需要付费解锁任何功能。去写简历