这篇文章将为大家详细讲解有关mongodb如何借助一致性全备份加oplogs来添加新节点,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对...
这篇文章将为大家详细讲解有关mongodb如何借助一致性全备份加oplogs来添加新节点,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
一致性备份+oplogs
如果采用直接rs.add的方法添加新节点,需要保证oplog不被覆盖并且需要评估同步oplog的流量影响
问题,所以(一致性备份+oplogs)是我们通常进行横向复制集添加secondary节点的方法,
当数据量大的时候,需要采用下面的方法:
环境描述
主节点 10.9.21.114:27017
两个从节点
10.9.21.178:27017
10.9.21.179:27017
目标:用一致性快照方式添加第三个从节点10.9.21.115:27017
整体步骤简述:
1)主节点或者其中一个从节点上进行一致性快照备份;
2)从节点上进行一致性快照恢复,仅仅对数据部分进行恢复,暂时不要对oplog进行恢复;
3)初始化oplog.rs集合,并恢复oplog记录,恢复oplog记录是为了告诉该节点从哪里去读取主库的oplog,同时如果oplog为空,就会进行initial sync初始化,而初始化的时候会把原来的数据都删除,所以需要恢复oplog;
4)初始化local数据库的其他两个集合db.replset.election(告诉目前的主节点是谁),db.system.replset(存储的是副本集节点信息,当添加进去之后可以自行同步主节点数据,也就是说可以不必恢复它)
5)修改数据库配置并重启数据库(这一步操作前实例不开启认证模式、复制集的配置);
6)用rs.add("HOST_NAME:PORT")命令将从节点添加进集群;
7).用rs.status()观察同步状态并校验数据的完整和一致性;
一.主节点或者其他两个从节点上备份数据,我选择的是一个从节点:
首先在主节点执行insert操作,模拟线上的业务,同时也可以作为最后验证节点添加正常的依据:
MongoDB Enterprise liuhe_rs:PRIMARY> use liuwenhe
switched to db liuwenhe
MongoDB Enterprise liuhe_rs:PRIMARY> for (var i = 0; i < 100000; i++) { db.hezi.insert({id: i}); }
同时执行备份操作,如下,等我备份完成,前面的插入操作还没有结束!
[mongod@beijing-fuli-hadoop-04 ~]$ mongodump -h 10.9.21.179 -u liuwenhe -p liuwenhe --authenticationDatabase admin --oplog -o /data/mongodb/backup/
二.将备份文件scp到192.168.0.3上并进行恢复:
scp -r /data/mongodb/backup mongod@10.9.21.115:/data/mongodb/backup/
三.第三个节点以单实例方式启动:
备注:需要注释掉以下副本集参数
vi /etc/mongod.conf
#replication:
# oplogSizeMB: 51200
# replSetName: liuhe_rs
#security:
# keyFile: /data/mongodb/config/mongodb.key
# authorization: enabled
[mongod@beijing-fuli-hadoop-03 /]$ /usr/bin/mongodb/bin/mongod -f /etc/mongod.conf
about to fork child process, waiting until server is ready for connections.
forked process: 60522
child process started successfully, parent exiting
四:在10.9.21.115上进行一致性快照恢复:
[mongod@beijing-fuli-hadoop-03 /data/mongodb/backup/backup]$ mongorestore --oplogReplay
--dir /data/mongodb/backup/backup/
五:创建oplog.rs集合并初始化大小;
MongoDB Enterprise > use local
switched to db local
注释:因为一致性全备份的时候并不会备份local和config库,并且新创建启动的mongod实例的local库下只有startup_log这个集合如下所示:
MongoDB Enterprise > show collections;
startup_log
MongoDB Enterprise > db.createCollection("oplog.rs",{"capped":true,"size":100000000})
{ "ok" : 1 }
注释:其中capped:true表示创建的集合是循环覆盖的,限制大小的;创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。size单位是KB
六:恢复一致性备份的oplog.rs集合的数据到10.9.21.115:
[mongod@beijing-fuli-hadoop-03 /data/mongodb/backup/backup]$ mongorestore -d local -c oplog.rs /data/mongodb/backup/backup/oplog.bson
2019-12-13T22:29:33.370+0800 checking for collection data in /data/mongodb/backup/backup/oplog.bson
2019-12-13T22:29:33.371+0800 restoring local.oplog.rs from /data/mongodb/backup/backup/oplog.bson
2019-12-13T22:29:33.433+0800 no indexes to restore
2019-12-13T22:29:33.433+0800 finished restoring local.oplog.rs (1378 documents)
2019-12-13T22:29:33.433+0800 done
七:需要查询主节点replset.election集合的数据并将这些数据存储到10.9.21.115节点
在主节点21.114上的操作:
MongoDB Enterprise liuhe_rs:PRIMARY> use local
switched to db local
MongoDB Enterprise liuhe_rs:PRIMARY> db.replset.election.find()
{ "_id" : ObjectId("5dcfb9112670e3e338d03747"), "term" : NumberLong(7), "candidateIndex" : NumberLong(2) }
10.9.21.115节点上保存主节点(21.114)上replset.election集合的数据内容:
MongoDB Enterprise > use local
switched to db local
MongoDB Enterprise > db.replset.election.save({ "_id" : ObjectId("5dcfb9112670e3e338d03747"), "term" : NumberLong(7), "candidateIndex" : NumberLong(2) })
WriteResult({
"nMatched" : 0,
"nUpserted" : 1,
"nModified" : 0,
"_id" : ObjectId("5dcfb9112670e3e338d03747")
})
八:关闭第三个从节点,以副本集方式启动mongodb:
MongoDB Enterprise > use admin
switched to db admin
MongoDB Enterprise > db.shutdownServer()
2019-12-13T22:36:36.935+0800 I NETWORK [js] DBClientConnection failed to receive message from 127.0.0.1:27017 - HostUnreachable: Connection closed by peer
server should be down...
九:以副本集方式启动mongodb
修改第三个从节点配置,注释去掉:
vi /etc/mongod.conf
#replication:
# oplogSizeMB: 51200
# replSetName: liuhe_rs
#security:
# keyFile: /data/mongodb/config/mongodb.key
# authorization: enabled
[mongod@beijing-fuli-hadoop-03 ~]$ /usr/bin/mongodb/bin/mongod -f /etc/mongod.conf
about to fork child process, waiting until server is ready for connections.
forked process: 64136
child process started successfully, parent exiting
十:主节点执行添加节点操作
MongoDB Enterprise liuhe_rs:PRIMARY> rs.add("10.9.21.115:27017")
{
"ok" : 1,
"operationTime" : Timestamp(1576247871, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1576247871, 1),
"signature" : {
"hash" : BinData(0,"p3g5oVNzyiHogsBYfSCpzrBpIks="),
"keyId" : NumberLong("6758082305262092289")
}
}
}
十一:验证是否成功:
1.rs.status()可以看到刚加入的21.115的状态
MongoDB Enterprise liuhe_rs:PRIMARY> rs.status()
2.rs.printSlaveReplicationInfo()查看复制的状态,如下可以看到21.115的信息:
MongoDB Enterprise liuhe_rs:PRIMARY> rs.printSlaveReplicationInfo()
source: 10.9.21.178:27017
syncedTo: Fri Dec 13 2019 22:39:59 GMT+0800 (CST)
0 secs (0 hrs) behind the primary
source: 10.9.21.179:27017
syncedTo: Fri Dec 13 2019 22:39:59 GMT+0800 (CST)
0 secs (0 hrs) behind the primary
source: 10.9.21.115:27017
syncedTo: Fri Dec 13 2019 22:39:59 GMT+0800 (CST)
0 secs (0 hrs) behind the primary
3.在32.115上查看hezi的集合的数据量,这个是最关键的验证,因为你一致性备份的时候,同时还有操作,如果数据量是一样的,那么也就证明,你的21.115节点添加是没有问题了,数据开始同步了
MongoDB Enterprise liuhe_rs:SECONDARY> rs.slaveOk()
MongoDB Enterprise liuhe_rs:SECONDARY> use liuwenhe
switched to db liuwenhe
MongoDB Enterprise liuhe_rs:SECONDARY> db.hezi.count()
221323
在21.114上查看hezi集合的数据量:
MongoDB Enterprise liuhe_rs:PRIMARY> use liuwenhe
switched to db liuwenhe
MongoDB Enterprise liuhe_rs:PRIMARY> db.hezi.count()
221323
对比发现数据是一样的,说明添加节点的工作完成了。。。
关于mongodb如何借助一致性全备份加oplogs来添加新节点就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。