迁移策略选择

系统迁移按场景选策略:停机迁移适合小体量与窗口充足;双写加校验适合在线迁移;绞杀者渐进替换适合长期演进;组合使用时明确阶段与回滚点。

迁移策略怎么选

系统迁移的难点不在搬运数据,而在切换期间的业务连续性:写路径存在、数据在变,任何一次切换都会有窗口和差异。按约束选策略——停机迁移最简单但要求有维护窗口;双写加校验适合不能停机、能承受复杂度的场景;绞杀者式渐进替换适合长期演进。组合使用时必须明确阶段划分与回滚点。

基本信息

关键前提数据一致性校验能力要先具备,再谈切流
回滚设计每个阶段都要能退回上一状态,且回滚动作经过演练
灰度手段按流量比例、按租户或按读写分离逐步切换
观测切换期间对比两侧的成功率、延迟与数据差异

典型使用场景

  • 数据库版本升级或换引擎:数据体量大、不能长时间停机
  • 机房或云迁移:跨区域网络带宽与延迟受限,需要分批搬
  • 单库拆分为分库分表:读写分离与双写过渡降低切换风险
  • 遗留系统替换:用绞杀者模式把功能逐块迁出,避免一次性重写
  • 第三方服务替换:旧供应商与新供应商并行一段时间做结果比对

策略

策略适用条件主要成本
停机迁移数据量小、有维护窗口业务中断
双写迁移不能停机、可接受复杂度一致性校验与清理
渐进替换系统长期演进两套并行期维护

阶段划分(双写示例)

阶段划分(双写示例)
阶段 1 双写,旧库为准读旧库,校验差异并修复
阶段 2 双写,抽样读新库比对结果一致率
阶段 3 双写,按比例把读流量切到新库(10%→50%→100%)
阶段 4 新库为准,旧库降为备用,保留回切开关
阶段 5 停止双写,清理旧路径与临时校验任务
# 每个阶段都要有明确的进入条件与回滚动作

使用要点

  • 把校验放前面:数据比对工具与差异处理流程先行,再谈切流
  • 判断差异要能收敛:对持续存在的已知差异建立白名单,否则告警噪音淹没真实问题
  • 回滚开关要有超时与有效期,避免长期挂着两套写入路径
  • 迁移期间的监控口径要保持一致,两侧统计差异要能解释
  • 并行期结束前明确旧路径下线日期与责任人,防止长期双份维护
迁移方案要把校验放前面:数据比对工具与差异处理流程先行,再谈切流,否则差异发现得越晚修复成本越高。
双写期间两套写入失败会形成不一致:必须定义“一边成功一边失败”的处理规则(重试、补偿还是阻断业务),否则数据差异会静默累积。

易错点

  • 无双写校验直接切换,数据差异在业务侧才暴露,事后修复需要人工核对
  • 并行期无人清理旧路径,双写逻辑长期存在,后续每次改动都要改两处
  • 回滚方案只写在文档里没演练,真需要回滚时发现数据已向前写入无法退回
  • 迁移窗口按理想带宽估算,实际传输速率受跨区域链路与限流影响,窗口严重超时
  • 只迁数据不迁依赖:缓存键格式、定时任务与下游订阅没有同步切换,出现长时间功能异常

数据来源与参考

  • 《软件架构:架构模式、特征及实践指南》(Richards & Ford):迁移模式
  • 《Building Microservices(第 2 版)》(Newman):遗留迁移
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌