文章目录

  • 一、如何判断碎片化
  • 二、如何处理碎片化
    • 2.1 compact
    • 2.2 各存储引擎下compact如何释放空间
  • 三、常见处理碎片化方案
    • 3.1 直接操作
    • 3.2 重建collection
    • 3.3 单节点启动方式循环处理

一、如何判断碎片化

1、数据库空间占用信息查询

1)查看数据库存储空间占用

-- 通过db.stats()函数查询storageSize参数大小
use db
db.stats()
-- 直接查看目标DB物理存储大小
use db
db.runCommand({dbStats : 1,scale : 1073741824})   //scale指定单位为GB

2)查看集合存储空间占用

-- 通过db.collname.stats()函数查询storageSize参数大小
use db
db.collname.stats()
-- 直接查看目标DB物理存储大小
use db
db.runCommand({"collStats":"oplog.rs",scale:1048576})  //scale指定单位,单位为MB

2、碎片化问题查看,查看目前集合可回收空间

db.collname.stats().wiredTiger["block-manager"]["file bytes available for reuse"]rs0:PRIMARY> db.aa.stats().wiredTiger["block-manager"]["file bytes available for reuse"]
16384

二、如何处理碎片化

2.1 compact

1、语法

db.runCommand({compact:'dsir',force:true})

2、compact所需权限

use admin
db.createRole({role: "myCustomCompactRole",privileges: [{resource: { "db" : "<database>" , "collection" : "<collection>" },actions: [ "compact" ]}],roles: []}
)db.grantRoleToUser("myCompactUser", [ "dbAdmin" | "myCustomCompactRole" ] )

3、compact主要做了哪些操作?

1)检查所操作compact集合是否满足条件

  • 前面80%的空间里,是否有20%的空闲空间,用于写入文件后面20%的数据
  • 前面90%的空间里,是否有10%的空闲空间,用于写入文件后面10%的数据

2)若满足任一条件,引擎层开始执行compact,执行期间阻塞该DB上左右读写操作,并将该集合文件后面的数据往前面空闲的空间写,然后逐步 truancate 文件回收物理空间。

3)若不满足以上任一条件,说明执行compact肯定无法回收10%的物理空间,那么该集合当前无需进行compact,直接退出compact操作。

4、compact的影响

1)compact 一个集合,会加集合所在DB的互斥写锁,会导致该DB上所有的读写请求都阻塞;而且 compact 执行的时间跟集合的数据量相关,数据量越大compact执行时间越久,所以强烈建议在业务低峰期执行,避免影响业务。

2)如果您使用db.killOp()方法终止操作,或者在压缩操作完成之前重启服务器,请注意以下事项:

  • 如果启用了日志记录,无论压缩操作的状态如何,数据都将保持有效和可用。您可能必须手动重新构建索引。
  • 如果没有启用日志记录,当compact操作被中断时,无法保证数据有效性
  • 在这两种情况下,集合中现有的大部分空闲空间都可能无法重用。需要重新执行compact恢复对空间空间的使用。

3)compact操作在每个节点都是独立的,不会随着primary节点的操作传递到secondary节点;

4)如果想要在primary节点执行conpact操作,需要标识force:true;

5)在secondary节点执行compact操作时,该节点的状态会转换为RECOVERING,期间业务无法访问该节点;

2.2 各存储引擎下compact如何释放空间

1、WiredTiger

1)compact操作会释放data和index的空间给操作系统;
2)compact执行需要额外的一部分空间。

2、MMAPv1

1)commpact操作可以减少data空间,并且重建index,但是这些空间不会归还给操作系统,只会留给MongoDB供之后的数据写入;
2)如果想要回收MMAPv1的磁盘空间,需要执行initial sync;
3)执行compact操作至少需要当前实例还有2G的空闲空间才可执行。

三、常见处理碎片化方案

3.1 直接操作

  • 单节点环境下
    直接进行compact操作

  • 副本集环境下
    1)业务低峰期,在secondary节点执行compact命令;
    2)将已经compact完毕的secondary节点提升为primary节点;
    3)对降级为secodary的节点做compact。

3.2 重建collection

新添加一个secondary节点,然后将该节点升级为primary节点(数据量非常大的情况下为了不影响业务)

3.3 单节点启动方式循环处理

1)将副本集中某一secondary节点以单节点方式启动,并执行compact命令处理集合碎片化

2)将碎片化处理完毕的节点重新以副本集的方式启动,会将该节点提升为primary节点

3)以1)的方式对其余secondary节点进行碎片化处理

文档参考:

https://docs.mongodb.com/manual/reference/command/compact/index.html
https://blog.csdn.net/u013162930/article/details/78580083

MongoDB磁盘空间碎片化问题排查指南相关推荐

  1. linux磁盘空间不释放问题排查

    查看磁盘空间使用情况,发现opt已使用 df -Th 但是opt目录大小不到100G du -h --max-depth=1 百度查到的是删除某些大文件被某些进程占用,导致内核不能释放空间,不能更新磁 ...

  2. 为什么越学反而越蠢?碎片化学习是个骗局

    所有的当代人都面临两个问题--信息超载和知识碎片化.该怎么解决? 先给你讲个故事,看你有没有中招: 有一天,你的朋友给你"知识装逼"了一个术语,牛!怎么知道的?--他推给你一个公众 ...

  3. 碎片化学习的骗局-如何构建自己的知识体系

    一.前言 人生有好多事情,可以走捷径或者可以找人替代,唯有求知.成长无捷径及无法找人替代. 二.曾经的我 现在年底流行知识跨年,今年毫无例外的知识跨年又刷屏了,其中最出名的莫过于罗振宇的"时 ...

  4. mysql 整理磁盘空间_mysql 数据库磁盘满了,进行碎片化整理的相关问题

    一.进行碎片化整理的步骤: 1,进行磁盘碎片化整理.原因是datafree占据的空间太多啦.具体可以通过这个sql查看. SELECT CONCAT(TRUNCATE(SUM(data_length) ...

  5. Windows 8.1下释放磁盘空间的指南

    This is an "updated for Windows 8.1" version of my popular original article Guide to Freei ...

  6. 解决MongoDB 日志文件过大,清理后还占用很大磁盘空间的问题

    解决MongoDB 日志文件过大,清理后还占用很大磁盘空间的问题 参考文章: (1)解决MongoDB 日志文件过大,清理后还占用很大磁盘空间的问题 (2)https://www.cnblogs.co ...

  7. 磁盘空间满问题排查方法

    问题描述 在云服务器ECS Linux系统内创建文件时,出现类似如下空间不足提示: No space left on device - 问题原因 磁盘分区空间使用率达到百分之百. 磁盘分区inode使 ...

  8. CentOS磁盘空间爆满问题排查

    CentOS磁盘空间爆满问题排查 问题描述:好好运行的服务器没有上传和下载大文件,但是服务器磁盘突然爆满了. 问题排查:如果没有大的文件上传和下载,那么很有可能是项目运行的时候产生的日志太大(可以用两 ...

  9. 服务器磁盘空间占满了排查原因

    前言 提示:我遇到过很多次磁盘被占满的情况,觉得这个问题可能大家也会经常遇到,特意记录在此,希望对大家有所帮助- 文章目录 前言 一.查看磁盘空间使用情况 二.排查过程 1.切换到/目录下(从/目录开 ...

最新文章

  1. 在Python中使用SMTP发送电子邮件
  2. java 定时任务spring_Spring定时任务(一):SpringTask使用
  3. 苹果mac科学计算器:PCalc
  4. Visual Object Classes Challenge 2012 (VOC2012) 简介
  5. 第七版自顶向下 第一章中文版 计算机网络课后习题答案
  6. 简单的喜欢最长远 平凡中的陪伴最心安 懂你的人最温暖
  7. 实时操作系统-与QNX比较-qnx系统优势-qnx性能分析-qnx系统性能分析
  8. 【翻译】 XDP的力量
  9. matlab距离判别分析的应用
  10. 你们要的Java学习路线图,来喽
  11. MyBatis-plus拦截器
  12. Linux下at命令的使用!
  13. 09年NBA全明星候选名单和投票方法
  14. 什么是显热?什么是潜热?
  15. 图像平移 ——MATLAB实现
  16. 基于SSM的高校助学贷款申报审批系统
  17. 英国计算机专业硕士申请美国博士,美国计算机专业留学硕士申请|美国计算机专业留学博士申请-计算机专业留学...
  18. 免签支付接口和三方支付接口有什么不同?
  19. 用VB实现“木马”式隐形运行程序
  20. Dell服务器安装Debian上不了网解决办法

热门文章

  1. 利用Eclipse-Python简单爬取京东商城书籍信息进行可视化
  2. 一种基于多维时序数据预测综合判定的方法(内存告警)
  3. 带你一步步了解S5PV210-I~ARM历史,RISC和CISC的区别,ARM与三星,华为,高通这些的关系
  4. 【项目记录】-上门洗车-汽车服务
  5. Linux查看文件内容的方法
  6. Anaconda 安装及验证是否安装成功
  7. 雇佣兵战斗力c语言原理,暗黑2单机弓箭亚马逊应该怎么选技能和雇佣兵
  8. Python爬虫大众点评字体加密评论采集!听说这个网站很难?
  9. 2020-2021年度第二届全国大学生算法设计与编程挑战赛(冬季赛)题解
  10. 理解偏差(Bias)和方差(Variance)