" />
文章

系统升级中如何实现数据的平滑迁移(面试笔记 · 蔚来)

系统升级中如何实现数据的平滑迁移(面试笔记 · 蔚来)

面试指北 · 蔚来

题意

这道题问的不是“怎么把数据从旧库复制到新库”这么简单,而是:系统升级、库表改造、分库分表调整或机房迁移时,如何让业务尽量不停机、数据不丢不重、切换过程可控,并且出问题时还能退回去。

面试官通常关注几个点:存量数据怎么搬、增量数据怎么追、切换时怎么灰度、新旧库一致性怎么校验、失败怎么回滚。回答时最好先讲目标,再讲方案,最后讲保障手段。

结论

数据平滑迁移的核心链路可以概括为六步:存量同步、增量追平、双写或复制兜底、一致性校验、灰度切流、保留回滚窗口。

常见有两条路:

  • 双写方案:偏应用层。旧库写成功即返回,新库异步写,失败记录并补偿;读流量逐步灰度到新库。
  • 联机同步方案:偏存储层。把新库作为旧库的从库,通过主从复制或 CDC 同步追平,等延迟和一致性满足条件后再切流。

两种方案都不是“切完就结束”,都必须配合监控、校验、补偿和回滚预案。

要点展开

1. 迁移的基本要求

原文提到三条要求,可以展开为:

  1. 在线迁移,不影响服务提供
    迁移期间旧库仍是主链路,业务读写不能停;新库的同步、校验、补偿尽量后台化。

  2. 数据完整,迁移后新旧库保持一致
    不仅要搬存量数据,还要追增量数据。切换窗口内不能丢写,允许短暂延迟,但最终要能追平。更新、删除也要同步,不能只关注新增。

  3. 不影响旧库功能,失败可回滚
    迁移过程中旧库要能正常提供服务;即使新库有问题,也能把流量切回旧库。旧库在切换完成后不要立刻删除,建议保留一段只读或反向同步窗口。

除此之外,还要关注:复制延迟、双写失败率、补偿积压、校验差异数、慢查询、连接数等可观测指标,以及补偿任务的幂等性。

2. 平滑实现一:双写

双写方案的典型步骤如下。

  1. 先建新库并做存量、增量同步
    按目标模型建表、建索引、分库分表。通过同步工具或 CDC 把旧库历史数据搬到新库,并持续追增量,让新库先接近旧库。
    原文“将新库配置为源库的从库,分库分表的同步数据”,可以理解为先用复制/同步链路完成数据追平;如果新旧分库分表规则不同,还需要做分片键、表名、字段映射。

  2. 应用层双写,旧库为主、新库异步
    写入时同时写旧库和新库,但以旧库写成功作为业务成功条件;新库可以异步写,失败不影响主流程。
    新库写失败要记录日志或投递消息,由后台任务补增。补偿任务必须幂等,更新和删除也要能补,避免旧数据覆盖新数据。

  3. 随机抽样校验
    按一定比例抽取数据,对比新旧库查询结果是否一致,重点看核心字段、金额、状态、时间、关联表关系等。海量数据没必要全量比对,抽样加核心业务对账更现实;发现差异要记录并修复。

  4. 灰度切读流量
    按 10% -> 20% -> 30% ... 逐步把读流量切到新库,写仍然保持双写。灰度时尽量让同一用户或同一租户粘滞,避免刚写旧库就去新库读、结果读不到。

  5. 出问题及时回切
    如果新库查询异常、延迟升高或校验差异变大,把读流量切回旧库即可。因为双写还在,旧库数据是完整安全的。

  6. 稳定后全量切新库
    连续观察几个周期,确认新库工作正常,再把读流量全部切到新库,随后停止双写和旧库写入。旧库保留只读一段时间,作为回滚和追查依据。

这里有一个容易忽略的点:复制链路和应用双写不要互相打架。进入双写阶段后,要明确增量由谁负责,避免同步工具和应用双写同时修改同一行造成重复写或回环。

3. 平滑实现二:联机同步

联机同步更依赖存储层复制能力,步骤可以理解为:

  1. 新库作为旧库的从库
    建立全量加增量的同步链路,让新库持续追旧库的变更。

  2. 在新站点新增一个库,作为新库的从库
    形成“旧库 -> 新库 -> 新站点库”的级联关系,新站点库用于备份、容灾或后续切换保障。

  3. 等三个库状态一致后开始切流
    这里的“一致”不是要求某一刻绝对相等,而是复制延迟足够低、关键数据校验通过。切流前最好短暂禁写或原子切换写入口,让新库追平最后一段增量,再放开来写,避免切换瞬间丢写。

  4. 完全切换后旧库暂停业务
    流量全部切到新库后,旧库可以暂停承载业务,但建议保留只读或反向同步窗口,方便回滚和问题排查。

联机同步的侵入性通常比双写小,但依赖复制链路可靠、延迟可控,适合同构迁移或新旧模型可映射的场景。级联复制还要关注每一跳延迟,避免延迟被放大。

4. 切流、校验与回滚的通用动作

  • 切流顺序:双写方案一般是写双写先跑起来,再灰度读,最后切写;联机同步方案则要先禁写追平,再切写入口,最后切读,避免出现两个主库同时写。
  • 一致性校验:抽样校验加核心业务对账,差异要能定位、修复、复验。
  • 回滚预案:双写方案回滚相对容易,旧库一直完整;联机同步方案回滚时要考虑旧库可能落后于新库,需要反向同步或保留双写窗口。
  • 模型兼容:字段映射、默认值、枚举、时区、字符集、分片键、DDL 变更都要提前考虑,不能只迁移数据不管表结构。

易错点与对比

对比项 双写方案 联机同步方案
原理 应用同时写新旧库,新库可异步 通过主从复制/CDC 让新库追旧库
一致性 旧库强,新库最终一致,需补偿 依赖复制延迟,切换前要追平
侵入性 需要改应用写入逻辑,侵入较高 应用改动少,偏存储层
适用场景 异构迁移、分库分表改造、不能停机 同构迁移、复制链路可靠、可短暂禁写
回滚 旧库完整,回切容易 需反向同步或保留旧库窗口
主要风险 双写失败、重复写、乱序、补偿不幂等 复制延迟、级联延迟、复制回环、DDL 阻塞

常见易错点:

  1. 只同步存量数据,不追增量,切流后新数据丢失。
  2. 新库异步写失败只记日志,没有补偿任务,或补偿任务不幂等。
  3. 只补新增不补更新、删除,导致新旧库状态不一致。
  4. 校验只看条数,不看核心字段和业务关系。
  5. 灰度切流太猛,没有按用户粘滞,出现读己之写问题。
  6. 切流瞬间没有禁写或原子切入口,最后一段写入丢失。
  7. 切换完成后立刻删旧库,缺少回滚窗口。
  8. 分库分表映射、字段映射没处理好,数据搬过去但业务查不出。
  9. 复制链路和应用双写同时写新库,产生重复写或回环。
  10. 忽略 DDL、索引、字符集、时区等模型差异。

小结

面试回答这道题,可以按“目标 -> 方案 -> 步骤 -> 保障 -> 对比”的顺序说:先明确在线、完整、可回滚三个目标;再讲双写和联机同步两条路线;然后展开存量同步、增量追平、灰度切流、一致性校验、失败补偿和回滚窗口;最后对比两种方案的侵入性、一致性和适用场景。

一句话总结:双写是应用层兜底,联机同步是存储层追平;无论哪种方案,都离不开校验、灰度、补偿和可回滚。

License:  CC BY 4.0