【发布时间】:2020-03-06 02:58:24
【问题描述】:
是否可以通过直接在辅助实例上运行删除命令从单个 Mongo 辅助实例中删除数据,而不影响主实例和其他辅助实例?
说明:我想清除大约 500 GB 的大型集合,其中包含大约 5 亿条记录。我想保留最近几个月的数据,所以我将不得不删除约 4 亿条记录。它是一个副本设置,具有一个主节点和 2 个辅助节点。存储引擎是WiredTiger。我不希望任何停机或缓慢,因为它是实时事务系统的生产数据库。我正在考虑以下选项:
- 创建一个新集合,将最近几个月的记录复制到其中,然后删除旧的。但是复制如此庞大的数据会降低数据库服务器的速度。
- 备份整个集合,然后运行批量删除,批量大小为 1000。这将需要数周时间才能删除这么多记录,还会创建巨大的操作日志,因为每次删除都会产生一个将同步的操作日志到次要。这些操作日志会占用大量磁盘空间。
- 另一个选项是我只在一个辅助节点上运行批量删除。删除数据后,我将其提升为主要数据。然后在其他 2 个辅助实例上运行相同的删除。这不会影响 prod 环境。因此问题是:我们可以只在辅助服务器上运行删除吗?一旦这个从节点在删除后回到集群中,主节点和从节点之间的同步过程将是什么行为?
【问题讨论】:
-
我假设无论如何都会创建 oplog,无论您在哪里运行 delete 命令,因此您不会节省任何磁盘空间。即使您从断开连接的辅助节点中删除数据,我认为这将需要很长时间(您将有 3 次)。我想说:即使这种方法可行,您也不会节省任何时间或磁盘空间。
-
即使能够删除,WiredTiger 也不会释放磁盘空间,直到您运行
compact这会在数小时内减慢您的辅助节点 -
@WernfriedDomscheit 我不能在不影响其他任何东西的情况下从断开连接的辅助节点中删除 oplog 吗?长时间仍然是可控的,因为主要关注的是减少生产停机时间和速度。
-
@Valijon 是的,磁盘空间不会被释放,但它可以被未来的写入重用,并且磁盘空间使用增长将会放缓。此外,只有最近几个月的产品数据,选择查询会更快。
-
一旦你清理了你的数据库(不管你打算怎么做),你应该考虑TTL Indexes
标签: mongodb