欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Mongodb 占用的硬盘空间问题 博客分类: Mongodb  

程序员文章站 2024-02-10 11:18:28
...

       最近在做的项目用到的存储库是 Mongodb , 因为用到的数据是实时通信的, 数据量比较大, 而且还要存到数据库里,所有就想写一个脚本给数据库进行定时的清除处理, 可是一段时间后发现服务器空间快满了, 我才发现Mongodb 不会释放已经占用的磁盘空间, 即使drop collection也不行, 除非drop database. 这就导致如果一个db曾经有大量的数据一段时间后又删除的话,硬盘空间就是一个问题。

       解决磁盘空间释放的问题有两种方法:

       第一种是dump & restore: 

 

1.  mongodump -d databasename -o /path/to/dump_dir
2.  echo 'db.dropDatabase()' | mongo <databasename>
3.  mongorestore -d <databasename>  /path/to/dump_dir
       如果数据量不大,dump不需要太长时间的情况下,或者经常备份有dump文件的情况的下,这种方法很简单。

 

       第二种repair database 

即在mongo shell中运行db.repairDatabase() , 或者 db.runCommand({ repairDatabase: 1 }) , 第二种方法可以带其他几个参数

 

{ repairDatabase: 1,
  preserveClonedFilesOnFailure: <boolean>,
  backupOriginalFiles: <boolean> }
 repairDatabase是官方文档中认为唯一可以回收磁盘空间的方法。

 

repairDatabase is the appropriate and the only way to reclaim disk space.

当你有多个shard的且数据量巨大时,dump & restore方法会花费巨大的时间,这时第二种方法的优势就很明显,就是分别在每个shard上运行repairDatabase,结果会快很多。

       不过我的项目这部分是要对实时数据进行存储的,而repairDatabase在执行的时候可能会锁,从而影响数据库的读写,所以在这里不适合解决我的问题,后来我试过将实时数据存在redis缓存里,结果因为是实时数据,而且数据更新的比较快,所以就会报内存溢出的错误,最后,我用node的fs写文件的方式,模拟数据库的读写功能,将数据存成了文件夹,这样就没问题了