摘要: compact操作步骤很多,但是可以有效减少磁盘使用量。
当Fundebug处理的数据越来越多,这导致MongoDB的磁盘使用量越来越多,增长也越来越快。于是,我开始定时删除过期数据,优化算法减少冗余数据。但是,我发现,单纯删除文档不能减少MongoDB磁盘使用量。这是为什么呢?下面是官方文档的解释:
对于WiredTiger存储引擎(mongodb 3.2之后默认使用):How do I reclaim disk space in WiredTiger?
The WiredTiger storage engine maintains lists of empty records in data files as it deletes documents. This space can be reused by WiredTiger, but will not be returned to the operating system unless under very specific circumstances.
也就是说,被删除的文档所占用的磁盘空间仍然由MongoDB保留,不会释放。对于旧版MongoDB的MMAPv1存储引擎,这一点也是一样的。这样做无可厚非,因为数据库将会不断存储新的文档,它们可以利用之前保留的磁盘空间。
但是,如果你删除了很多文档,需要MongoDB释放磁盘空间,应该如何做呢?正如文档所述,对于WiredTiger存储引擎,我们可以使用compact操作来实现。
To allow the WiredTiger storage engine to release this empty space to the operating system, you can de-fragment your data file. This can be achieved using the compact command.
compact操作会重新整理碎片化的磁盘,释放多余的空间。
Rewrites and defragments all data and indexes in a collection. On WiredTiger databases, this command will release unneeded disk space to the operating system.
关于compact操作,我列了几个简单的Q&A。
由于compact操作会阻塞MongoDB的读写操作,因此应该对每个节点依次进行操作。另外,MongoDB复制集的标准维护流程是将Secodary节点暂定,使用单独的端口启动独立的mongo实例进行操作,这样可以复制集完全隔离。
我们Fundebug的MongoDB集群运行在Docker中,因此操作步骤稍微简单一些,可以为大家提供参考。
sudo docker stop mongo |
---|
sudo docker run -it -d -p 37017:27017 -v /data/db:/data/db --name mongo_tmp mongo:3.2 |
---|
mongo 127.0.0.1:37017db.runCommand( { compact : 'events',paddingFactor: 1.1 } ) |
---|
sudo docker rm -f mongo_tmpsudo docker start mongo |
---|
rs.stepDown() |
---|
版权声明:
转载时请注明作者Fundebug以及本文地址:
https://blog.fundebug.com/2018/04/11/mongodb_compact_tutorial/
您的用户遇到BUG了吗?
.copyright * { box-sizing: border-box; }