为什么我的mongodb fileSize比db.stats()中的storageSize大得多?

时间:2013-12-12 01:34:20

标签: mongodb diskspace

我有一个名为log_test1的数据库,只有1个上限的收集日志。封顶集合的最大大小为512M。插入200k数据后,我发现db的磁盘使用率为1.6G。使用db.stats(),我可以看到storageSize是512M,正确,但我的实际fileSize是1.6G,为什么会发生这种情况?如何控制磁盘大小只是我的上限集合大小加索引大小?

> use log_test1
switched to db log_test1
> db.stats()
{
    "db" : "log_test1",
    "collections" : 3,
    "objects" : 200018,
    "avgObjSize" : 615.8577328040476,
    "dataSize" : 123182632,
    "storageSize" : 512008192,
    "numExtents" : 3,
    "indexes" : 8,
    "indexSize" : 71907920,
    "fileSize" : 1610612736,
    "nsSizeMB" : 16,
    "dataFileVersion" : {
        "major" : 4,
        "minor" : 5
    },
    "ok" : 1
}

1 个答案:

答案 0 :(得分:11)

这可能是因为MongoDB预分配了数据和日志文件。


MongoDB 2

  

在数据目录中,MongoDB将数据文件预先分配到特定大小,部分是为了防止文件系统碎片。 MongoDB命名第一个数据文件<databasename>.0,下一个<databasename>.1等。第一个文件 mongod 分配为64兆字节,接下来是128兆字节,依此类推,最多2个千兆字节,此时所有后续文件都是2千兆字节。数据文件包含具有已分配空间但不保留数据的文件。 mongod 可能会分配一个可能90%为空的1千兆字节数据文件。对于大多数较大的数据库,与数据库相比,未使用的分配空间很小。

     

在类Unix系统上, mongod 预先分配一个额外的数据文件,并将磁盘空间初始化为0.在后台预分配数据文件可防止下次分配新数据库文件时出现重大延迟。

     

您可以使用 noprealloc 运行时选项禁用预分配。但 noprealloc 打算在生产环境中使用:仅使用 noprealloc 进行测试,并使用经常删除数据库的小数据集。

MongoDB 3

  

数据目录中的数据文件,即/data/db   默认配置中的目录可能大于数据集   插入数据库。考虑以下可能的原因:

     

预分配的数据文件

     

MongoDB预先分配其数据文件以避免文件系统碎片,   因此,这些文件的大小不一定   反映数据的大小。

     

storage.mmapv1.smallFiles选项会减小这些选项的大小   文件,如果磁盘上有许多小型数据库,这可能很有用。

     

oplog

     

如果此 mongod 是副本集的成员,则为数据   目录包含oplog.rs文件,该文件是预先分配的上限   在本地数据库中收集。

     

默认分配大约是64位磁盘空间的5%   安装。

     

期刊

     

数据目录包含存储的日志文件   在MongoDB将它们应用到数据库之前在磁盘上写入操作。

     

清空记录

     

MongoDB维护数据文件中的空记录列表   因为它删除了文档和集合。 MongoDB可以重用这个空间,   但默认情况下,不会将此空间返回给操作系统。


取自MongoDB Storage FAQ