关于mongodb回收磁盘空间的问题
MongoDB compact 命令详解
为什么需要 compact

remove和drop的区别
mongodb删除集合有两种方式:
- db.connection,remove({});该命令是将集合中的文档按一定条件在btree中逐个删除,但物理空间不会被删除,导致一种删了跟没删一样的错觉;
- db.connection.remove({});该命令和上命令的想法一样,但直接删除的是集合里的物理文件,空间会立即回收并释放,remove操作相当于只是把记录删除,而记录所占用的物理空间却没有变动,当有新数据插入时,会优先插入到指定的位置,总大小不变,直到之前remove腾出的空位被占满才会占用新的空间去存放,像经常更新记录的表使用remove操作即可;对于频繁插入而忘记删除的集合,当需要空间去干其他的事情时,就需用到compact操作回收磁盘空间了;
compact对集合的影响
由于本人使用mongodb的时间不长,目前公司的mongodb为主备节点的版本,当在主节点执行
db.connection.runCommand(“compact”);时,会提示“will not run compact on an active replica set primary as this is a slow blocking operation. use force:true to force”,直译的话就是“不会在活动副本集主数据库上紧凑运行,因为这是一个缓慢的阻塞操作。”,以上得知compact操作会导致当前集合所有读写操作阻塞,由于compact的操作耗时与集合中文档的数量直接相关,所有执行该操作时我都是在副本集上执行,等副本操作完成再进行主备节点切换,再执行上述操作,从而完成数据库磁盘回收的目的;
compact底层原理
使用compact操作首先就需要用到mongodb中的存储引擎WiredTiger,WiredTiger在执行compact操作时会将进入的新数据插入到空闲的空间(执行remove操作后空余出来的空间),然后才会将Trancate(锁)文件占用的物理空间回收,每次执行compact操作时,WiredTiger都会检测是否符合运行条件:
- 假如集合目前数据大小为80%,当磁盘回收为20%时,他会计算剩余的空间能不能存放当前数据大小的20%,如果不满足,则直接返回OK;
本文详细介绍了MongoDB的compact命令,包括为何需要compact,remove与drop的区别,以及compact对集合的影响。compact操作会导致集合读写阻塞,并在WiredTiger存储引擎下回收磁盘空间。执行条件是磁盘剩余空间能容纳当前数据的20%。
1004

被折叠的 条评论
为什么被折叠?



