SWE / SRE / Frontend · System Design / 基础

TikTok MySQL 异构热迁移:快照、CDC、对账与切流

设计不停服务的数据库迁移,解释双写失败窗口和回滚的真实条件。

题目重点:设计不停服务的数据库迁移,解释双写失败窗口和回滚的真实条件。

题意与假设

这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。

  • 目标数据库模型、查询能力和一致性需求未给;先核对事务/索引/类型映射。
  • 源数据库先保持权威,不把应用双写等同原子跨库提交。

解题路线

  1. 定义字段转换、主键、时区、精度、null、删除语义和查询兼容,使用真实样本做双读结果对照。
  2. 在一致快照点记录变更位置,backfill分片复制,CDC从匹配位置续接,避免快照与增量之间漏写。事件带版本/位点,幂等应用并处理乱序/重放。
  3. 同步双写若第一库成功第二库失败会分叉;可用outbox/CDC或明确补偿/对账,不凭“try两次”宣称一致。
  4. shadow reads比较,再按用户/分区灰度读取;检查复制lag、缺行、金额总额和业务查询差异,不只row count。
  5. 切写前确认追平、fencing旧writer和路由版本,保留回滚窗口。新库已接收写入后回退旧库需要反向同步或停写对齐,不能只改连接串。

手动走一遍

backfill拷贝订单v3后收到旧v2事件,应拒绝版本倒退;删除需tombstone或明确顺序,不能旧事件复活。金额decimal转float可能出现误差,必须做schema和业务金额核对。

规模与取舍

backfill N字节至少 O(N) I/O,CDC吞吐应持续高于写入率,受源端日志留存和目标写能力约束。迁移读写额外负载需限速。

易错点与追问

容易失分的边界

  • 没有一致快照位点。
  • 双写自动原子。
  • 只比行数。
  • 新库写后无条件回滚。

继续深挖

  • 异构库没有等价事务怎样改业务合同?
  • CDC日志留存被追上以前耗尽怎么办?
✓已复制微信号!