2013-01-24 55 views
0

我有一个单主机数据库,当我没有看时,它长大到95%的磁盘空间。为了纠正这种情况,我创建了一个自动从最大集合中删除旧记录的过程,因此数据使用率下降到磁盘空间的大约40%。我想我是安全的,只要数据大小的预分配文件的大小接近不长,但一个星期后,我被证明是错误的:为什么MongoDB存储不断增加?

Wed Jan 23 18:19:22 [FileAllocator] allocating new datafile /var/lib/mongodb/xxx.101, filling with zeroes... 
Wed Jan 23 18:25:11 [FileAllocator] done allocating datafile /var/lib/mongodb/xxx.101, size: 2047MB, took 347.8 secs 
Wed Jan 23 18:25:14 [conn4243] serverStatus was very slow: { after basic: 0, middle of mem: 590, after mem: 590, after connections: 590, after extra info: 970, after counters: 970, after repl: 970, after asserts: 970, after dur: 1800, at end: 1800 } 

这是db.stats()输出:(注意数字在MB由于规模)

> db.stats(1024*1024) 
{ 
    "db" : "xxx", 
    "collections" : 47, 
    "objects" : 189307130, 
    "avgObjSize" : 509.94713418348266, 
    "dataSize" : 92064, 
    "storageSize" : 131763, 
    "numExtents" : 257, 
    "indexes" : 78, 
    "indexSize" : 29078, 
    "fileSize" : 200543, 
    "nsSizeMB" : 16, 
    "ok" : 1 
} 

问:我能做些什么,以从分配新的数据文件停止MongoDB的?

运行repair是困难的,因为我将不得不安装新磁盘。运行compact有帮助吗?如果是的话,我是否应该定期运行它,如何知道我应该运行它?

更新:我想我失去了一些东西在这里根本......可能有人请详细说明数据文件,范围,集合和数据库,以及之间的连接是如何在需要时空间分配?

+0

您可能想要添加一些关于您的应用正在做什么的细节。 Mongo在不再使用时不会自动释放存储空间。它将在某些情况下取代现有的记录,否则它会消耗更多的磁盘。 – Rich

+0

它基本上只是写日志和图表数据,一旦它太旧就删除它。但是,我无法使用加盖集合,因为我需要控制清除了多少数据以及要删除哪些数据。 – johndodo

+0

您使用的是哪个版本的mongodb? – Gregor

回答

2
  1. 升级到2.2.2 - 2.2.0在复制中存在幂等性错误,不再推荐用于生产。
  2. 看到这里的一般信息http://docs.mongodb.org/manual/faq/storage/#faq-disk-size
  3. 恢复后排空间的唯一途径从MongoDB是要么同步在网络上一个新的节点 - 在这种情况下,文档被复制了新的文件系统,没有碎片重新存储。或者使用修复命令 - 但为此,您需要将磁盘上使用的磁盘空间翻倍。数据文件被复制,整理并压缩并复制到原始文件中。紧凑命令的命名很糟糕,只能进行碎片整理 - 它不会从mongo恢复磁盘空间。
  4. 继续前进,请使用usePowerOf2Sizes命令(2.2.x中的新功能)http://docs.mongodb.org/manual/reference/command/collMod/ 如果使用该命令并分配800字节的文档,则将在磁盘上分配1024字节。如果您删除该文档并插入一个新文档(比如说900字节),则该文档可以放入1024字节的空间。如果没有启用此选项,800字节的文档可能只有850个字节的磁盘 - 所以当它被删除并插入900字节的文档时,必须分配新的空间。如果删除了,你将得到两个可用空间 - 850个字节和950个字节,这些空间永远不会加入(除非使用紧凑或修复) - 然后插入一个1000字节的文档,并且您需要分配另一个块磁盘。 usePowerOf2Sizes通过使用标准桶大小帮助了很多情况。