oplog是Capped Collection,默认分配5%的空闲磁盘空间。
来看下oplog.rs的样子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
rs_test:SECONDARY> use local
switched to db local
rs_test:SECONDARY> db.oplog.rs.findOne();
{
"ts"
: Timestamp(1465879171, 238),
"h"
: NumberLong(
"-2275413922284641862"
),
"v"
: 2,
"op"
:
"u"
,
"ns"
:
"MyDB.SyncTable"
,
"o2"
: {
"_id"
:
"bbf80260-3d58-49f1-9c8c-e093d5d57527"
},
"o"
: {
"_id"
:
"bbf80260-3d58-49f1-9c8c-e093d5d57527"
,
"EntityId"
:
"362569"
,
"TypeName"
:
"Product"
,
"Times"
: 14208,
"CreateTime"
: ISODate(
"2014-11-15T14:35:51.916Z"
),
"LastModified"
: ISODate(
"2016-06-14T04:38:21.708Z"
),
"LastOperationTime"
: ISODate(
"2016-06-14T04:39:30.957Z"
)
}
}
|
字段含义
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,即空操作,其会定期执行以确保时效性。修改配置,会产生 "n" 操作。
查询示例
oplog.rs系统集合只用于复制,不能创建索引,查询语句会很慢。
1
2
3
4
5
6
7
8
|
> db.oplog.rs.find({},{
"ts"
:1}).sort({$natural: -1})
{
"ts"
: Timestamp(1406185666, 1) }
{
"ts"
: Timestamp(1406180043, 1) }
{
"ts"
: Timestamp(1406180033, 1) }
{
"ts"
: Timestamp(1406172831, 1) }
{
"ts"
: Timestamp(1406171938, 1) }
> db.oplog.rs.find({
"ts"
: {
"$gte"
: Timestamp(1406185630, 1) } },{
"ts"
:1})
|
查询一小时内的oplog
1
2
3
|
>
var
SECS_PER_HOUR = 3600
>
var
now = Math.floor((
new
Date().getTime()) / 1000)
// seconds since epoch right now
> db.oplog.rs.find({
"ts"
: {
"$lt"
: Timestamp(now, 1),
"$gt"
: Timestamp(now - SECS_PER_HOUR, 1) } }
|
查询某一时间段内的oplog(当然注意时间是UTC存储)
1
2
3
|
>
var
since = Math.floor(ISODate(
"2014-08-12T09:00:00.000Z"
).getTime() / 1000)
>
var
until = Math.floor(ISODate(
"2014-08-12T15:00:00.000Z"
).getTime() / 1000)
> db.oplog.rs.find({
"ts"
: {
"$lt"
: Timestamp(until, 1),
"$gt"
: Timestamp(since, 1) } })
|
聚合统计各个集合的UPDATE操作量
1
2
3
4
|
> db.oplog.rs.aggregate([
{ $match: {
"op"
:
"u"
}},
{ $group: { _id:
"$ns"
,count:{$sum:1}}}
])
|
oplog参考
Replica Set Oplog
https://docs.mongodb.com/manual/core/replica-set-oplog/