运维开发网

mongodb master-slave主从复制

运维开发网 https://www.qedev.com 2020-03-16 14:14 出处:网络 作者:运维开发网整理
mongodb的复制使用的oplog,类似于mysql复制的binlog,不同的是oplog是保存在local数据库中的. 需要合理的设置oplog的大小,如果此大小没有设置那么mongodb将会使用可用空间的5%来存放oplog.官方建议64位系统至少分配1G大小. 当slave端落后太多master端的时候,复制会终止,此时需要管理员手工来重启mongodb然后使用resync来重新同步. 此
mongodb的复制使用的oplog,类似于mysql复制的binlog,不同的是oplog是保存在local数据库中的. 需要合理的设置oplog的大小,如果此大小没有设置那么mongodb将会使用可用空间的5%来存放oplog.官方建议64位系统至少分配1G大小. 当slave端落后太多master端的时候,复制会终止,此时需要管理员手工来重启mongodb然后使用resync来重新同步. 此外你可以设置autoresync参数,当复制终止10秒后mongodb会自动重启复制,slave端会每隔10分钟自动重新同步一次. 注意官方现在强烈不建议使用master-slave复制模式,建议使用replica sets复制.

1.参数介绍

这里介绍的mongodb的主从复制,并不是复制集replica sets,复制的参数如下:

   
   
    
      
    
    
      
    
    
      
    
    
      
    
    
      
    
    
      
    
    
      
     < 
     server 
     : 
     port 
     > 
    
    
      
    
    
      
    
    
      
    
   
   Replication options: --oplogSize arg 操作日志大小,单位M Master/slave options (old; use replica sets instead): --master 指定角色为master mode --slave 指定角色为slave mode --source arg 当角色为slave的时候使用,格式为: --only arg 当角色为slave的时候使用,指定单独同步的数据库,默认为同步所有数据库. --slavedelay arg 指定一个应用日志的延时,单位秒 --autoresync 当数据为旧数据时自动同步

2.master参数配置

   
   
    
      
    
    
      
    
    
      
    
    
      
    
    
      
    
    
      
    
    
      
    
   
   [[email protected] log]# cat /etc/mongod.conf port=27017dbpath=/data/dblogpath=/data/log/mongod.logfork = truemaster=trueoplogSize=2048
 
 

3.slave端参数配置

   
   
    
      
    
    
      
    
    
      
    
    
      
    
    
      
    
    
      
    
    
      
    
   
   [[email protected] ~]# cat /etc/mongod.conf port=27017dbpath=/data/dblogpath=/data/log/mongod.logfork = trueslave = truesource = 192.168.56.80:27017

4.启动slave

直接启动slave端:
   
   
    
      
    
    
      
    
    
      
    
    
      
    
   
   [[email protected] data]# mongod -f /etc/mongod.conf about to fork child process, waiting until server is ready for connections.forked process: 2297child process started successfully, parent exiting
当启动slave后,slave端会自动进行初始化resync同步,可以在日志查看到同步信息:
   
   
    
      
    
    
      
    
    
      
    
    
      
    
    
      
    
    
      
    
    
      
    
    
      
    
    
      
    
    
      
    
    
      
    
    
      
    
    
      
    
    
      
    
    
      
    
    
      
    
   
   2016-06-06T23:24:56.225+0800 I REPL [replslave] resync: dropping database suq2016-06-06T23:24:56.225+0800 I REPL [replslave] resync: cloning database suq to get an initial copy2016-06-06T23:24:56.251+0800 I INDEX [replslave] build index on: suq.test2 properties: { v: 1, key: { _id: 1 }, name: "_id_", ns: "suq.test2" }2016-06-06T23:24:56.251+0800 I INDEX [replslave] building index using bulk method2016-06-06T23:24:56.256+0800 I INDEX [replslave] build index done. scanned 4 total records. 0 secs2016-06-06T23:24:56.277+0800 I INDEX [replslave] build index on: suq.test3 properties: { v: 1, key: { _id: 1 }, name: "_id_", ns: "suq.test3" }2016-06-06T23:24:56.277+0800 I INDEX [replslave] building index using bulk method.........2016-06-06T23:24:59.343+0800 I STORAGE [replslave] copying indexes for: { name: "fs.files", options: {} }2016-06-06T23:24:59.344+0800 I REPL [replslave] resync: done with initial clone for db: test2016-06-06T23:25:00.346+0800 I REPL [replslave] syncing from host:192.168.56.80:270172016-06-06T23:25:01.348+0800 I REPL [replslave] syncing from host:192.168.56.80:270172016-06-06T23:25:02.349+0800 I REPL [replslave] syncing from host:192.168.56.80:270172016-06-06T23:25:03.683+0800 I REPL [replslave] syncing from host:192.168.56.80:27017
初始化完毕后会自动进入实时同步.

5.主从管理

查看主从信息

使用 rs.printReplicationInfo()来查看.2.6以前的版本使用 db. printReplicationInfo() master端:
   
   
    
      
    
    
      
    
    
      
    
    
      
    
    
      
    
    
      
    
   
   > rs.printReplicationInfo()configured oplog size: 990MBlog length start to end: 887037secs (246.4hrs)oplog first event time: Fri May 27 2016 17:08:25 GMT+0800 (CST)oplog last event time: Mon Jun 06 2016 23:32:22 GMT+0800 (CST)now: Mon Jun 06 2016 23:32:26 GMT+0800 (CST)
slave端:
   
   
    
      
    
    
      
    
    
      
    
    
      
    
    
      
    
   
   > db.printReplicationInfo()this is a slave, printing slave replication info.source: 192.168.56.80:27017 syncedTo: Mon Jun 06 2016 23:34:12 GMT+0800 (CST) 5 secs (0 hrs) behind the freshest member (no primary available at the moment)
slave端除了可以使用上面的还可以是有那个 rs.printSlaveReplicationInfo() 上面的显示这些内容显示都很简单,就不说明了.

查看主机状态

使用db.serverStatus( { repl: 1 } )来查看
    
    
     
       
     
     
       
     
     
       
     
     
       
     
     
       
     
     
       
     
     
       
     
     
       
     
     
       
     
     
       
     
     
       
     
     
       
     
     
       
     
     
       
     
     
       
     
     
       
     
     
       
     
     
       
     
     
       
     
     
       
     
     
       
     
     
       
     
     
       
     
     
       
     
     
       
     
     
       
     
    
    > db.serverStatus( { repl: 1 } ){ "host" : "mongodb1", "advisoryHostFQDNs" : [ ], "version" : "3.2.6", "process" : "mongod", "pid" : NumberLong(3780), "uptime" : 1029, "uptimeMillis" : NumberLong(1029698), "uptimeEstimate" : 962, "localTime" : ISODate("2016-06-06T15:41:44.864Z"), "asserts" : { "regular" : 0, "warning" : 0, "msg" : 0, "user" : 0, "rollovers" : 0 }, "connections" : { "current" : 3, "available" : 816, "totalCreated" : NumberLong(8) },.........

具体的说明查看官方文档: https://docs.mongodb.com/manual/reference/command/serverStatus/#server-status-repl

slave查询

默认slave端是不能查询的,使用rs.slaveOk()来将slave端设置为可读状态:
   
   
    
      
    
    
      
    
   
   > rs.slaveOk()> 

resync

当slave端落后过多的时候需要进行resync.

WARNING

This command obtains a global write lock and will block other operations until it has completed.

也就是说resync会在master上加一个全局的写锁,会阻塞其它的写操作,直到resync结束.使用数据库命令进行resync:
   
   
    
      
    
    
      
    
    
      
    
   
   > use admin switched to db admin> db.runCommand({"resync":1}){ "ok" : 0, "errmsg" : "not dead, no need to resync" }

6.oplog说明

oplog保存在local数据库中, 具体的local数据库介绍查看官方文档: https://docs.mongodb.com/manual/reference/local-database/

   
   
    
      
    
    
      
    
    
      
    
    
      
    
    
      
    
    
      
    
    
      
    
    
      
    
    
      
    
    
      
    
    
      
    
    
      
    
    
      
    
    
      
    
    
      
    
    
      
    
    
      
    
   
   > use localswitched to db local> show collectionsmeoplog.$mainstartup_log> db.oplog.$main.findOne(){ "ts" : Timestamp(1464340105, 1), "h" : NumberLong(0), "v" : 2, "op" : "n", "ns" : "", "o" : {  }}
ts:8字节的时间戳,由4字节unix timestamp + 4字节自增计数表示。 这个值很重要,在选举(如master宕机时)新primary时,会选择ts最大的那个secondary作为新primary。 op:1字节的操作类型,例如i表示insert,d表示delete。 ns:操作所在的namespace。 o:操作所对应的document,即当前操作的内容(比如更新操作时要更新的的字段和值) o2: 在执行更新操作时的条件,仅限于update时才有该属性。 其中op,可以是如下几种情形之一: "i": insert "u": update "d": delete "c": db cmd "db":声明当前数据库 (其中ns 被设置成为=>数据库名称+ '.') "n": no op,即空操作,其会定期执行以确保时效性 。

扫码领视频副本.gif

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号