如何从单台AWS AMI备份恢复MongoDB副本集且无需全量重同步
副本集恢复报错原因
InvalidReplicaSetConfig报错的根本原因是:三个节点使用同一份AMI启动,local库中存储的副本集成员身份标识、节点host信息完全一致,节点间身份冲突,无法识别彼此为合法副本集成员。你之前的方案删除local库重新初始化相当于重建了所有节点的身份标识,但也触发了全量重同步。
无全量同步恢复方案
三个节点的数据都是同时间点的一致快照,只需要修正副本集配置的身份匹配问题即可,无需重同步数据,操作步骤如下:
前置操作
停止所有3个节点的mongod服务,确保所有节点的dbpath(默认/data)文件权限为mongod:mongod,避免后续启动报错:
sudo service mongod stop sudo chown mongod:mongod -R /data
步骤1:配置主候选节点(以db1为例)
- 单独临时启动db1节点,跳过认证避免权限问题:
sudo -u mongod mongod --dbpath /data --replSet my-rs --noauth --bind_ip 127.0.0.1 &
- 本地连接db1,强制覆盖副本集配置:
mongo // 构造和原副本集参数一致的配置,_id必须和原副本集名相同 const cfg = { _id: "my-rs", version: 1, members: [ {_id: 0, host: "db1.mydomain.com:27017", priority: 2}, {_id: 1, host: "db2.mydomain.com:27017"}, {_id: 2, host: "db3.mydomain.com:27017"} ] }; // 强制重写副本集配置 rs.reconfig(cfg, {force: true});
- 执行
rs.status()确认db1变为PRIMARY状态后,停掉临时进程并正常启动服务:
sudo killall mongod sudo rm -f /tmp/mongodb-27017.sock /var/run/mongodb/mongod.pid sudo service mongod start
步骤2:修复剩余节点的身份标识
db2、db3节点因为是同一份AMI启动,local库存储的自身成员ID和配置不匹配,需要单独修正:
- 临时启动db2节点:
sudo -u mongod mongod --dbpath /data --replSet my-rs --noauth --bind_ip 127.0.0.1 &
- 本地连接修改local库数据:
mongo use local // 清除旧的身份标识 db.system.version.deleteMany({_id: {$in: ["replSetMinOpTime", "replSetIdentity"]}});
- 停掉临时进程正常启动db2:
sudo killall mongod sudo rm -f /tmp/mongodb-27017.sock /var/run/mongodb/mongod.pid sudo service mongod start
- 对db3节点重复上述db2的操作即可。
步骤3:验证集群状态
所有节点正常启动后,连接主节点执行rs.status(),1-2分钟内即可看到所有节点状态同步完成,不会进入长耗时的全量重同步状态,仅需同步启动后生成的极少量oplog即可正常运行。
内容的提问来源于stack exchange,提问作者Dmitry Fink
相关产品推荐
相关产品推荐

