【问题标题】:MongoDB does not reclaim space despite running repairDatabase()尽管运行了 repairDatabase(),MongoDB 仍不回收空间
【发布时间】:2013-11-13 09:05:15
【问题描述】:

我们一直在单个非分片实例中运行 mongoDB,只有一个数据库。数据文件的大小为 0.45 GB。当我查看所有集合的 storageSize 时,总大小约为 85 MB。为了回收未使用的空间,我们运行了 repairDatabase(),了解文件大小从 64 增长到 128 再到 256 等等直到 2 GB。由于我们拥有的 mongo 对象数据(85 MB)可以容纳在 64 + 128 MB 的文件中,因此我们期望回收 256 MB 的文件。然而,令我们惊讶的是,没有回收任何空间。

谁能让我们知道我们可以找到多少空间将被回收的逻辑?从本质上讲,给定数据库占用的总磁盘空间,以及给定 mongo 对象数据的总大小,是否可以准确估计要回收多少空间?

以下是评论中要求的 db.stats() 输出:

> db.stats()
{
        "db" : "analytics_data_1",
        "collections" : 12,
        "objects" : 207223,
        "avgObjSize" : 353.6659347659285,
        "dataSize" : 73287716,
        "storageSize" : 84250624,
        "numExtents" : 43,
        "indexes" : 26,
        "indexSize" : 21560112,
        "fileSize" : 469762048,
        "nsSizeMB" : 16,
        "dataFileVersion" : {
                "major" : 4,
                "minor" : 5
        },
        "ok" : 1
}
>

【问题讨论】:

  • 如果您没有任何碎片(由于删除、文档移动等),则不会回收任何空间。为什么不向 db.stats() 和个人收集统计信息提供输出?是什么让你认为有任何可回收的空间?不要忘记索引空间。
  • 我添加了每个集合和索引的 storageSize。这等于 85 MB。
  • 你知道预分配对吧? docs.mongodb.org/manual/faq/storage/… 前两个文件中有数据,第三个文件是预先分配的,这样当您填充 128MB 文件时,数据库不必在等待下一个文件分配时暂停。
  • @AsyaKamsky,让我知道以下是否正确: 如果总数据大小为 64+128+256+512+20 如果总文件大小为 64+128+256+512+1024 +2048 在这种情况下,不会回收任何文件,因为预先分配了一个额外的块。但是,如果总数据大小为 64+128+256+512+20 如果总文件大小为 64+128+256+512+1024+2048+2048,则最后一个 2048 MB 的文件将被回收。让我知道我的理解是否正确。
  • 最后一个(最大的)文件总是空的。我不确定我是否可以解析您的方程式,但如果您的数据需要两个数据文件,那么您将在目录中看到三个(除了 .ns 文件)。

标签: mongodb


【解决方案1】:

storage FAQ explains 总是预先分配一个额外的文件,一旦你开始写入它,mongod 就会预先分配下一个文件。

修复不会回收通常存在的任何空间 - 只有在您删除了大量数据或删除了一些集合时,它才会有所帮助。

禁用预分配可以节省空间,但会降低性能,因为文件将在实际需要写入时分配 - 这会减慢插入速度。

【讨论】:

  • 您能否分享一些关于 noprealloc 和 smallfiles 如何在生产中造成问题的链接?我们正在考虑在生产中使用它们的想法,但在继续之前要确定一下。
  • noprealloc 意味着如果您正在写入 5MB 的数据并且在 4MB 之后在当前文件中用完空间,则写入将不得不阻塞并等待下一个文件被分配。使用 prealloc,一旦您开始写入最后一个空文件,它就会在后台分配。因此,在生产中,当系统无响应时,这可能表现为偶尔但看似随机的长时间停顿。
  • 小文件只会导致更多碎片,因为较大的集合和索引可能分散在多个文件中(可能位于磁盘的不同部分)
  • (关于小文件)但是如果我们定期运行 repairDatabase() 不会纠正吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-25
  • 2019-07-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多