MongoDB 副本集用一致性快照方法添加从节点

副本集信息:

192.168.1.1 PRIMARY
192.168.1.2 SECONDARY
192.168.1.3 SECONDARY

192.168.1.4 SECONDARY(新增)

一、步骤:

1.主或从节点上进行一致性快照备份
2.从节点上进行一致性快照恢复,仅仅对数据部分进行恢复,暂时不要对oplog进行恢复
3.初始化oplog.rs集合,并恢复oplog记录
4.初始化local数据库的其他两个集合db.replset.election,db.system.replset
5.修改数据库配置并重启数据库(这一步操作前实例不开启认证模式、复制集的配置)
6.用rs.add("HOST_NAME:PORT")命令将从节点添加进集群
7.用rs.status()观察同步状态并校验数据的完整和一致性

二、备份:

主节点或者其他两个从节点上备份数据:

mongodump -uadmin -padmin --host 192.168.1.1 --authenticationDatabase=admin --port=27017 --oplog -o /data/mongo/backup

将备份传输到192.168.1.4进行恢复:

scp -r /data/mongo/backup mongo@192.168.1.4/data/mongo

三、第三个从节点以单实例方式启动:

备注:需要注释掉以下副本集参数
# auth = true

#replSet = repl_mongo

#keyFile = /data/mongo/27017/replSet.key

启动:
mongod -f /data/mongo/27017/conf/mongodb.conf

在192.168.1.4上进行一致性快照恢复:
mongorestore --oplogReplay --port=27017 /data/mongo/backup

四、创建oplog.rs集合并初始化大小:

>use local

>db.createCollection("oplog.rs",{"capped":true,"size":100000000})

五、查询主节点replset.election集合的数据并将这些数据存储到192.168.1.4节点

在PRIMARY上的操作:若没权限,添加权限:db.grantRolesToUser( "admin", [{ role: "read", db: "local"}])
> use local

> db.replset.election.find()
{ "_id" : ObjectId("60ab1a31c16378e2712acaf4"), "term" : NumberLong(1), "candidateIndex" : NumberLong(0) }

在SECONDARY上保存PRIMARY上replset.election集合的数据内容:

> use local

> db.replset.election.save({ "_id" : ObjectId("60ab1a31c16378e2712acaf4"), "term" : NumberLong(1), "candidateIndex" : NumberLong(0) })

六、关闭第三个从节点,以副本集方式启动mongodb:

修改第三个从节点配置,注释去掉:

auth = true

replSet = repl_mongo

keyFile = /data/mongo/27017/replSet.key

以副本集方式启动mongodb:
mongod -f  /data/mongo/27017/conf/mongodb.conf

七、在PRIMARY上添加SECONDARY节点:若权限不够:db.grantRolesToUser ( "admin", [ { role: "__system", db: "admin" } ] )

> rs.add("192.168.1.4:27017")