MongoDB添加secondary节点的2种方法详解

  • A+
所属分类:MongoDB

前言

前段光阴维护的一个奇迹群的此中一条营业线的开发找到运维,提出来了一个MongoDB的优化问题,那段光阴MongoDB正在从op治理移交给db进行维护,整个部分都对MongoDB的运维履历短缺,MongoDB的优化更是一个未知的挑战。当op找到我,焦点体系的公共服务平台用来进行短佩服务的MongoDB集群想进行一次优化,我当仁不克不及让的承担了这项我都感到可能搞不定的义务。

开发找到我提出了两点儿问题,并追求运维团队办理这个问题,不外终极在我的理性的思虑和他感性的思维碰撞下,终极我照样以成功者的姿势胜出。我胜利说服了他,并解答了他一些疑问,获得了满足的回答后再也没找我了。当然这里确定不会就凭几句话,任你理论再怎么丰硕,立场若何暗昧,不拿点儿真实数据,做点儿什么,怎么能说服履历丰硕的开发认定的事儿。沟通了年夜半天,盘踞了我日间的事情光阴,不外他提出来的问题照样很值得讨论。

依据开发的逻辑,是想横向扩充secondary节点,把其他要求不高的营业放到secondary节点上,减轻primary节点的压力,到达部门读写分别,使得主要营业优先保障。我感到这个动身点是好的,但并没有就此作出回应,其一是他没有熟悉到这个他以为的有延迟并不是数据库集群的问题(这里不具体讲述排查的进程,下一篇文章会讲些MongoDB的写入与营业逻辑),其二是我们确切短缺有用的资本硬件去进行扩充节点。

分歧的营业场景利用分歧的架构策略,扩充secondary节点有时刻不克不及办理问题,尤其是那些及时性很高的营业,但有时刻扩充secondary节点确切有用,好比硬件进级后必要做的服务迁徙,必要在线扩充secondary节点来满意营业必要的更高的硬件要求。

MongoDB的secondary节点的扩充,我总结起来有两种方式:

1、rs.add()直接扩充

2、同等性备份落后行扩充(小我叫法)

1、rs.add("大众HOST_NAME:PORT"大众)

详细的实现方式是登岸扩充节点的机械,编纂好设置装备摆设文件,并树立响应的目次和权限,启动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("大众HOST_NAME:PORT"大众)将secondary添加进集群并察看同步状况、校验数据的完备和同等性

实践的具体实践进程如下(仅供参考交流,临盆情况慎用):

1、primary长进行同等性快照备份

#primary节点或者其他secondary节点备份数据
[root@172-16-3-190 mongodb]# /opt/app/mongodb/bin/mongodump -uroot -ppwd4mysql --authenticationDatabase=admin --port=27017 --oplog -o /tmp/dump_mongo/
2018-08-20T15:42:47.028+0800 writing admin.system.users to 
2018-08-20T15:42:47.030+0800 done dumping admin.system.users (1 document)
2018-08-20T15:42:47.030+0800 writing admin.system.version to 
2018-08-20T15:42:47.031+0800 done dumping admin.system.version (2 documents)
2018-08-20T15:42:47.032+0800 writing super_hero.user_address to 
2018-08-20T15:42:47.032+0800 writing super_hero.user_info to 
2018-08-20T15:42:47.033+0800 done dumping super_hero.user_address (1 document)
2018-08-20T15:42:47.033+0800 done dumping super_hero.user_info (1 document)
2018-08-20T15:42:47.034+0800 writing captured oplog to 
2018-08-20T15:42:47.036+0800 dumped 1 oplog entry

#查看备份的文件
[root@172-16-3-190 mongodb]# ls -lh /tmp/dump_mongo/
total 12K
drwxr-xr-x 2 root root 4.0K Aug 20 15:42 admin
-rw-r--r-- 1 root root 110 Aug 20 15:42 oplog.bson
drwxr-xr-x 2 root root 4.0K Aug 20 15:42 super_hero

#通报备份到预备添加为secondary的节点上
[root@172-16-3-190 tmp]# scp -r -P22222 /tmp/dump_mongo/ liyingxiao@172.16.3.189:/tmp

2、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/mongorestore --oplogReplay --port=27017 /tmp/dump_mongo/      
2018-08-20T15:56:32.161+0800 preparing collections to restore from
2018-08-20T15:56:32.193+0800 reading metadata for super_hero.user_info from /tmp/dump_mongo/super_hero/user_info.metadata.json
2018-08-20T15:56:32.194+0800 reading metadata for super_hero.user_address from /tmp/dump_mongo/super_hero/user_address.metadata.json
2018-08-20T15:56:32.222+0800 restoring super_hero.user_address from /tmp/dump_mongo/super_hero/user_address.bson
2018-08-20T15:56:32.300+0800 restoring super_hero.user_info from /tmp/dump_mongo/super_hero/user_info.bson
2018-08-20T15:56:32.867+0800 no indexes to restore
2018-08-20T15:56:32.867+0800 finished restoring super_hero.user_address (1 document)
2018-08-20T15:56:32.881+0800 no indexes to restore
2018-08-20T15:56:32.881+0800 finished restoring super_hero.user_info (1 document)
2018-08-20T15:56:32.881+0800 restoring users from /tmp/dump_mongo/admin/system.users.bson
2018-08-20T15:56:32.993+0800 replaying oplog
2018-08-20T15:56:32.997+0800 done

3、初始化oplog.rs聚拢,并规复oplog记载

创立oplog.rs聚拢并初始化年夜小

 use local
 db.createCollection("大众oplog.rs"大众,{"大众capped"大众:true,"大众size"大众:100000000})

规复同等性备份的oplog.rs聚拢的数据到secondary节点

[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 
2018-08-20T16:12:49.848+0800 checking for collection data in /tmp/dump_mongo/oplog.bson
2018-08-20T16:12:49.852+0800 restoring local.oplog.rs from /tmp/dump_mongo/oplog.bson
2018-08-20T16:12:49.925+0800 no indexes to restore
2018-08-20T16:12:49.925+0800 finished restoring local.oplog.rs (1 document)
2018-08-20T16:12:49.925+0800 done

4、初始化db.replset.election,db.system.replset聚拢,此中replset.election必要查询主节点数据并将这些数据存储到secondary节点,或者两个联合自行save到secondary节点。另聚拢system.replset参加复制集后可主动辨认primary节点内容(这里我采取自行同步数据)

 #primary节点
 repl_mongo:PRIMARY> db.replset.election.find()
 { "大众_id"大众 : ObjectId("大众5b7a6ee5de7a24b82a686139"大众), "大众term"大众 : NumberLong(1), "大众candidateIndex"大众 : NumberLong(0) }
 #secondary节点
 db.replset.election.save({ "大众_id"大众 : ObjectId("大众5b7a6ee5de7a24b82a686139"大众), "大众term"大众 : NumberLong(1), "大众candidateIndex"大众 : NumberLong(0) })

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({"大众_id"大众:1,"大众host"大众:"大众172.16.3.189:27017"大众})
{
  "大众ok"大众 : 1,
  "大众operationTime"大众 : Timestamp(1534752953, 1),
  "大众$clusterTime"大众 : {
    "大众clusterTime"大众 : Timestamp(1534752953, 1),
    "大众signature"大众 : {
      "大众hash"大众 : BinData(0,"大众Tt9nzhoVYdUtGFZnc1Kg1exl0Hc="大众),
      "大众keyId"大众 : NumberLong("大众6591702943026642945"大众)
    }
  }
}

6、登录添加的secondary节点,验证复制集状况,数据完备和同等性。

 [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被笼罩,且操作时代不会过多担心收集流量的问题,仅仅斟酌收集传输的流量影响。第一种方式操作光阴周期长,弗成控的影响规模年夜费时费精神,第二种方式操作光阴短,操作的步调多,容易呈现其他问题。

MongoDB secondary节点呈现recovering状况

MongoDB做了replica sets之后,secondary节点呈现recovering状况

在一次mongo集群挂失落后,重启,发现有一台服务器的mongo节点一直处于recovering状况,不克不及变为secondary或者primary。

查询官方文档后,找到办理计划,在此记载。

呈现缘故原由

备份节点的事情原理进程可以年夜致描写为,备份节点按期轮询主节点上的数据操作,然后对本身的数据副本进行这些操作,从而保证跟主节点的数据同步。

至于主节点上的所稀有据库状况转变的操作,都邑寄存在一张特定的体系表中。备份节点则是依据这些数据进行本身的数据更新。

上面提到的数据库状况转变的操作,称为oplog(operation log,主节点操作记载)。oplog存储在local数据库的"大众oplog.rs"大众表中。副本集中备份节点异步的从主节点同步oplog,然后从新执行它记载的操作,以此到达了数据同步的作用。

关于oplog有几个注意的处所:

oplog只记载转变数据库状况的操作
存储在oplog中的操作并不是和主节点执行的操作完全一样,例如"大众$inc"大众操作就会转化为"大众$set"大众操作
oplog存储在固定聚拢中(capped collection),当oplog的数目跨越oplogSize,新的操作就会笼罩旧的操作

数据同步

在副本集中,有两种数据同步方式:

initial sync(初始化):这个进程产生在当副本集中创立一个新的数据库或此中某个节点刚从宕机中规复,或者向副本集中添加新的成员的时刻,默认的,副本集中的节点会从离它比来的节点复制oplog来同步数据,这个比来的节点可所以primary也可所以拥有最新oplog副本的secondary节点。
该操作一样平常会从新初始化备份节点,开销较年夜
replication(复制):在初始化后这个操作会一直连续的进行着,以坚持各个secondary节点之间的数据同步。

initial sync

当遇到上面例子中无法同步的问题时,只能使用以下两种方式进行initial sync了

第一种方式便是结束该节点,然后删除目次中的文件,从新启动该节点。如许,这个节点就会执行initial sync
注意:经由过程这种方式,sync的光阴是依据数据量年夜小的,假如数据量过年夜,sync光阴就会很长
同时会有许多收集传输,可能会影响其他节点的事情
第二种方式,结束该节点,然后删除目次中的文件,找一个比拟新的节点,然后把该节点目次中的文件拷贝到要sync的节点目次中

总结

以上便是这篇文章的全体内容了,愿望本文的内容对年夜家的进修或者事情具有必定的参考进修代价,假如有疑问年夜家可以留言交流,谢谢年夜家对剧本之家的支撑。

您可能感兴致的文章:

关于mongoose衔接mongodb反复拜访报错的办理方法NodeJS衔接MongoDB数据库时报错的快速办理办法perl操作MongoDB报错undefined symbol: HeUTF8办理办法centos7防火墙导致java法式拜访mongodb3.0.1时报错的问题阐发mongodb replica set 添加删除节点的2种办法Mongodb增长、移除Arbiter节点实例mongodb添加arbiter节点的办法示例MongoDB添加仲裁节点报错:replica set IDs do not match的办理办法

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: