资讯专栏INFORMATION COLUMN

MongoDB之compact操作详解

Forelax / 1732人阅读

摘要:摘要操作步骤很多,但是可以有效减少磁盘使用量。关于操作,我列了几个简单的。操作效果怎么样减少了接近的磁盘空间,这个大小应该与被删除的文档数量有关。操作步骤由于操作会阻塞的读写操作,因此应该对每个节点依次进行操作。

摘要: compact操作步骤很多,但是可以有效减少磁盘使用量。

MongoDB与磁盘

当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操作

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是否会阻塞数据库读写?会!因此不能在高峰期进行compact操作;对于复制集,应该对每个节点依次进行compact操作。

compact是否可以释放磁盘空间?对于WiredTiger,是可以的;但是对于WiredTiger存储引擎,并不会,多余的磁盘空间仍然会保留给MongoDB。

compact操作是否会占用额外的磁盘空间?根据我的观察,基本上不会。

paddingFactor应该设为多少?我设置的值是1.1,这样可以为每个文档留一些多余空间,提高修改性能。这个值可以根据实际需要进行设置。

compact操作需要多少时间?一个400G的复制集节点,我花了不到1个小时。这样时间应该与数据量大小有关。

compact操作效果怎么样?减少了接近50%的磁盘空间,这个大小应该与被删除的文档数量有关。

compact操作步骤

由于compact操作会阻塞MongoDB的读写操作,因此应该对每个节点依次进行操作。另外,MongoDB复制集的标准维护流程是将Secodary节点暂定,使用多带带的端口启动独立的mongo实例进行操作,这样可以复制集完全隔离。

我们Fundebug的MongoDB集群运行在Docker中,因此操作步骤稍微简单一些,可以为大家提供参考。

Secondary节点

关闭mongodb容器

sudo docker stop mongo

启动独立的临时mongodb容器

sudo docker run -it -d -p 37017:27017 -v /data/db:/data/db --name mongo_tmp mongo:3.2

执行compact命令

mongo 127.0.0.1:37017
db.runCommand( { compact : "events",paddingFactor: 1.1 } )

重启mongodb节点

sudo docker rm -f mongo_tmp
sudo docker start mongo
Primary节点

将Primary节点变为Secondary节点

rs.stepDown()

按照secondary节点进行操作

参考

MongoDB文档:compact

MongoDB文档:Perform Maintenance on Replica Set Members

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/19257.html

相关文章

  • Java NIO Buffer(缓冲区)

    摘要:一缓冲区介绍用于和交互。的容量,位置,上限缓冲区实质上就是一块内存,用于写入数据,也供后续再次读取数据。在每个类中,方法用于分配缓冲区。没有这句话会报错将此缓冲区的位置重置为先前标记的位置。返回此缓冲区的限制。 一 Buffer(缓冲区)介绍 Java NIO Buffers用于和NIO Channel交互。 我们从Channel中读取数据到buffers里,从Buffer把数据写入到...

    gitmilk 评论0 收藏0
  • mongodb 存储

    摘要:存储概念是分类的存储来是数据文件的大小。这个操作会禁止数据的访问,所以不能够轻易地执行。有两个明显的缺点。必须禁止访问数据库一段时间。需要同等的硬盘及。可以通过构建来防止空间占据过大。 mongodb 存储 db.stats() { db : exemplum, collections : 10, objects : 110857, avgObjSize : 239...

    PAMPANG 评论0 收藏0
  • mongodb

    摘要:并依赖于提供的机制提供高数据可靠性,目前支持单机事务。源通知目标开始同步数据源收到发送的命令后,会向目标发送的命令,通知目标开始迁移数据真正的数据迁移由目标主动发起。源收到的结果,整个数据迁移的步骤完成。 本文分两部分,分布式和单机。单个db的存储引擎,物理和数据存储简介,事务实现等。分布式架构,分布式涉及的复制集,分片等可靠性和扩展性保障。 第一部分 单机存储引擎介绍mondod 引...

    lscho 评论0 收藏0
  • MongoDB复合索引详解

    摘要:摘要对于的多键查询,创建复合索引可以有效提高性能。不妨通过一个简单的示例理解复合索引。但是,使用的是与的复合索引即根据索引去查询文档,不需要过滤。可以推测,应该是索引的问题导致的。 摘要: 对于MongoDB的多键查询,创建复合索引可以有效提高性能。 showImg(https://segmentfault.com/img/bV5PFN?w=800&h=450); 什么是复合索引? 复...

    qieangel2013 评论0 收藏0

发表评论

0条评论

Forelax

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<