为什么MongoDB存储不断增加?

时间:2013-01-24 06:54:24

标签: mongodb

我有一个单主机数据库,在我不看的时候,它占据了95%的磁盘空间。为了解决这种情况,我创建了一个自动从最大集合中删除旧记录的进程,因此数据使用率降低到磁盘空间的大约40%。我认为只要数据大小不会接近预分配文件的大小,我就是安全的,但一周后我被证明是错误的:

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会有帮助吗?如果是的话,我应该定期运行它吗?如何判断我何时应该运行它?

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

1 个答案:

答案 0 :(得分:2)

  1. 升级到2.2.2 - 2.2.0在复制中存在幂等性错误,不再推荐用于生产。
  2. 请点击此处查看一般信息http://docs.mongodb.org/manual/faq/storage/#faq-disk-size
  3. 从mongodb恢复空间的唯一方法是通过网络同步新节点 - 在这种情况下,文档将通过新文件系统进行复制并重新存储而不会出现碎片。或者使用修复命令 - 但为此您需要将磁盘空间增加一倍。数据文件将被复制,碎片整理并压缩并复制回原始文件。 compact命令命名错误,只有defrags - 它不会从mongo恢复磁盘空间。
  4. 继续使用usePowerOf2Sizes命令(2.2.x中的新增功能)http://docs.mongodb.org/manual/reference/command/collMod/ 如果您使用该命令并分配一个800字节的文档,则将在磁盘上分配1024个字节。如果您随后删除该文档并插入一个新文档 - 比如900字节,该文档可以放在1024字节空间中。如果未启用此选项,则800字节doc可能在磁盘上只有850个字节 - 因此当它被删除并插入900字节doc时,必须分配新空间。如果那样被删除你将最终得到两个空闲空间 - 850字节和950字节从未加入(除非使用紧凑或修复) - 所以然后插入一个1000字节的文档,你需要分配另一个< / em>磁盘块。 usePowerOf2Sizes通过使用标准存储桶大小来帮助解决这种情况。