据我所知,oplog文件会将多个更新拆分为单独的更新,但批量插入又如何呢?那些也分成单独的插入?
如果我有一个写密集的集合,大约每30秒插入一批~20K文档,我是否应该考虑增加我的oplog大小超出默认值?我有一个3成员副本集,mongod运行在64位Ubuntu服务器安装上,Mongodb数据位于100GB卷上。
以下是一些可能有用或无用的数据:
gs_rset:PRIMARY> db.getReplicationInfo()
{
"logSizeMB" : 4591.3134765625,
"usedMB" : 3434.63,
"timeDiff" : 68064,
"timeDiffHours" : 18.91,
"tFirst" : "Wed Oct 24 2012 22:35:10 GMT+0000 (UTC)",
"tLast" : "Thu Oct 25 2012 17:29:34 GMT+0000 (UTC)",
"now" : "Fri Oct 26 2012 19:42:19 GMT+0000 (UTC)"
}
gs_rset:PRIMARY> rs.status()
{
"set" : "gs_rset",
"date" : ISODate("2012-10-26T19:44:00Z"),
"myState" : 1,
"members" : [
{
"_id" : 0,
"name" : "xxxx:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 77531,
"optime" : Timestamp(1351186174000, 1470),
"optimeDate" : ISODate("2012-10-25T17:29:34Z"),
"self" : true
},
{
"_id" : 1,
"name" : "xxxx:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 76112,
"optime" : Timestamp(1351186174000, 1470),
"optimeDate" : ISODate("2012-10-25T17:29:34Z"),
"lastHeartbeat" : ISODate("2012-10-26T19:44:00Z"),
"pingMs" : 1
},
{
"_id" : 2,
"name" : "xxxx:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 61301,
"optime" : Timestamp(1351186174000, 1470),
"optimeDate" : ISODate("2012-10-25T17:29:34Z"),
"lastHeartbeat" : ISODate("2012-10-26T19:43:59Z"),
"pingMs" : 1
}
],
"ok" : 1
}
gs_rset:PRIMARY> db.printCollectionStats()
dev_fbinsights
{
"ns" : "dev_stats.dev_fbinsights",
"count" : 6556181,
"size" : 3117699832,
"avgObjSize" : 475.53596095043747,
"storageSize" : 3918532608,
"numExtents" : 22,
"nindexes" : 2,
"lastExtentSize" : 1021419520,
"paddingFactor" : 1,
"systemFlags" : 0,
"userFlags" : 0,
"totalIndexSize" : 1150346848,
"indexSizes" : {
"_id_" : 212723168,
"fbfanpage_id_1_date_1_data.id_1" : 937623680
},
"ok" : 1
}
答案 0 :(得分:12)
当前主要oplog的大小越大,副本集成员能够保持脱机状态而不会落后于主要数据库的时间越长。如果确实落后太多,则需要完全重新同步。
timeDiffHours
返回的字段db.getReplicationInfo()
报告了oplog当前记录的数据小时数。在oplog填满并开始覆盖旧条目之后,然后开始监视此值。特别是在大量写入负载(其中值将减少)下这样做。如果您假设它永远不会低于N小时,则N是您可以容忍副本集成员暂时脱机的最大小时数(例如,用于常规维护,或进行脱机备份,或者在硬件情况下失败)而不执行完全重新同步。然后,该成员可以在重新上线后自动赶上主要成员。
如果您对N的低位感到不满意,那么您应该增加oplog的大小。这完全取决于您的维护时间长,或者您或您的运营团队对灾难情况的响应速度。对于你为它分配多少磁盘空间要自由,除非你迫切需要这个空间。
我假设您在所有副本集成员上保持oplog的大小不变,这是合理的事情。如果没有,则计划具有最小oplog的副本集成员被选为主要的场景。
(回答你的另一个问题:类似于多次更新,批量插入也被分散到oplog中的多个操作中)
编辑:请注意,数据导入和批量插入/更新将显着更快地将数据写入oplog,而不是典型的高负载应用程序。重申一下:保守估计oplog需要花费多长时间才能保守。