我一直在使用本地主机(docker)版本的 mongodb 和副本集在本地开发一个应用程序,这样我就可以使用变更流功能。我的Python应用程序(使用pymongo)能够愉快地观看steam,并存储resume_token。停止和启动我的应用程序可以无缝工作,并从商店resume_token恢复。
我的下一步是使用 mongo 的托管版本。当我仍在测试时,我在 Atlas 上选择了 M0 实例。星期五(10 月 24 日),我能够将我的应用程序连接到 atlas 数据库,一切运行良好,我能够创建文档并接收更改事件,没有任何问题,包括重新启动我的应用程序。
今天(10 月 21 日星期一),当我尝试启动我的应用程序时,它陷入了错误状态,因为无法找到resume_token。当我检查数据库时,local.oplog.rs 集合中没有数据(完全为空),尽管几天前就有了。我的应用程序整个周末都关闭,所以它没有破坏任何东西。
因此,我创建了一些手动条目来测试,并且 oplog 再次填充了适当的条目(仅是新条目)。
谁能解释一下为什么我的oplog被清空了?我已经尝试了几个小时来查找有关 M0 帐户限制的文档,尽管存在差异,但没有任何内容表明 oplog 会被清除。这是一个真正的问题。
如果在 M0 计划中使用 oplog 时出现问题,我可以使用的最低计划是什么,这将为我提供可靠的 oplog(我知道大小会使其删除条目,但我没有在db 更改大小)?
因此,在与 Atlas 联系后,他们确实记录了删除超过 24 小时的记录的事实。
这很微妙,而且它与 storage.oplogMinRetentionHours 相关联。该文档明确指出,在删除 oplog 日志之前,必须超过 oplog 容量和 minRetention。我的包含 3 条记录的 oplog 不可能超出任何 oplog 容量设置(除非 Atlas 默认将其设置为 0),所以我觉得这充其量是令人困惑的。
共享(M0/M2/M5)计划也无法设置 oplogMinRetentionHours 值,这在文档中更加明显。