Skip to content

多副本一致性、Quorum与版本时钟面试题

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

1. 为什么增加副本后会出现一致性问题

标准回答: 副本通过网络异步或部分同步传播,写确认时点、复制延迟、节点故障和并发写会让不同节点短时间持有不同版本。副本提升容灾和读能力,但必须同时设计确认条件、读取策略、版本比较、冲突合并和后台修复。

原理:副本的收益与代价

2. 同步、部分确认和异步复制有什么区别

标准回答: 区别在客户端成功响应前等待哪些副本、确认到哪个持久化阶段。同步复制丢失窗口小但受慢副本影响;部分确认在延迟与容错间折中;异步复制延迟低,但主节点在传播前永久故障时可能丢失已确认写,Follower 读取也可能陈旧。

原理:Leader/Follower 写入路径

3. N=3,W=2,R=2 为什么有交集

标准回答: 固定三个副本中,任意两个写集合与任意两个读集合至少共享一个节点,因为 W + R > N。读协调者有机会从交集获得已确认版本,再按版本规则选择并修复旧副本。

追问:是否自动保证线性一致? 不保证。还依赖固定副本集合、可靠版本、并发写处理、读等待条件和故障恢复;Sloppy Quorum 或时间戳覆盖会破坏简单推导。

原理:Dynamo 风格 Quorum

4. 线性一致与数据库可串行化有什么区别

标准回答: 线性一致关注单对象操作是否表现为符合真实时间的瞬时生效;可串行化关注并发事务结果是否等价于某个串行顺序,不一定尊重真实时间。严格可串行化才同时约束事务串行顺序和真实时间。

原理:一致性模型

5. 怎样保证用户写完立即能读到

标准回答: 写响应返回提交版本,后续读携带最低可接受版本;副本达到版本就返回,否则在预算内等待、转读 Leader/事实源,或返回明确未同步状态。仅做会话粘滞不能覆盖副本故障切换,因此版本下限更可验证。

原理:会话一致性保证

6. Lamport Clock 和 Vector Clock 有什么区别

标准回答: Lamport Clock 保证若 A 因果先于 B,则时间值递增,但值递增不能反推出因果关系;Vector Clock 记录各节点观察进度,能判断一个版本支配另一个版本,或双方互不包含而属于并发,代价是元数据随参与节点增加。

原理:版本与逻辑时钟

7. 为什么不能只用更新时间解决多活冲突

标准回答: 机器时钟存在漂移、回拨和精度碰撞,实际后发生的写可能携带更小时间戳,LWW 会把它永久丢弃。低风险覆盖字段可在约束条件下使用 LWW;库存、余额应使用单写入点、业务版本、账本或严格事务。

原理:墙上时钟与 LWW

8. Read Repair 和 Anti-Entropy 有什么区别

标准回答: Read Repair 在读取多个副本时发现并修复旧版本,依赖读流量;Anti-Entropy 后台周期比较摘要并同步差异,可修复冷数据,但消耗网络和磁盘。两者常配合覆盖热 key 和全量收敛。

原理:副本收敛工具

9. 什么是 Hinted Handoff

标准回答: 目标副本暂时不可用时,协调节点为它暂存写入 Hint,恢复后转交。它提高故障期间写可用性,但 Hint 不是永久副本,需要监控磁盘占用、积压时间和恢复洪峰。

原理:Hinted Handoff

10. CRDT 能解决所有多活冲突吗

标准回答: 不能。CRDT 依靠满足交换律、结合律和幂等性的合并规则实现副本收敛,只适合能映射到对应代数语义的数据。购物车集合、部分计数器可以设计 CRDT;库存和余额不能简单合并,还要治理删除墓碑和元数据增长。

原理:冲突解决边界

11. 线上读到旧数据怎样定位

标准回答: 先确定事实源、业务 key、期望版本和写是否提交;再查复制 Offset/LSN/Lag、实际读取地域和节点、缓存层、一致性级别及会话最低版本;随后检查冲突覆盖和修复任务。修复时先阻止旧值扩散,再按事实源幂等回放并校验副本。

原理:陈旧读生产 Runbook