【问题标题】:TTL index on oplog or reducing the size of oplog?oplog上的TTL索引还是减小oplog的大小?
【发布时间】:2025-11-21 20:50:01
【问题描述】:

我在我的应用程序中使用 mongodb 和 elasticsearch。 Elasticsearch 通过监控 oplog 收集来创建索引。当两个应用程序都在持续运行时,对 mongodb 中的集合的任何更改都会立即被索引。我面临的唯一问题是,如果由于某种原因我不得不删除并重新创建索引,那么索引编制需要很长时间(2 天)才能完成。

当我查看我的 oplog 的大小时,默认情况下它的容量是 40gb,它拥有大约 6000 万个事务,因此创建新索引需要很长时间。 优化新索引创建的最佳方法是什么?

是减小 oplog 的大小,使其拥有更少的事务,并且仍然不影响我的复制,还是可以在 oplog 上创建一个 ttl 索引(我多次尝试都失败了)。

我正在使用弹性搜索和 mongodb 使用 mongodb River https://github.com/richardwilly98/elasticsearch-river-mongodb/

对克服上述问题的任何帮助表示赞赏。

【问题讨论】:

    标签: mongodb elasticsearch


    【解决方案1】:

    我不是 Elastic Search Pro,但您的问题是:

    优化新索引创建的最佳方法是什么?

    适用于所有使用第三方 FTS 技术和 MongoDB 的人。

    首先要注意的是,如果您有很多记录,那么除非您准备好丢失其中一些记录,否则没有简单的方法可以解决这个问题。

    oplog 对此并不是一个好主意,您可能应该寻找使用自定义脚本(使用主集合中的计时器)来亲自执行此操作,或者使用更改表让您在一个地方快速查询新的或更新记录。

    除非您过滤 oplog 以获取特定记录,即插入,否则您可能会提取所有 oplog 记录,包括删除、收集操作甚至数据库操作。因此,您可以尝试从 oplog 搜索中删除不需要的记录,但是,这会产生一个新问题; oplog 没有索引或索引更新。

    这意味着,如果您开始以更合适的方式阅读,您实际上将使用对这 6000 万条记录的未索引查询。这将导致性能变慢。

    没有索引更新的oplog回答了你的另一个问题:

    是否可以在 oplog 上创建一个 ttl 索引(我多次尝试都失败了)。

    没有。

    关于你的另一个问题:

    是不是要减小oplog的大小,让它持有更少的事务数

    是的,但是您的复制恢复窗口会更小,不仅如此,您还会丢失“新鲜”索引中的记录,因此实际上只有一部分数据被索引。根据您的问题,我不确定这是否存在问题。

    【讨论】:

    • 感谢您对 TTL 的澄清。就 oplog 大小而言,我正在测试最佳大小,以免复制和索引出现问题。
    • @dittu 好办法是计算你有多少天值得,这就是 oplog 大小应该如何计算,从那里你可以决定你真正需要多少天
    【解决方案2】:

    您可以减少没有副本与之同步的单个辅助成员的 oplog。在 mongodb 文档中查找 rs.syncFrom 和“更改 Oplog 的大小”。

    【讨论】: