凌晨两点,盯着屏幕上的迁移进度条,业务方发来消息:「切了吗?什么时候能切?」
那一刻真正要想的是另一件事:切过去容易,切坏了怎么退?
「MongoDB 迁移」这件事,真正让人睡不着觉的从来不是「怎么搬数据」,而是搬完之后的那几步——停机窗口怎么卡、切流怎么切、切坏了怎么回滚、数据对不对怎么验。这几步,工具教程不讲,官方文档一笔带过,但翻车全在这里。
本文专攻切流、回滚、校验这三件上线前必须想清楚的事。
动数据之前,先把这四件事算清楚:
常见翻车:迁移顺顺利利,切流后新库连接数被打满,业务全线超时——因为只算了数据量,没算切流后的读写规格。
不停机是理想,现实是「尽量短的停机窗口」。窗口构成就三块:
停机窗口 ≈ 增量追平时长 + 切换动作时长 + 观察缓冲能压缩的只有「增量追平」这一段:选业务低峰、先限流部分非核心写,给增量一个追平的机会。
一次靠谱的 MongoDB 迁移,几乎都是「全量 + 增量」两段式:
判断追平的金标准:源端最新 oplog 位点 ≈ 目标端已应用的位点,且落后不再扩大。别只看「任务状态显示完成」,要看位点。
数据追平后,切流按这五步走:
切流的目标不是「快」,是「每一步都留着退路」。
最惨的割接:切到新库半小时才发现问题,旧库已经被删,回退无门。回滚方案必须在切流前写好:
回滚能不能成功,取决于你有没有提前保留旧库和数据位点。
「迁移跑完了」和「迁移跑对了」是两码事。验收四件套:
过不了这四关,就别删旧库。
报错/现象 | 大概原因 | 先查什么 |
|---|---|---|
增量一直追不平 | 写入速率 > 同步速率 | 源库写入 QPS、带宽、同步延迟 |
too stale to catch up | oplog 被覆盖、位点丢失 | oplog 窗口大小、从节点落后时间 |
报「版本不支持」 | 源库版本过旧 | 目标端支持矩阵 |
切完业务还打旧库 | 连接串没切 | 应用配置、DNS/负载均衡 |
新库查询极慢 | 索引缺失 | getIndexes() 对比 |
连接数被打满 | 目标规格不够 | 连接数上限、读写规格 |
迁移任务报 not authorized | 账号权限不足 | 源端读 oplog、目标端写权限 |
MongoDB 迁移真正难的,不是把数据搬过去,而是切流、回滚、校验这三件事有没有提前想清楚。
本文基于生产环境实战总结,欢迎交流。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。