迁移的本质是可控切换
迁移的难点不是把数据搬过去,而是切换过程中新旧两套数据保持一致且随时能退回去。所以流程要拆成可验证的步骤:评估、建目标结构、追增量、搬存量、校验、灰度切流。每一步都要有可度量的完成标准,切流前旧路径必须保持可用。
六步流程
| 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"校验与切流要点
- 增量追平:确认追增量工具的延迟回到秒级,再开始切读流量
- 分段核对:按天或按主键区间比对,定位差异比全量比对快得多
- 抽样明细:随机抽若干主键逐字段比对,能发现聚合看不出的字段错位
- 回滚演练:切流前实际演练一次回切,确认开关真的能用
- 双写降级:双写失败进补偿队列,队列积压要有告警
对账差距要能解释:时区与精度舍入、软删除过滤、金额小数位是常见差异来源;无法解释的差异在切流前必须查清。
下线旧库是不可逆动作,至少保留一个完整计费或结算周期的数据与可查询入口,再决定是否释放资源。