0

我有一个单主机数据库,在我不看的时候它增长了 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有用吗?如果是,我应该定期运行它吗?我怎么知道我应该什么时候运行它?

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

4

1 回答 1

2
  1. 升级到 2.2.2 - 2.2.0 在复制中存在幂等性错误,不再推荐用于生产。
  2. 有关一般信息,请参见此处http://docs.mongodb.org/manual/faq/storage/#faq-disk-size
  3. 从 mongodb 恢复空间的唯一方法是通过网络同步一个新节点 - 在这种情况下,文档将通过新文件系统复制并重新存储而不会产生碎片。或者使用修复命令 - 但为此,您需要将您在磁盘上使用的磁盘空间增加一倍。数据文件被复制、碎片整理和压缩,然后复制回原始文件。compact 命令命名错误,只能进行碎片整理 - 它不会从 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 通过使用标准存储桶大小对这种情况有很大帮助。
于 2013-01-25T11:09:59.877 回答