【问题标题】:Mongo database size inconsistencyMongo 数据库大小不一致
【发布时间】:2014-11-15 20:00:25
【问题描述】:

我使用 Mongo GridFS,我有一个相当大的 Mongo 数据库,当我使用 db.stats() 命令时,当前 dataSize 为 89GB。

当我在文件系统中创建 mongo 转储时,目录大小为 86GB,当我在另一台机器上恢复数据库并运行 db.stats() 时,我现在得到 122GB。

有谁知道转储/恢复后数据大小增加 33GB 背后的原因是什么?

编辑 这是来自初始数据库的统计数据

MongoDB shell version: 2.4.5
connecting to: imgdb
rs0:PRIMARY> db.stats();
{
        "db" : "imgdb",
        "collections" : 4,
        "objects" : 2549884,
        "avgObjSize" : 37802.88397276111,
        "dataSize" : 96392968996,
        "storageSize" : 363433842080,
        "numExtents" : 207,
        "indexes" : 4,
        "indexSize" : 307245904,
        "fileSize" : 366974337024,
        "nsSizeMB" : 16,
        "dataFileVersion" : {
                "major" : 4,
                "minor" : 5
        },
        "ok" : 1
}

这里是恢复数据库的统计数据

MongoDB shell version: 2.6.4
connecting to: imgdb
dbdb.stats();
{
        "db" : "imgdb",
        "collections" : 4,
        "objects" : 2549924,
        "avgObjSize" : 51781.40103312883,
        "dataSize" : 132038637248,
        "storageSize" : 132281756768,
        "numExtents" : 98,
        "indexes" : 4,
        "indexSize" : 199976784,
        "fileSize" : 135159349248,
        "nsSizeMB" : 16,
        "dataFileVersion" : {
                "major" : 4,
                "minor" : 5
        },
        "extentFreeList" : {
                "num" : 0,
                "totalSize" : 0
        },
        "ok" : 1
}

以下是对可能原因的一些想法:

  1. 出于某种原因,我在恢复的版本中多了 40 个对象!
  2. 不同的 mongo 版本,这可能是索引算法发生变化的原因吗?
  3. 初始数据库位于副本集中
  4. 最初的数据库曾经是 320 GB,但我进去并压缩了所有图像,不久前将其减少到 75 GB。这就是为什么初始数据库的存储大小要大得多的原因

【问题讨论】:

  • 如果你转储那个 122GB 的数据库会发生什么?它会给你另一个 86GB 的转储吗?包括来自db.stats() 的其他数字可能会帮助人们解释这些数字。阅读dbStatspadding factor 可能也有用。由于索引、簿记、增长空间等原因,数据库的大小永远不会是它包含的数据的大小……
  • 我正在转储 122GB 数据库,我很快就会得到这些信息
  • 这应该只需要几秒钟,对吧?我记得当一个 GB 很多时,现在我的手机口袋里有几个。查看db.stats() 中的其他数字和填充因子;我的 MongoDB DBA 技能不是很好,但我怀疑这两件事会消除很多困惑。
  • 据我所知,转储并没有被压缩,这很奇怪,最大应该是旧数据库的大小
  • @muistooshort 花了一段时间,大约 45 分钟。但最后我的数据转储又回到了 86GB!

标签: mongodb gridfs mongodump mongorestore


【解决方案1】:

MongoDB 2.6 默认使用Powers of Two Record Allocation

在加载数据之前,您可以尝试更改您的 mongod newCollectionsUsePowerOf2SizescollMod 您的收藏:

db.runCommand( { collMod: "myCollection", usePowerOf2Sizes: false })

【讨论】:

  • 这也适用于 GridFS 吗?另外,超过 1/3 对我来说似乎有点多。
  • 是的,适用于每个集合。
  • Iirc,块的固定大小为 255k。如果他们为此添加填充会很奇怪,不是吗?
  • 我必须同意@MarkusWMahlberg 我不确定是否在gridfs 上实际使用了2 个大小的幂,因为文件块集合不是一个易于更新的集合,但这可能是正确的,在末尾一天只有 MongoDB 开发人员可能知道,或者除非你取出一个对象并对其进行 bson 大小检查以查看它是预期大小的两倍
  • @MarkusWMahlberg:旧驱动程序创建的块为 256KB;这被降低到 255KB,因为 powerOf2Sizes 会将这些 256KB 分配推到 512KB。参考:jira.mongodb.org/browse/SERVER-13331。根据此处的答案,导入历史 GridFS 文档的推荐修复方法是禁用fs.chunks 集合的 powerOf2Sizes。根据此 GridFS 集合中块的大小(如果驱动程序已升级,可能是 256KB 和 255KB 的混合),数据大小可能不会直接转换为存储大小。
猜你喜欢
  • 1970-01-01
  • 2014-04-10
  • 2014-04-29
  • 1970-01-01
  • 2012-11-28
  • 1970-01-01
  • 2023-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多