如何不停机跨AWS账户迁移MongoDB副本集数据(不使用Atlas)
跨AWS账户MongoDB副本集零停机迁移方案
你提到的「先在目标AWS账户新增副本集第4个节点、后续逐步扩容目标侧节点再下线源侧节点」的方案完全可行,是符合零停机要求、无需使用Atlas工具的最优方案,具体操作流程如下:
前置准备
- 打通两个AWS账户的网络:通过VPC对等连接或Transit Gateway实现两个VPC的内网互通,确认源侧和目标侧的安全组都放开对方所有节点的MongoDB服务端口(默认27017)入方向访问权限
- 目标侧节点配置对齐:新节点的MongoDB版本、硬件配置、存储配置、操作系统参数(ulimit、目录权限、时区等)完全和源侧节点保持一致,避免同步异常
- 确认oplog窗口足够:登录源副本集Primary节点执行
rs.printReplicationInfo(),确认oplog保留时长大于新节点全量同步+追齐增量的预计耗时,避免同步过程中oplog被覆盖 - 认证配置对齐:如果源副本集开启了身份认证,将源侧使用的keyfile完整复制到所有目标侧新节点,保证集群节点间认证正常
操作步骤
步骤1:添加目标账户首个节点到源副本集
- 启动目标侧新节点的MongoDB进程,配置文件中
replication.replSetName参数值和源副本集名称完全一致 - 登录源副本集Primary节点,执行命令添加新节点,建议临时调低新节点的优先级和投票权避免影响源集群稳定性:
rs.add({host: "目标节点内网域名/IP:端口", priority: 0, votes: 0}) - 执行
rs.status()查看新节点状态,待状态变为SECONDARY、且optime和Primary节点差值稳定在1s以内,说明同步完成
步骤2:完成目标侧集群扩容
按照步骤1的操作,在目标账户再添加2个节点,待3个目标侧节点全部同步完成后,整个副本集群变为6节点(3个源侧节点+3个目标侧节点)
步骤3:切换主节点到目标侧
- 登录当前Primary节点,调整节点优先级和投票权:将3个目标侧节点的
priority和votes都设为1,将3个源侧节点的priority设为0、votes设为0,执行rs.reconfig()使配置生效 - 执行
rs.stepDown()触发主节点退位,集群会自动选举目标侧的节点作为新的Primary,执行rs.isMaster()确认主节点归属正常
步骤4:下线源侧节点
- 逐个移除源侧的3个节点,每次移除后等待
rs.status()显示集群状态稳定再执行下一次操作,移除命令为:rs.remove("源节点内网域名/IP:端口") - 所有源侧节点移除完成后,修改业务侧的MongoDB连接串指向目标侧节点,或修改域名解析记录指向目标侧节点,迁移全程无业务停机
注意事项
- 节点同步过程中尽量避免执行大批量数据删改操作,防止oplog被快速覆盖导致同步失败
- 迁移完成后可对核心业务集合执行
db.runCommand({validate: "集合名"})校验数据一致性 - 如果不选择跨集群加节点的方案,也可以采用全量备份+增量oplog追齐的方式迁移,但需要手动切写,无法做到完全无停机,优先级低于上述方案
内容的提问来源于stack exchange,提问作者user2710961
相关产品推荐
相关产品推荐

