MongoDB添加secondary节点的两种方法
发布于:2019-12-08 06:46   编辑:admin 

前段时刻保护的一个工作群的其间一条事务线的开发找到运维,提出来了一个mongodb的优化问题,那段时刻mongodb正在从op办理移交给db进行保护,整个部分都对mongodb的运维经历缺少,mongodb的优化更是一个不知道的应战。当op找到我,中心体系的公共服务渠道用来进行短信服务的mongodb集群想进行一次优化,我当仁不能让的承当了这项我都觉得或许搞不定的使命。

    开发找到我提出了两点儿问题,并寻求运维团队处理这个问题,不过终究在我的理性的考虑和他理性的思想磕碰下,终究我仍是以胜利者的姿势胜出。我成功压服了他,并回答了他一些疑问,得到了满意的答复后再也没找我了。当然这儿必定不会就凭几句话,任你理论再怎样丰厚,情绪怎么含糊,不拿点儿实在数据,做点儿什么,怎样能压服经历丰厚的开发确定的事儿。沟通了大半天,占有了我白日的工作时刻,不过他提出来的问题仍是很值得评论。

    依据开发的逻辑,是想横向扩大secondary节点,把其他要求不高的事务放到secondary节点上,减轻primary节点的压力,到达部分读写别离,使得首要事务优先确保。我觉得这个起点是好的,但并没有就此作出回应,其一是他没有认识到这个他以为的有推迟并不是数据库集群的问题,其二是咱们的确缺少有用的资源硬件去进行扩大节点。

不同的事务场景运用不同的架构战略,扩大secondary节点有时分不能处理问题,尤其是那些实时性很高的事务,但有时分扩大secondary节点的确有用,比方硬件晋级后需求做的服务搬迁,需求在线扩大secondary节点来满意事务需求的更高的硬件要求。

    mongodb的secondary节点的扩大,我总结起来有两种办法:1、rs.add直接扩大 2、一致性备份后进行扩大

1、rs.add

具体的完成办法是登陆扩大节点的机器,修正好装备文件,并树立相应的目录和权限,发动mongodb实例就可以了。

需求留意的一点儿是这种扩大办法要确保同步源的数据量级,即确保在同步完数据前mongodb的oplog不会被掩盖,这点儿相似与mysql的redo log日志,假如被掩盖那么同步的数据呈现不一致,导致同步失利。

需求留意的另一点是同步数据的进程中,当集群数据到达必定量级时,同步数据的巨细很大就会对网络形成必定的压力,或许对事务的中心交换机形成影响,因而需求用tc东西对同步流量做限速处理。这个限速需求考虑同步源或许不会是primary,也或许是相同人物的secondary节点,令外限速同步势必会增大同步时刻,这个会增大oplog被掩盖的概率,具体限速值仍是要通过核算才干掌握好。

   2、一致性快照快速增加secondary节点

a)primary节点上进行一致性快照备份

b)secondary节点上进行一致性快照康复,只是对数据部分进行康复,暂时不要对oplog进行康复

     c)初始化oplog.rs调集,并康复oplog记载

     d)初始化local数据库的其他两个调集db.replset.election,db.system.replset

e)修正数据库装备并重启数据库,rs.add将secondary增加进集群并调查同步状况、校验数据的完好和一致性

实践的具体实践进程如下:

1、primary上进行一致性快照备份

 

 1 #primary节点或许其他secondary节点备份数据
 2 [root@172-16-3-190 mongodb]# /opt/app/mongodb/bin/mongodump -uroot -ppwd4mysql --authenticationdatabase=admin --port=27017 --oplog -o /tmp/dump_mongo/
 3 2018-08-20t15:42:47.028+0800 writing admin.system.users to 
 4 2018-08-20t15:42:47.030+0800 done dumping admin.system.users 
 5 2018-08-20t15:42:47.030+0800 writing admin.system.version to 
 6 2018-08-20t15:42:47.031+0800 done dumping admin.system.version 
 7 2018-08-20t15:42:47.032+0800 writing super_hero.user_address to 
 8 2018-08-20t15:42:47.032+0800 writing super_hero.user_info to 
 9 2018-08-20t15:42:47.033+0800 done dumping super_hero.user_address 
10 2018-08-20t15:42:47.033+0800 done dumping super_hero.user_info 
11 2018-08-20t15:42:47.034+0800 writing captured oplog to 
12 2018-08-20t15:42:47.036+0800 dumped 1 oplog entry
14 #检查备份的文件
15 [root@172-16-3-190 mongodb]# ls -lh /tmp/dump_mongo/
16 total 12k
17 drwxr-xr-x 2 root root 4.0k aug 20 15:42 admin
18 -rw-r--r-- 1 root root 110 aug 20 15:42 oplog.bson
19 drwxr-xr-x 2 root root 4.0k aug 20 15:42 super_hero
21 #传递备份到预备增加为secondary的节点上
22 [root@172-16-3-190 tmp]# scp -r -p22222 /tmp/dump_mongo/ liyingxiao@172.16.3.189:/tmp

 

2、secondary节点一致性快照康复

 1 #auth=true
 2 #replset = repl_mongo
 3 #clusterauthmode=keyfile
 4 #keyfile=/opt/app/mongodb/keyfile/mongodb.key
 6 ##康复数据
 7 [root@172-16-3-189 we_ops_admin]# /opt/app/mongodb/bin/mongorestore --oplogreplay --port=27017 /tmp/dump_mongo/ 
 8 2018-08-20t15:56:32.161+0800 preparing collections to restore from
 9 2018-08-20t15:56:32.193+0800 reading metadata for super_hero.user_info from /tmp/dump_mongo/super_hero/user_info.metadata.json
10 2018-08-20t15:56:32.194+0800 reading metadata for super_hero.user_address from /tmp/dump_mongo/super_hero/user_address.metadata.json
11 2018-08-20t15:56:32.222+0800 restoring super_hero.user_address from /tmp/dump_mongo/super_hero/user_address.bson
12 2018-08-20t15:56:32.300+0800 restoring super_hero.user_info from /tmp/dump_mongo/super_hero/user_info.bson
13 2018-08-20t15:56:32.867+0800 no indexes to restore
14 2018-08-20t15:56:32.867+0800 finished restoring super_hero.user_address 
15 2018-08-20t15:56:32.881+0800 no indexes to restore
16 2018-08-20t15:56:32.881+0800 finished restoring super_hero.user_info 
17 2018-08-20t15:56:32.881+0800 restoring users from /tmp/dump_mongo/admin/system.users.bson
18 2018-08-20t15:56:32.993+0800 replaying oplog
19 2018-08-20t15:56:32.997+0800 done

3、初始化oplog.rs调集,并康复oplog记载

创立oplog.rs调集并初始化巨细

1 use local
2 db.createcollection

康复一致性备份的oplog.rs调集的数据到secondary节点

1 [root@172-16-3-189 we_ops_admin]# /opt/app/mongodb/bin/mongorestore -d local -c oplog.rs --port=27017 /tmp/dump_mongo/oplog.bson 
2 2018-08-20t16:12:49.848+0800 checking for collection data in /tmp/dump_mongo/oplog.bson
3 2018-08-20t16:12:49.852+0800 restoring local.oplog.rs from /tmp/dump_mongo/oplog.bson
4 2018-08-20t16:12:49.925+0800 no indexes to restore
5 2018-08-20t16:12:49.925+0800 finished restoring local.oplog.rs 
6 2018-08-20t16:12:49.925+0800 done

4、初始化db.replset.election,db.system.replset调集,其间replset.election需求查询主节点数据并将这些数据存储到secondary节点,或许两个结合自行save到secondary节点。另调集system.replset参加仿制集后可自动识别primary节点内容

1 #primary节点
2 repl_mongo:primary db.replset.election.find
3 { "_id" : objectid, "term" : numberlong, "candidateindex" : numberlong }
4 #secondary节点
5 db.replset.election.save, "term" : numberlong, "candidateindex" : numberlong })

5、修正数据库装备并重启,增加secondary节点到仿制集群中

#auth=true
#replset = repl_mongo
#clusterauthmode=keyfile
#keyfile=/opt/app/mongodb/keyfile/mongodb.key
[root@172-16-3-189 we_ops_admin]# /opt/app/mongodb/bin/mongod --shutdown -f /opt/app/mongodb/mongo.conf 
killing process with pid: 5331
[root@172-16-3-189 we_ops_admin]# vim /opt/app/mongodb/mongo.conf #注释去掉并重启
[root@172-16-3-189 we_ops_admin]# /opt/app/mongodb/bin/mongod -f /opt/app/mongodb/mongo.conf 
about to fork child process, waiting until server is ready for connections.
forked process: 5722
child process started successfully, parent exiting
#增加secondary节点
repl_mongo:primary rs.add
 "ok" : 1,
 "operationtime" : timestamp,
 "$clustertime" : {
 "clustertime" : timestamp,
 "signature" : {
 "hash" : bindata,
 "keyid" : numberlong
}

6、登录增加的secondary节点,验证仿制集状况,数据完好和一致性。

1 [root@172-16-3-189 we_ops_admin]# /opt/app/mongodb/bin/mongo -uroot -ppwd4mysql --authenticationdatabase=admin --port=27017

要点介绍第二种省时省心但吃力费操作的增加secondary节点的办法,实践进程中数据库实例前期去掉认证和仿制集参数,是便利咱们下面的一些需求用户权限的操作,防止树立办理员账号,后续参加集群后自行同步了primary节点的账号。重启后登录secondary节点验证服务的可用性和数据一致性时,运用集群的办理账号进入,不然会报认证的过错。

总结如上两种扩大办法,关于办法1的扩大简略省劲,需求确保oplog不被掩盖和评价同步流量的影响问题,是咱们一般进行横向仿制集增加secondary节点的办法。关于第二种办法,操作繁琐但不必忧虑oplog被掩盖,且操作期间不会过多忧虑网络流量的问题,只是考虑网络传输的流量影响。第一种办法操作时刻周期长,不可控的影响规模大费时费精力,第二种办法操作时刻短,操作的过程多,简单呈现其他问题。