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

 

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

       第一种是dump & restore: 

 

Mongodb代码  

MongoDB 存储空间100%导致无法访问 mongodb内存不释放_Database

  1. 1.  mongodump -d databasename -o /path/to/dump_dir  
  2. 2.  echo 'db.dropDatabase()' | mongo <databasename>  
  3. 3.  mongorestore -d <databasename>  /path/to/dump_dir  

       如果数据量不大,dump不需要太长时间的情况下,或者经常备份有dump文件的情况的下,这种方法很简单。

 

       第二种repair database 

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

 

Mongodb代码  

{ 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写文件的方式,模拟数据库的读写功能,将数据存成了文件夹,这样就没问题了