题目重点:设计不停服务的数据库迁移,解释双写失败窗口和回滚的真实条件。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 目标数据库模型、查询能力和一致性需求未给;先核对事务/索引/类型映射。
- 源数据库先保持权威,不把应用双写等同原子跨库提交。
解题路线
- 定义字段转换、主键、时区、精度、null、删除语义和查询兼容,使用真实样本做双读结果对照。
- 在一致快照点记录变更位置,backfill分片复制,CDC从匹配位置续接,避免快照与增量之间漏写。事件带版本/位点,幂等应用并处理乱序/重放。
- 同步双写若第一库成功第二库失败会分叉;可用outbox/CDC或明确补偿/对账,不凭“try两次”宣称一致。
- shadow reads比较,再按用户/分区灰度读取;检查复制lag、缺行、金额总额和业务查询差异,不只row count。
- 切写前确认追平、fencing旧writer和路由版本,保留回滚窗口。新库已接收写入后回退旧库需要反向同步或停写对齐,不能只改连接串。
手动走一遍
backfill拷贝订单v3后收到旧v2事件,应拒绝版本倒退;删除需tombstone或明确顺序,不能旧事件复活。金额decimal转float可能出现误差,必须做schema和业务金额核对。
规模与取舍
backfill N字节至少 O(N) I/O,CDC吞吐应持续高于写入率,受源端日志留存和目标写能力约束。迁移读写额外负载需限速。
易错点与追问
容易失分的边界
- 没有一致快照位点。
- 双写自动原子。
- 只比行数。
- 新库写后无条件回滚。
继续深挖
- 异构库没有等价事务怎样改业务合同?
- CDC日志留存被追上以前耗尽怎么办?
