Skip to content

数据分片、一致性哈希、虚拟节点与再平衡面试题

本页只放标准回答、追问和原理跳转。

1. 分片和复制有什么区别

标准回答: 分片把不同数据分到不同逻辑 Partition/节点,用于扩展容量和吞吐;复制为同一分片保存多个副本,用于容灾和读取。一致性哈希解决路由映射,不自动完成副本一致性和故障切换。

原理:分片对象

2. 为什么 hash(key) % N 不利于扩容

标准回答: N 从 4 变 5 时大量 Key 的余数都会变化,并非只迁移新增节点应承担的数据,因此会造成缓存集中 Miss 或数据库大规模搬迁。可引入固定逻辑 Slot,再把 Slot 映射到物理节点。

原理:取模分片

3. Redis Cluster 为什么使用16384个Slot

标准回答: 固定 Slot 把 Key 到逻辑桶与逻辑桶到节点的映射解耦,扩缩容迁移选定 Slot 而不直接改变 %节点数。具体 Slot 数是 Redis 协议设计选择,不代表所有系统都应使用 16384。

原理:固定逻辑Slot

4. 一致性哈希扩容时迁移哪些Key

标准回答: Key 顺时针映射第一个节点。新增节点 X 主要接管其前驱到 X 的环区间;理想均匀情况下预期约 1/(N+1) Key 迁移。比例是统计期望,少量物理节点且无虚拟节点时可能严重不均。

原理:一致性哈希环

5. 为什么需要虚拟节点

标准回答: 少量物理节点在环上的位置可能不均,虚拟节点把每个物理节点映射成多个点,打散区间并可近似权重。数量过多会增加路由表、状态传播和迁移碎片,副本还要考虑地域/机架故障域。

原理:虚拟节点

6. Rendezvous Hash 和一致性哈希有什么区别

标准回答: Rendezvous 对 Key 与每个候选节点计算分数并选最高者,不维护环,新增节点只接管它成为最高分的 Key,删除节点则选择第二高分。朴素计算是 O(N),加权实现应采用经过证明的公式,不能简单乘权重。

原理:Rendezvous Hash

7. Kafka Partition 和 Redis Slot 是一回事吗

标准回答: 不是。Redis Slot 是 Key 路由桶,迁移时有 MOVED/ASK;Kafka Partition 是持久化有序日志、并行消费和副本 Leader 的边界。增加 Broker 不自动增加 Partition,增加 Partition 可能改变 Key 映射和局部顺序。

原理:固定Slot与Partition

8. 一致性哈希能否解决热点Key

标准回答: 不能。算法可能让 Key 数量均匀,但单个热 Key 仍只映射一个主节点。需要多级缓存、请求合并、拆 Key、只读副本、限流或业务分区;大租户可用目录路由单独迁移。

原理:热点与倾斜

9. 扩容迁移为什么不建议无事务双写

标准回答: 源和目标两次写无法原子提交,一边成功一边失败会产生分叉。应保持单一事实源,通过 WAL/CDC/Outbox 增量复制,目标按版本幂等应用;切换时发布 Routing Version 并处理旧客户端。

原理:迁移状态机

10. 迁移校验为什么不能只比较行数

标准回答: 行数相同仍可能字段错误、版本落后或两边各缺不同记录。应按主键范围比较数量、最大版本、摘要和业务抽样,并保留无法自动合并的冲突明细。

原理:迁移失败窗口

11. 发布新路由后为什么旧分片又出现数据

标准回答: 客户端缓存、旧路由版本、长连接和在途请求仍可能写源分片。请求应携带 Routing Version,旧分片校验归属后拒绝、转发或重定向,不能静默接受;切换后还要连接排空和观察窗口。

原理:迁移状态机

12. 分片不均或路由错误怎样排查

标准回答: 先确定业务 Key、逻辑 Partition、路由版本和实际节点;核对哈希、字符编码、Hash Tag 和跨语言实现;再查数据量/QPS TopN、路由传播、CDC Lag、校验摘要和迁移并发,不能只看平均分片大小。

原理:分片生产Runbook