将 Mongo TTL 索引添加到大 Collection

Add Mongo TTL Index to Large Collection

我在 Mongo 中有一个很大的 collection。大约 17 亿条记录占用大约 5TB 的存储空间 space。我不再需要无限期地保留这些数据,所以我正在寻找摆脱大部分数据的选项,最好基于 "createdAt".

我想知道如果我添加一个 ttl 索引最多只保留一个月的记录会发生什么。我目前有以下索引:

{
        "v" : 1,
        "key" : {
                "createdAt" : 1
        },
        "name" : "createdAt_1",
        "ns" : "someNS.SomeCollection",
        "background" : true
}

mongo 能够多快删除所有这些数据?据我所知,ttl 进程每 60 秒运行一次。每次删除多少数据?

Timing of the Delete Operation

当您在后台建立 TTL 索引时,TTL 线程可以在建立索引的同时开始删除文档。如果您在前台构建 TTL 索引,MongoDB 会在索引构建完成后立即开始删除过期文档。

TTL索引不保证过期数据在过期后立即删除。文档过期时间和 MongoDB 从数据库中删除文档的时间之间可能存在延迟。

删除过期文档的后台任务每 60 秒运行一次。因此,在文档到期和后台任务 运行 之间的时间段内,文档可能会保留在集合中。

Because the duration of the removal operation depends on the workload of your mongod instance, expired data may exist for some time beyond the 60 second period between runs of the background task.

向这样的大型集合添加 TTL 索引确实会影响性能。如果您需要在创建 TTL 时继续查询此集合,您可能会考虑最初创建远在过去的 TTL 索引,这样实际上没有文档会过期。使用 TTL 创建索引后,您可以稍后调整文档的保留时间。

创建该索引后,您可以手动 运行 查询以删除旧数据,直到您接近最新数据并能够调整 TTL,或者提高TTL 缓慢,以便您能够控制性能影响。

(来源:mlab 关于将 TTL 添加到 1TB 集合的建议。如果您不需要在删除旧文档时保持对数据的访问,请完全忽略此建议)