MongoDB之compact操作详解

摘要: 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:37017db.runCommand( { compact : 'events',paddingFactor: 1.1 } )

  • 重启mongodb节点

sudo docker rm -f mongo_tmpsudo docker start mongo

Primary节点

  • 将Primary节点变为Secondary节点

rs.stepDown()

  • 按照secondary节点进行操作

参考

版权声明:
转载时请注明作者Fundebug以及本文地址:
https://blog.fundebug.com/2018/04/11/mongodb_compact_tutorial/

您的用户遇到BUG了吗?

体验Demo 免费使用

.copyright * { box-sizing: border-box; }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java一日一条

9 个使用前必须再三小心的 Linux 命令

Linux Shell/terminal 命令非常强大,即使一个简单的命令就可能导致文件夹、文件或者路径文件夹等被删除。

451
来自专栏Netkiller

数据库恢复方案

目录 1. 背景 2. 备份方式分析 3. 恢复方案 3.1. 第一种 3.2. 第二种 3.3. 第三种 3.4. 第四种 4. 手工恢复 1. 背景 我们来...

2778
来自专栏腾讯Bugly的专栏

dex分包变形记

一、背景 就在项目灰度测试前不久,爆出了在 Android 3.0以下手机上安装时出现 INSTALL _ FAILED_DEXOPT,导致安装失败。这一问题意...

31111
来自专栏月色的自留地

新麦装机问题汇

1273
来自专栏技术博文

linux命令总结

cat tail -f 日 志 文 件 说明 /var/log/message 系统启动后的信息和错误日志,是Red Hat Linux中最常用的日志之一...

31310
来自专栏程序员互动联盟

【编程基础第八讲】如何选择Android模拟器?

存在问题: android开发如何选择一款好的模拟器? 解决方案: ? 网友们经常会问一些关于Android模拟器的问题,我今天就给大家总结一下。 1、Andr...

3417
来自专栏张戈的专栏

桌面白屏(Active故障)修复批处理

一年前我在做用户系统维护服务工作时发现 AD 域环境下,AD 用户桌面经常会出现壁纸无法显示,ActiveDesktop 桌面损坏之类的故障,当时从前人心得里学...

3186
来自专栏数据小魔方

Excel多工作薄合并

今天要给大家介绍一下Excel多工作表合并的技巧! 由于Excel工作薄文件可以包含多个工作表,所以合并起来要比Word麻烦! 目前还无法单纯通过Excel界面...

2656
来自专栏北京马哥教育

9 个使用前必须再三小心的 Linux 命令

Linux shell/terminal 命令非常强大,即使一个简单的命令就可能导致文件夹、文件或者路径文件夹等被删除。 在一些情况下,Linux 甚至不会询问...

3246
来自专栏FreeBuf

基于Python的远程管理工具(RAT) – Stitch

Stitch是一款基于Python的跨平台远程管理工具。由于其跨平台性,Stitch允许用户针对Windows, Mac OSX 或 Linux分别定制不同的p...

1955

扫码关注云+社区