Oplog是用于存储MongoDB数据库所有数据的操作记录的(实际只记录增删改和一些系统命令操作,查是不会记录的),有点类似于mysql的binlog日志。
Oplog的存在极大地方便了MongoDB副本集的各节点的数据同步,MongoDB的主节点接收请求操作,然后在Oplog中记录操作,次节点异步地复制并应用这些操作。
Oplog的默认储存大小
对于unix系统和windows系统
StorageEngine DefaultOplogSize LowerBound UpperBound In-MemoryStorageEngine 5%ofphysicalmemory 50MB 50GB WiredTigerStorageEngine 5%offreediskspace 990MB 50GB MMAPv1StorageEngine 5%offreediskspace 990MB 50GBOplog存储在local库的oplog.rs集合里面。对于一般的线上环境来说,默认的Oplog值就已经足够了。当达到储存大小的日志时,新的记录会将老的记录覆盖。
但是我们系统中如果存在以下操作的话,那么我们就可能需要设置更大的Oplog值来避免数据的丢失(在副本集中数据同步过程):
一次更新多个文件 删除与插入同样数量的数据 大量地更新现有的数据从MongoDB4.0开始,Oplog可以超过其配置的大小限制,以避免删除
一旦mongod第一次创建了Oplog,更改--oplogSize选项将不会影响Oplog的大小。replSetResizeOplog使您可以动态调整Oplog的大小,而无需重新启动该mongod过程。
oplog中每个操作都是幂等性的,也就是说,无论是对目标数据库应用一次还是多次,oplog操作都会产生相同的结果。这样就保证了数据的一致性。
查看Oplog的状态:rs.printReplicationInfo()
fymongodb:PRIMARY>rs.printReplicationInfo() configuredoplogsize:15000MB loglengthstarttoend:7437secs(2.07hrs) oplogfirsteventtime:ThuApr11201909:40:31GMT+0800(CST) oploglasteventtime:ThuApr11201911:44:28GMT+0800(CST) now:ThuApr11201911:44:35GMT+0800(CST)如何查看当前的Oplog存储设置的大小:db.oplog.rs.stats().maxSize
fymongodb:PRIMARY>uselocal fymongodb:PRIMARY>db.oplog.rs.stats().maxSize NumberLong("15728640000")查看Oplog最大大小和现在占用的大小,以及记录时长和时间:db.getReplicationInfo()
fymongodb:PRIMARY>db.getReplicationInfo() { "logSizeMB":15000, "usedMB":0.09, "timeDiff":7797, "timeDiffHours":2.17, "tFirst":"ThuApr11201909:40:31GMT+0800(CST)", "tLast":"ThuApr11201911:50:28GMT+0800(CST)", "now":"ThuApr11201911:50:29GMT+0800(CST)" }更改副本集成员的Oplog大小,更改的值要大于等于990MB,这里设置为1500MB:db.adminCommand({replSetResizeOplog:1,size:15000})
fymongodb:PRIMARY>db.adminCommand({replSetResizeOplog:1,size:15000}) { "ok":1, "operationTime":Timestamp(1554953918,1), "$clusterTime":{ "clusterTime":Timestamp(1554953918,1), "signature":{ "hash":BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="), "keyId":NumberLong(0) } } } #如果我们通过上面命令更改了Oplog的大小,系统是不会自动回收原始分配给Oplog的磁盘空间,我们需要使用compact来回收,在操作compact命令时,副本集成员是无法进行同步数据的。建议在进行回收的时候,不要对数据库进行写入,我们可以通过rs.stepDown()来关闭所有打开的连接。 uselocal db.runCommand({"compact":"oplog.rs"}) #执行报错的话:"willnotruncompactonanactivereplicasetprimaryasthisisaslowblockingoperation.useforce:truetoforce" db.runCommand({"compact":"oplog.rs","force":true})Oplog的值是储存在local库下的集合oplog.rs里的。我们可以分析其中的一条日志,看到到底记录了写什么。
#获取日志 uselocal db.polog.rs.find() #日志内容 {"ts":Timestamp(1554948714,1),"t":NumberLong(7),"h":NumberLong("5670178969026212077"),"v":2,"op":"i","ns":"djx.a","ui":UUID("f0a8c38d-af6b-4fb1-a109-775455dd7f19"),"wall":ISODate("2019-04-11T02:11:54.602Z"),"o":{"_id":ObjectId("5caea26adebe94533fdb42a9"),"name":"youju"}} Oplog的日志由keyvalue组成。 ts的值:表示该日志的时间戳 op的值:i表示insert,u表示update,d表示delete,c表示的是dbcmd,db表示声明当前数据库(其中ns被设置成为=>数据库名称+.),n表示noop,,即空操作,其会定期执行以确保时效性 ns的值:表示操作所在的数据库和集合。 ui的值:表示当前登录用户的会话id值。 wall的值:表示该操作的执行时间,utc时间。 o的值:表示操作的内容,如果是插入,就会将插入的数据放到该位置。示例日志就是插入了一条数据{"name":"youju"}本文内容总结:MongoDBOplog详解,Oplog概念,Oplog常用命令,Oplog日志解析,
原文链接:https://www.cnblogs.com/operationhome/p/10688798.html