
数据库迁移,最怕的就是「迁移期间业务不能停」。最近一个做游戏业务的朋友就遇到这个难题:自建 MongoDB 要迁到云托管集群,但老板要求迁移期间游戏不能停服。
这类需求在云迁移场景里非常典型。本文按实战顺序,把「不停机迁移」的关键点捋清楚:实时迁移的 pull/push 怎么选、切换窗口怎么卡、迁移完怎么验、回滚怎么退——补全工具文档里一笔带过的部分。
「MongoDB 迁移」至少指向四种不同的场景:
四种场景的目标、工具、停机容忍度都不一样。这张表先把地图摊开:
迁移方向 | 推荐入口 | 是否近零停机 | 一句话定位 |
|---|---|---|---|
自建 Mongo → 云托管 | 实时迁移(live migration) | 是 | 源库在线,目标端引导式搬运 |
集群间一次性/持续同步 | mongosync | 视配置 | 官方集群同步工具 |
备份/快照式搬运 | mongodump + mongorestore | 否(有窗口) | 经典备份恢复式迁移 |
关系型 → MongoDB | Relational Migrator | 否(快照) | 智能建模 + 数据转换 |
Mongo → 国产/关系型库 | 异构 CDC / 云厂商 DTS | 是 | 日志级实时同步 |
一句话:今天要「不停机迁上云」,主力就是第一行的「实时迁移」,后面的是备选和异构场景的补充。
实时迁移(Live Migration)把流程拆成两段:
这里有个反复强调、但容易忽略的前提:
实时迁移要求源集群必须保持在线。因为迁移过程会先迁从节点、最后切换主节点;源集群已经停机的话,没法完成「先迁从、后切主」的动作。
翻译过来就是:实时迁移能省停机时间,但救不了「已经挂了」的库。库已停机的,走备份恢复。
实时迁移下有 pull(拉取)和 push(推送)两种模式:
维度 | pull(拉取) | push(推送) |
|---|---|---|
谁主动 | 目标端从源集群「抽」数据 | 源侧向目标端「推」数据 |
源集群出网方向 | 需要能被目标端访问到 | 源侧主动发起,网络方向相反 |
适用场景 | 源库网络可被外部访问 / 云上源 | 源库在隔离内网、只能出不能进 |
切换对业务影响 | 切换后源库转只读,需停写一小段 | 类似,切换窗口同样要锁写 |
选型一句话:看源库网络是「能进」还是「只能出」。内网机房、有防火墙、只能单向出网的老系统,push 往往更顺;公网或云上的源库,pull 更省事。
反常识的一点:「实时迁移」不等于「零停机」。它只是把停机窗口从「小时级」压到「分钟级」。真正零停机要靠应用层双写或读写分离切流。
不是所有迁移都值得上实时迁移。目标端不是云托管、或者只是「搬一次就完事」的,用自助工具更省心。
三者(实时迁移 / mongosync / mongorestore)的结论对比:
目标端不是 Mongo 生态(国产库、Oracle、数仓)时,走异构 CDC 或云厂商 DTS,以及专业 CDC 工具(如金仓 KFS)。这类工具挂在源库上解析 oplog,把变化实时翻译成目标端语句,具备秒级延迟、按位点断点续传、在线数据比对等能力。
判定就一条:目标端是不是 Mongo 生态。是,走前四条;不是,走异构 CDC / DTS。
工具选对只是第一步,翻车点常在工具之外:
这三件事,是「能不能不停机」的真正决定因素。
数据追平之后,切换五步:
切换窗口的目标不是「快」,而是「可回退」。
迁移前就写好回滚方案:
验收四件套:
能过这四关,才允许删旧库。
「不停机迁上云」的高频踩坑点:
现象/信号 | 大概原因 | 先查什么 |
|---|---|---|
增量永远追不平 | 写入速率 > 同步速率 | 源库写入 QPS、带宽、同步延迟 |
报「版本不支持」 | 源库版本过旧 | 实时迁移支持矩阵 |
切完业务全打旧库 | 连接串没切 | 应用配置、DNS/负载均衡 |
新库查询极慢 | 索引缺失 | getIndexes() 对比 |
全量迟迟搬不完 | 带宽不足 | 数据量 ÷ 带宽估算 |
MongoDB 迁移上云不停机,难的不是工具,是把「版本、带宽、切换、回滚」这四件事提前想清楚。
本文基于生产环境实战总结,欢迎交流。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。