MongoDB副本集Oplog空间不足时,4.4+版本(所有节点为4.4且用WiredTiger)可通过replSetResizeOplog在线扩容;4.2及更早版本需逐个滚动重建节点并指定新oplogSize。应关注Secondary的oplog缺失信号,而非timeDiffHours估算值。
很多人习惯盯着 db.getReplicationInfo() 返回的 timeDiffHours,以为这就是“还能撑多久”的安全垫。但这里得泼盆冷水——这个字段其实是主节点基于当前写入速率做的粗略估算,做不得数。真正要盯着看的,是哪个呢?是 Secondary 的行为。
怎么查?很简单:在 Secondary 上跑一句 db.oplog.rs.findOne({ts: {$lt: ObjectId("...")}}),其中的 ObjectId 从主节点 rs.status().members[0].optime.ts 取。要是返回了 null,那就意味着那个时间点之前的日志记录已经彻底被覆盖了——这是最直接的信号。
长期稳定更新的攒劲资源: >>>点此立即查看<<<
还有一些更明显的预警信号:
OplogStartMissing 或者 Need to reclone collection due to oplog gaprs.printSla veReplicationInfo(),发现 lag 值只升不降,而 timeDiffHours 已经比实际的 lag 还要小(比如 lag 已经到了 3600 秒,但 timeDiffHours 显示只剩 0.8)对于升级到 4.4 及以上版本的用户,有一个在线扩容的好工具:replSetResizeOplog。这可不是简单的“改个配置”就完事,它实质是重置 capped 集合的 maxSize,整个过程不重启、不中断读写,体验很好。但话说回来,它有硬性的门槛:
featureCompatibilityVersion 设置为 "4.4"(确认方法:执行 db.adminCommand({setFeatureCompatibilityVersion: "4.4"}))size 参数必须以 Double() 包裹,单位是 MB,并且不能小于 990MB。具体操作也很简单。在主节点上执行类似这样的命令:db.adminCommand({replSetResizeOplog: 1, size: Double(10240)}),这就能把 Oplog 扩容到 10GB。
这里有几个点容易被坑,特别提醒一下:
initial sync 或者状态异常(比如卡在 STARTUP2)的节点执行这个命令。db.getReplicationInfo().maxSizeMB 确认新的上限是否生效。然后,回到 Secondary 上重新用 findOne 测试一下能不能找到旧的时间戳。如果还在用 4.2 或更老的版本,那很遗憾,没有“热修改”这种好事了。网上有些说法,比如直接删 local.oplog.rs 或者用 captrunc 操作,这都是极具误导性的危险操作。强行这么干会破坏集合的 capped 属性,轻则节点无法启动,重则直接导致同步中断。
唯一靠谱的办法,是逐个进行滚动重建。步骤很清晰:
data/db/local/oplog.rs.wt 这个文件(注意:只是删这个文件,不是删整个 local/ 目录,也不是删集合本身)--oplogSize 10240(单位 MB),指定新的 Oplog 大小主节点必须放在最后处理。操作前先得执行 rs.stepDown() 让它降级,并且要确保集群里至少还有一个 Secondary 在线提供写服务,否则整个副本集就不可写了。
这个方案的风险点也必须要知道:每个节点重建期间都需要完整同步一遍所有数据,耗时和数据量成正比。另外,如果是 config server 副本集,逻辑也一样,但必须维持 majority 在线,否则 mongos 路由器就会罢工。
在实际操作中,最常出问题的地方往往不是命令本身,而是执行节奏和权限这些“软环节”:
replSetResizeOplog 这个命令必须在每个节点上单独执行一次。千万别以为只改了主节点就万事大吉了,Secondary 在同步的时候,还是会按照自己本地的 maxSize 来判断 Oplog 是否够用。clusterManager 或 clusterAdmin 角色权限,否则会被无情拒绝。compact 命令来回收未用的空间,但要注意,这个操作会阻塞复制过程,所以只建议在维护窗口期,对已经降级后的节点谨慎操作。db.oplog.rs.stats().maxSize 显示只有 2GB,但你却在配置文件里设了 minRetentionHours: 72,那这仅仅是个“美好的愿望”,实际运行时根本撑不过几小时。物理上的磁盘空间限制,才是真正的硬门槛。