2013-01-23 519 views
5

我已经写了this question in mongodb google group,没有任何回复在这里发布。需要多少额外的空间来修复数据库需要

我们有一个单节点mongo(版本2.0.1)实例。即使每天归档后,我们的磁盘空间也不足,因为mongo不会将空间返回到操作系统,并尝试自行使用它。目前我们的设置已经变得非常稀疏,约有50%的空间闲置。您可以看到数据+索引大小约为1170 GB,而存储大小约为2158 GB,文件大小约为2368 GB。

db.stats()  
{ 
    "db" : "default",    
    "collections" : 106, 
    "objects" : 553988389, 
    "avgObjSize" : 2094.1392962010254, 
    "dataSize" : NumberLong("1160128855044"), 
    "storageSize" : NumberLong("2315777236208"), 
    "numExtents" : 1487, 
    "indexes" : 107, 
    "indexSize" : 97914435136, 
    "fileSize" : NumberLong("2543459500032"), 
    "nsSizeMB" : 16, 
    "ok" : 1 
} 

我们要回收空间,并因为这不是一个关键任务系统(它像日志倾倒场)可以维持的停机时间。我们不想花费在创建副本集上,我们也在物理数据中心,因此宁愿不附加额外的磁盘来修复数据库。
我想了解: -
- 如何需要修复数据库
我们 - 如何多少空间可以希望修复数据库
-Around应该花费多少时间来修复数据库之后收回多少可用磁盘空间。
- 如果所有修复数据库都在继续,那么杀死它并重新启动数据库是否安全?

我们的数据大量存在于单个集合中,因此紧凑集合是否优于修复数据库。

+1

修复可能需要多达2倍的空间。 –

+0

数据大小或存储大小的2倍? – pseudonym

+0

修复会做一个''mongodump''和''mongorestore'',因此它需要数据库使用的磁盘空间的两倍,即需要空间来存储旧的和新的数据库文件。为了避免你可以手动执行''mongodump'',删除数据库文件,然后运行''mongorestore''。另外,如果你只需要回收未使用的空间,你可以运行“compact”(确保你有2GB可用空间)。 – diliop

回答

2

首先,我会建议你从2.0.1升级。如果不是2.2.2,则至少为2.0.7。 修复需要2x文件大小。 您的文件大小应该稍大于数据大小。 需要多长时间取决于系统资源和系统的繁忙程度。 Compact不会释放磁盘空间 - 它只是在数据文件中进行碎片整理。

在2.2.x中您可以使用 collMod

命令设置usePowerOf2Sizes,以减少文件碎片。例如插入800字节文件和1024字节将被分配。删除该文档并插入900字节的文档,现在可以重新使用1024空间。如果没有这个可能只有850个字节被分配,并且新的可用空间将被分配给900字节的文档。

杀repairDatabase应该没问题 - 文件复制到新的位置,然后defragg'd复制回在完成但你必须对它进行测试,以确保:)

+0

Thanks @gregor At目前我们正在定期进行归档,但mongo无法正确利用已释放的空间,您可以通过数据+索引大小和存储大小的差异来查看。如果我们继续“压缩”数据,那么它会开始更有效地利用空间(mongo的空闲空间)?根据升级,目前我们不希望投资任何带宽,因为完整的解决方案将在几个月左右被替换。同样,@diliop也提出了2GB是否足够用于'compact' – pseudonym

+0

@ApoorvaGaurav嗨,我看到有人在生产中使用MongoDB进行大写操作,并且在每周定期的基础上读取压缩文件。他们甚至写了一个像这样的脚本来自动执行它,而不是进行修复,因为它永远需要,需要x2的存储空间。看看这个:http://blog.parse.com/2013/03/26/always-be-compacting/这里是github上的代码:https://github.com/ParsePlatform/Ops/blob/master/工具/ mongo_compact.rb – Maziyar