MongoDB 的Replication是通过一个日志来存储写操作的,这个日志就叫做oplog。journal是Mongodb中的redo log,而Oplog则是负责复制的binlog(对应Mysql)。
在默认情况下,oplog分配的是5%的空闲磁盘空间。通常而言,这是一种合理的设置。可以通过mongod –oplogSize来改变oplog的日志大小。Oplog和数据刷新到磁盘的时间是60s,对于复制来说,不用等到oplog刷新磁盘,在内存中就可以直接复制到Sencondary节点。
oplog是capped collection,因为oplog的特点(不能太多把磁盘填满了,固定大小)需要,MongoDB才发明了capped collection(the oplog is actually the reason capped collections were invented).
1.oplog的位置
oplog在local库:
master/slave 架构下
local.oplog.$main;
replica sets 架构下:
local.oplog.rs
sharding 架构下,mongos下不能查看oplog,可到每一片去看。
mongos> use local
switched to db local
mongos> show collections
Fri Mar 20 10:01:12 uncaught exception: error: { "$err" : "can't use 'local' database through mongos", "code" : 13644 }
2.oplog的格式
最新版本oplog格式
PRIMARY> db.version()
2.6.8
PRIMARY> db.oplog.rs.findOne()
{
"ts": {
"t": 1426646274000,
"i": 6
},
"h": NumberLong("6846668337808060067"),
"v": 2,
"op": "i",
"ns": "test.user",
"o": {
"_id": ObjectId("5508e502ac30b834a5de99fd"),
"name": "test15",
"age": 40,
"addr": "beijing"
}
}
ts:8字节的时间戳,由4字节unix timestamp + 4字节自增计数表示。
这个值很重要,在选举(如master宕机时)新primary时,会选择ts最大的那个secondary作为新primary。
op:1字节的操作类型,例如i表示insert,d表示delete。
ns:操作所在的namespace。
o:操作所对应的document,即当前操作的内容(比如更新操作时要更新的的字段和值)
o2: 在执行更新操作时的where条件,仅限于update时才有该属性
其中op,可以是如下几种情形之一:
“i”: insert
“u”: update
“d”: delete
“c”: db cmd
“db”:声明当前数据库 (其中ns 被设置成为=>数据库名称+ ‘.’)
“n”: no op,即空操作,其会定期执行以确保时效性 。
3.查看oplog的内容
PRIMARY> db.oplog.rs.findOne({"ns" : "test.user"})
{
"ts": {
"t": 1426646274000,
"i": 1
},
"h": NumberLong("-5377635681665944425"),
"v": 2,
"op": "i",
"ns": "test.user",
"o": {
"_id": ObjectId("5508e502ac30b834a5de99f1"),
"name": "test3",
"age": 40,
"addr": "beijing"
}
}
4.查看oplog的状态
PRIMARY> db.printReplicationInfo();
configured oplog size: 100MB
log length start to end: 103607secs (28.78hrs)
oplog first event time: Wed Mar 18 2015 10:27:55 GMT+0800 (CST)
oplog last event time: Thu Mar 19 2015 15:14:42 GMT+0800 (CST)
now: Fri Mar 20 2015 10:22:08 GMT+0800 (CST)
5.查看从库同步状态
PRIMARY> db.printSlaveReplicationInfo();
source: 192.168.110.71:10001
syncedTo: Thu Mar 19 2015 15:14:42 GMT+0800 (CST)
= 68873 secs ago (19.13hrs)
source: 192.168.100.90:10001
syncedTo: Thu Mar 19 2015 15:14:42 GMT+0800 (CST)
= 68873 secs ago (19.13hrs)
输出信息包括从库的主机名,port 信息等。
6.oplog 的应用
参考: http://www.cnblogs.com/huangfox/p/3484497.html
参考文章:
http://docs.mongodb.org/manual/core/replication/#replica-set-oplog-sizing
http://docs.mongodb.org/manual/reference/local-database/
http://www.ttlsa.com/mongodb/in-depth-analysis-of-mongodb-oplog/
http://www.cnblogs.com/daizhj/archive/2011/06/27/mongodb_sourcecode_oplog.html