MongoDB oplog详解

在查mongo高cpu的问题,对每个分片启动加上了慢查询的配置,然后在记录慢查询的表中,查询到了很多oplog.rs消耗的时间很长。于是查了一下:

1:oplog简介

oplog是local库下的一个固定集合,Secondary就是通过查看Primary 的oplog这个集合来进行复制的。每个节点都有oplog,记录这从主节点复制过来的信息,这样每个成员都可以作为同步源给其他节点。

 Oplog 可以说是Mongodb Replication的纽带了。

2:副本集数据同步的过程

副本集中数据同步的详细过程:Primary节点写入数据,Secondary通过读取Primary的oplog得到复制信息,开始复制数据并且将复制信息写入到自己的oplog。如果某个操作失败(只有当同步源的数据损坏或者数据与主节点不一致时才可能发生),则备份节点停止从当前数据源复制数据。如果某个备份节点由于某些原因挂掉了,当重新启动后,就会自动从oplog的最后一个操作开始同步,同步完成后,将信息写入自己的oplog,由于复制操作是先复制数据,复制完成后再写入oplog,有可能相同的操作会同步两份,不过MongoDB在设计之初就考虑到这个问题,将oplog的同一个操作执行多次,与执行一次的效果是一样的。

  • 作用:

  当Primary进行写操作的时候,会将这些写操作记录写入Primary的Oplog 中,而后Secondary会将Oplog 复制到本机并应用这些操作,从而实现Replication的功能。
  同时由于其记录了Primary上的写操作,故还能将其用作数据恢复。
  可以简单的将其视作Mysql中的binlog。

3:oplog的增长速度

oplog是固定大小,他只能保存特定数量的操作日志,通常oplog使用空间的增长速度跟系统处理写请求的速度相当,如果主节点上每分钟处理1KB的写入数据,那么oplog每分钟大约也写入1KB数据。如果单次操作影响到了多个文档(比如删除了多个文档或者更新了多个文档)则oplog可能就会有多条操作日志。db.testcoll.remove() 删除了1000000个文档,那么oplog中就会有1000000条操作日志。如果存在大批量的操作,oplog有可能很快就会被写满了。

  • 大小:

  Oplog 是一个capped collection。
  在64位的Linux, Solaris, FreeBSD, and Windows 系统中,Mongodb默认将其大小设置为可用disk空间的5%(默认最小为1G,最大为50G)或也可以在mongodb复制集实例初始化之前将mongo.conf中oplogSize设置为我们需要的值

扫描二维码关注公众号,回复: 2461095 查看本文章

   设置方式三种:

    1>  可在命令行下使用--oplogSize 选项设置该集合大小尺寸,单位是MB

mongod --config share1.conf --oplogSize=2048 

   2> 

MongoDB version 3.6 +

In the MongoDB version 3.6 it is easier to change the oplog size on runtime without restart.

Check current oplog size

use local
db.oplog.rs.stats().maxSize

To change the oplog size to 300 MB

db.adminCommand({replSetResizeOplog: 1, size: 300})

MongoDB version less than 3.6

For older versions you have to follow below steps:

Shutdown the primary server

use admin

db.shutdownServer()

Start primary as standalone & run on different port say 37017

Login to mongo in port 37017

mongo --port 37017

Remove the old contents in local database

For safety have backop of old oplog before dropping

mongodump --db local --collection 'oplog.rs' --port 37017

Drop the old contents in local database

use local

db.oplog.rs.drop()

db.me.drop()

db.replset.election.drop()

db.replset.minvalid.drop()

db.startup_log.drop()

Replset collection cannot be dropped so remove it with required id :

db.system.replset.remove({ "_id" : "your_replsetname"})

Create a new oplog of required size say 300 MB

db.runCommand( { create: "oplog.rs", capped: true, size: (300 * 1024 * 1024) } )

Also you can specify the oplog size in MB in mongod.conf file,say for 300 MB :

replication:
   oplogSizeMB: 300

查看 

rs.printReplicationInfo()     查看 oplog 的状态,输出信息包括 oplog 日志大小,操作日志记录的起始时间。

db.getReplicationInfo()   可以用来查看oplog的状态、大小、存储的时间范围。

字段说明:

  • configured oplog size: oplog文件大小
  • log length start to end: oplog日志的启用时间段
  • oplog first event time: 第一个事务日志的产生时间
  • oplog last event time: 最后一个事务日志的产生时间
  • now: 现在的时间

通过"db.printSlaveReplicationInfo()"可以查看slave的同步状态

副本节点中执行db.printSlaveReplicationInfo()命令可以查看同步状态信息

  • source——从库的IP及端口
  • syncedTo——当前的同步情况,延迟了多久等信息
use local
db.oplog.rs.stats().maxSize
"maxSize": NumberLong("17179869184")

猜你喜欢

转载自blog.csdn.net/zhuchunyan_aijia/article/details/80892990