摘要: 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

MongoDB之compact操作详解相关推荐

  1. Cisco 3945路由器密码恢复,rommon模式操作详解

    Cisco 3945路由器密码恢复,rommon模式操作详解 在一次客户的网络出现故障,网络中断,排除故障的原因,发现到达路由器地址不通: 观察到路由器接口灯全部熄灭,电源状态正常: 然后使用cons ...

  2. python输入参数改变图形_Python基于Tensor FLow的图像处理操作详解

    本文实例讲述了Python基于Tensor FLow的图像处理操作.分享给大家供大家参考,具体如下: 在对图像进行深度学习时,有时可能图片的数量不足,或者希望网络进行更多的学习,这时可以对现有的图片数 ...

  3. 第 5 章 Nova - 041 - Resize Instance 操作详解

    Resize Instance 操作详解 Resize 的作用是调整 instance 的 vCPU.内存和磁盘资源. Instance 需要多少资源是定义在 flavor 中的,resize 操作是 ...

  4. SVN的Windows和Linux客户端操作详解

    SVN的Windows和Linux客户端操作详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Windows客户端操作 1.安装SVN客户端 a>.去官网下载svn软件 ...

  5. python对输入的字符串进行解析_python数据类型_字符串常用操作(详解)

    这次主要介绍字符串常用操作方法及例子 1.python字符串 在python中声明一个字符串,通常有三种方法:在它的两边加上单引号.双引号或者三引号,如下: name = 'hello' name1 ...

  6. countif和sum套用_if函数嵌套countif、sumif函数实例操作详解 你需要学习了

    excel中if函数嵌套countif函数实例操作详解,需要了解if函数.countif函数.sumif函数字符串引用方式,isblank函数 操作方法 01 用扫描枪连接excel后将自动将货物名称 ...

  7. Java实现话术词槽匹配_桔子互动|百度UNIT操作详解(上篇)

    原标题:桔子互动|百度UNIT操作详解(上篇) 作者:令狐曦 文章简介: 本篇文章对UNIT的操作和注意事项进行详细说明,内容包括: 建立场景 配置对话单元/问答单元/高级设置 [配置对话单元] [配 ...

  8. python3d动态图-Python图像处理之gif动态图的解析与合成操作详解

    本文实例讲述了Python图像处理之gif动态图的解析与合成操作.分享给大家供大家参考,具体如下: gif动态图是在现在已经司空见惯,朋友圈里也经常是一言不合就斗图.这里,就介绍下如何使用python ...

  9. Pause/Resume Instance 操作详解 - 每天5分钟玩转 OpenStack(34)

    Pause/Resume Instance 操作详解 - 每天5分钟玩转 OpenStack(34) 本节通过日志详细分析 Nova Pause/Resume 操作. 有时需要短时间暂停 instan ...

最新文章

  1. 让逻辑关系破缺的最小空间尺寸
  2. 开机时没有显示Administrator
  3. spring+springmvc+maven+mongodb
  4. Java程序员必备的10个大数据框架
  5. Archive引擎初探
  6. 在ASP.NET AJAX中使用应用程序服务和本地化(4):示例程序:读取、修改并保存用户个性化信息...
  7. 水晶易表调用C#的WebService,返回数据集合
  8. nginx 多php项目配置文件,nginx 配置文件配置多个站点
  9. javascript图片隐写术,感觉可以用它来干点有想法的事情
  10. [USACO10MAR]伟大的奶牛聚集
  11. vue 数组遍历方法forEach和map的原理解析和实际应用
  12. CISCO路由器如何删除配置及%%non-valatile configuration memory is not present无法保存配置...
  13. [转载]U盘文件夹乱码无法删除的原因及解决方案
  14. DB9标准的公头\母头接线定义
  15. 【网络文摘】程序人生:我们工作到底为了什么
  16. JS 生成条形码(一维码)jsBarcode
  17. oppo手机解锁_oppo手机密码解锁大全【图文】
  18. 大数据具备的5大发展爆点,你准备抓住哪个呢?
  19. Java进阶——Java中的字符串常量池
  20. 计算机重启后e盘没了,Win10电脑怎么隐藏磁盘分区?

热门文章

  1. Linux下php安装Redis扩展
  2. Centos 6 安装 配置 oracle11g R2
  3. POJ1003·Hangover
  4. Python matplotlib中文显示异常,导入simhei字体有误
  5. mac terminal常用命令接触
  6. Wix 安装部署教程(十四) -- 多语言安装包之用户许可协议
  7. 五步让你玩转CocoaPods
  8. s := time.Now().Format(20060102) go格式化
  9. 给定n,a求最大的k,使n!可以被a^k整除但不能被a^(k+1)整除。
  10. [待总结]高频率vim命令