首页/数据/NoSQL 速查/数据迁移流程:评估到切流回滚
选型与架构50 条

数据迁移流程:评估到切流回滚

迁移分六步:评估(查询清单与容量)、建目标结构、双写或 CDC 追增量、存量搬迁、校验(行数与校验和抽样)、灰度切流与回滚预案。每一步都要有可度量的完成标准,切流前保持旧路径可回退。

NoSQL 速查数据更新于 2026-10-13

迁移的本质是可控切换

迁移的难点不是把数据搬过去,而是切换过程中新旧两套数据保持一致且随时能退回去。所以流程要拆成可验证的步骤:评估、建目标结构、追增量、搬存量、校验、灰度切流。每一步都要有可度量的完成标准,切流前旧路径必须保持可用。

六步流程

1 评估导出慢查询与访问模式,确认目标引擎能覆盖核心查询;估算容量与成本
2 双写写路径同时写新旧存储,读仍走旧库;记录失败并补偿
3 搬迁批量把存量数据搬到新库,按主键分段、限速、可断点续传
4 校验按时间窗比对行数、聚合指标与抽样明细
5 切流灰度把读流量切到新库,观察后逐步放大;保留回切开关
6 收尾稳定运行一个完整周期后下线双写与旧库,下线前先归档备份

对账示例

对账示例
// MongoDB 侧:按天统计订单量与金额
db.orders.aggregate([
  { $group: { _id: { $dateToString: { date: "$createdAt", format: "%Y-%m-%d" } },
              cnt: { $sum: 1 }, total: { $sum: "$amount" } } },
  { $sort: { _id: 1 } }
])

// ClickHouse 侧:同样口径统计后逐日比对
// SELECT toDate(created_at) AS d, count(), sum(amount) FROM orders GROUP BY d ORDER BY d;

// Elasticsearch 迁移后可用 _count 做量级初筛
// curl -s "localhost:9200/orders-new/_count"

校验与切流要点

  • 增量追平:确认追增量工具的延迟回到秒级,再开始切读流量
  • 分段核对:按天或按主键区间比对,定位差异比全量比对快得多
  • 抽样明细:随机抽若干主键逐字段比对,能发现聚合看不出的字段错位
  • 回滚演练:切流前实际演练一次回切,确认开关真的能用
  • 双写降级:双写失败进补偿队列,队列积压要有告警
对账差距要能解释:时区与精度舍入、软删除过滤、金额小数位是常见差异来源;无法解释的差异在切流前必须查清。
下线旧库是不可逆动作,至少保留一个完整计费或结算周期的数据与可查询入口,再决定是否释放资源。

易错点

  • 一次性全量导入后再补增量,切换瞬间的增量窗口处理不好会丢数据或产生重复记录
  • 校验只看总行数,同数量不同内容的情况真实存在,要加聚合指标与抽样明细比对
  • 追增量工具没有监控延迟,滞后多少不知道就开始切读流量,用户会读到旧数据
  • 双写路径缺少失败补偿,写失败被静默吞掉后只能靠对账才能发现问题
  • 回滚预案只写在文档里没有演练过,真出问题时才发现开关无效或旧库已被改结构

数据来源与参考

  • MongoDB Manual: Migrate to MongoDB
  • Elasticsearch Guide: Reindex
  • ClickHouse Docs: Migrations
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌