我应该增加MongoDB oplog文件的大小吗?

Bri*_*sie 9 mongodb

我知道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
}
Run Code Online (Sandbox Code Playgroud)

J R*_*ssi 12

当前主要oplog的大小越大,副本集成员能够保持脱机而不会落后于主要的时间窗口的时间越长.如果确实落后太多,则需要完全重新同步.

报告timeDiffHours返回的字段db.getReplicationInfo()报告oplog当前记录的数据小时数.在oplog填满并开始覆盖旧条目之后,然后开始监视此值.特别是在大量写入负载(其中值将减少)下这样做.如果您假设它永远不会低于N小时,则N是您可以容忍副本集成员暂时脱机的最大小时数(例如,用于常规维护,或进行脱机备份,或者在硬件情况下)失败)而不执行完全重新同步.然后,该成员可以在重新上线后自动赶上主要人员.

如果你对N的低有多不满意,那么你应该增加oplog的大小.这完全取决于您的维护时间长,或者您或您的运营团队对灾难情况的响应速度.除非你对这个空间有迫切的需求,否则要为它分配多少磁盘空间.

我假设你在所有副本集成员上保持oplog的大小不变,这是合理的事情.如果没有,则计划具有最小oplog的副本集成员被选为主要的场景.

(回答你的另一个问题:类似于多次更新,批量插入也被分散到oplog中的多个操作中)

编辑:请注意,数据导入和批量插入/更新将显着更快地将数据写入oplog,而不是应用程序在典型的高负载下.重申:保守估计oplog需要多长时间才能填写.

  • 更改oplog大小是**HASSLE**,因此创建它们足够大以开始使用守护程序标志"-oplogSize 4096"或类似的数字.**请注意**如果你的盒子上有多个碎片(就像我一样),oplogsize的默认值是磁盘大小的5%(_NOT_可用空间,总大小)意味着盒子上的20个碎片填充了100%的碎片在您添加任何数据之前的空间. (2认同)