MongoDB-Oplog详解
本文内容纲要:
-MongoDBOplog详解
-Oplog概念
-Oplog常用命令
-Oplog日志解析
MongoDBOplog详解
Oplog概念
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 | 50GB |
Oplog存储在local库的oplog.rs集合里面。对于一般的线上环境来说,默认的Oplog值就已经足够了。当达到储存大小的日志时,新的记录会将老的记录覆盖。
但是我们系统中如果存在以下操作的话,那么我们就可能需要设置更大的Oplog值来避免数据的丢失(在副本集中数据同步过程):
- 一次更新多个文件
- 删除与插入同样数量的数据
- 大量地更新现有的数据
从MongoDB4.0开始,Oplog可以超过其配置的大小限制,以避免删除
一旦mongod第一次创建了Oplog,更改
--oplogSize
选项将不会影响Oplog的大小。replSetResizeOplog使您可以动态调整Oplog的大小,而无需重新启动该mongod
过程。
oplog中每个操作都是幂等性的,也就是说,无论是对目标数据库应用一次还是多次,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日志解析
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