我被困在 MongoDB 3.6 中归档大量数据
我想删除集合中的 5.06 亿条记录。我尝试使用 bulk.remove() 删除,但这也很慢。每秒删除 50 条记录。
但在我读到的某个地方,TTL 索引并每 1 小时进行一次扫描间隔。所以它会以更快的方式删除。
但是如果我在前台创建这个索引,它会锁定集合。所以我正在考虑使用滚动索引创建方法。
如果这样做,假设在 3 节点副本集上,分离 node3 然后创建索引。一旦创建,它将开始自动删除数据。然后一旦我将节点添加回副本集,也许主节点会在我创建索引后执行删除,到时候它会尝试复制,在最坏的情况下,该节点上的数据已经被删除,然后它'会打破复制?
是的,这是在副本集上构建索引的受支持方法。但是,如果您的目标是有效地删除大量现有文档,则需要注意一些注意事项,如下所述。
如果您已经有一个支持查找过期文档的索引,则 TTL 索引不会加速文档的删除:TTL 线程仍然需要查找和删除匹配的文档,因此将执行与批量删除类似的工作。
我会调查为什么您当前的批量删除操作很慢。例如,确保您有一个最佳索引来查找要删除的文档并监控您的系统资源(内存、I/O、网络……),以确保没有任何明显的瓶颈。
如果在创建 TTL 索引时准备好删除大量文档,这可能会对性能产生重大影响。带有支持索引的批量删除查询可以更好地控制影响,因为您可以添加查询条件来限制与每个批量删除匹配的文档范围。
该时间不正确:TTL 删除任务每 60 秒运行一次。基于索引的日期字段,TTL 监视器可以在指定的秒数过去后使文档过期或在特定时钟时间使文档过期。
假设您的文档有一个到期日期范围,一旦过期文档的初始删除完成,TTL 索引将能够以较小的批次删除文档,这将比不频繁的批量删除影响更小。
在 MongoDB 4.2 之前,在填充集合上构建的前台索引将阻止保存该集合的数据库上的所有其他操作。对于生产环境中的填充集合,您肯定希望使用滚动索引构建或后台索引构建。滚动索引构建确保只有一个副本集成员正在构建索引,并允许前台索引构建更快地完成,但是这种方法确实存在该成员在独立模式下运行时变得陈旧的风险。
MongoDB 4.2+ 使用优化的索引构建过程,将锁定范围限制为受影响的集合,并且仅在索引构建的开始和结束时持有排他锁。您仍然可以使用滚动索引构建方法,但不再有前台与后台索引构建的区别。
副本集成员上的TTL 索引线程仅在成员处于主状态时删除文档。文档删除通过 oplog 复制,因此辅助节点始终与当前主节点具有一致的时间点。
如果您在独立模式下重新启动副本集成员,则不会启动 TTL 收集监视器(再次保持辅助状态一致)。