【问题标题】:Why is an empty MongoDB database so big?为什么一个空的 MongoDB 数据库这么大?
【发布时间】:2016-06-10 08:39:00
【问题描述】:

当我使用命令创建一个新的 mongoDB 数据库实例时

mongod --dbpath db

其中db 是我在调用命令的目录中创建的文件夹。运行此命令并检查目录的大小后,我发现它的大小超过了 300MB - 当那里没有数据时。

这是怎么回事?

感谢您的帮助!


编辑

感谢讨论 journal 的预分配大小的人们。

这是数据库目录中文件/文件夹的列表,按顺序排序(数据库中现在有一点数据,但这里的大小可以忽略不计):

$du -ha | sort -n
4.0K    ./WiredTiger
4.0K    ./WiredTiger.lock
4.0K    ./WiredTiger.turtle
4.0K    ./WiredTigerLAS.wt
4.0K    ./mongod.lock
4.0K    ./storage.bson
8.0K    ./.DS_Store
8.0K    ./diagnostic.data/metrics.2016-06-10T11-07-50Z-00000
8.0K    ./diagnostic.data/metrics.interim
 16K    ./_mdb_catalog.wt
 16K    ./index-3-3697658674625742251.wt
 36K    ./collection-0-3697658674625742251.wt
 36K    ./index-1-3697658674625742251.wt
 36K    ./sizeStorer.wt
 44K    ./WiredTiger.wt
 60K    ./collection-2-3697658674625742251.wt
 72K    ./diagnostic.data/metrics.2016-06-10T10-19-31Z-00000
100M    ./journal/WiredTigerLog.0000000003
100M    ./journal/WiredTigerPreplog.0000000001
100M    ./journal/WiredTigerPreplog.0000000002
168K    ./diagnostic.data/metrics.2016-06-10T11-17-58Z-00000
256K    ./diagnostic.data
300M    ./journal
301M    .

如您所见,日志目录几乎占用了所有空间。

【问题讨论】:

  • 这不是stackoverflow.com/questions/9598971 的重复,因为在此示例中mongod 不是以--replSet 开头的。目录列表可以确认,但在使用 WiredTiger 存储引擎启动新的 MongoDB 3.2 服务器时,journal 目录中预分配文件的预期大小约为 300MB。日志文件大小限制为 100MB,我希望启动时有 3 个文件。
  • 我在我的问题中添加了文件大小 - 我认为这证实了您的假设。谢谢!
  • 感谢您添加目录列表(fwiw,du -ha 将显示更友好的文件大小)。这确实是使用 WiredTiger(MongoDB 3.2 中的默认存储引擎)的日志文件的预期预分配。
  • 好提示,谢谢。改变了输出。

标签: mongodb


【解决方案1】:

根据您的 MongoDB 版本和配置的存储引擎,一些数据和元数据文件将在启动时预分配。这是预期的行为:“空”部署仍会产生内务管理和诊断数据。

根据您的目录列表,您运行的是默认使用 WiredTiger 存储引擎的 MongoDB 3.2。 WiredTiger 为每个日志文件最多分配 100MB,因此您的新部署有大约 300MB 的预分配 journal files:

     100M    ./journal/WiredTigerLog.0000000003
     100M    ./journal/WiredTigerPreplog.0000000001
     100M    ./journal/WiredTigerPreplog.0000000002

除了日志文件之外,将在您的 dbpath 中创建的其他元数据(您尚未明确创建数据库)将包括:

  • 一个local 数据库,其中包含一个名为startup_log 的上限集合,其中包含有关此mongod 实例的每次启动调用的一些诊断信息。 local.startup_log会有一个关联的集合和索引文件;文件名是不透明的,但作为创建的第一个文件,我在您的示例中猜测这些文件可能是:

     36K    ./collection-0-3697658674625742251.wt
     36K    ./index-1-3697658674625742251.wt
    
  • 多个 WiredTiger 元数据文件。因为local 数据库是默认为startup_log 创建的:

    4.0K    ./WiredTiger
    4.0K    ./WiredTiger.lock
    4.0K    ./WiredTiger.turtle
    4.0K    ./WiredTigerLAS.wt
     16K    ./_mdb_catalog.wt
     36K    ./sizeStorer.wt
     44K    ./WiredTiger.wt
    
  • diagnostic.data 目录;这是为了定期采样服务器状态指标:

    168K    ./diagnostic.data/metrics.2016-06-10T11-17-58Z-00000
    72K    ./diagnostic.data/metrics.2016-06-10T10-19-31Z-00000
    

【讨论】:

    【解决方案2】:

    创建新数据库时,MongoDB 会为oplog 创建空间。

    oplog(操作日志)是一个特殊的上限集合,它保留所有修改存储在数据库中的数据的操作的滚动记录。

    【讨论】:

    • oplog 是特定于复制的,因此不会为这个独立服务器的示例创建 (mongod --dbpath ...)。根据 MongoDB 版本和存储引擎,可能会预先分配其他数据文件;目录列表将提供更多洞察力。
    猜你喜欢
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 2021-06-12
    • 2013-12-03
    • 2013-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多