【问题标题】:mongodump for collection larger than ram用于收集大于 ram 的 mongodump
【发布时间】:2020-04-09 15:43:41
【问题描述】:

我正在使用这样的命令从远程机器转储数据:

mongodump --verbose \
          --uri="mongodb://mongousr:somepassword@host.domain.com:27017/somedb?authSource=admin" \
          --out="$BACKUP_PATH"

这样失败了:

Failed: error writing data for collection `somedb.someCollection` to disk: error reading collection: EOF

somedb.someCollection 大约是 40GB。我没有能力将 RAM 增加到这个大小。

我见过两种解释。一是控制台输出过于冗长并填满了 RAM。这似乎很荒谬,它只有几千字节,而且无论如何它都在客户端计算机上。被拒绝(但我现在用--quiet 再次尝试以确保)。

更合理的解释是主机用somedb.someCollection 数据填充其RAM,然后失败。问题是我看到的“解决方案”是将 RAM 增加到大于集合的大小。

真的吗?这不可能。有这个限制的 mongodump 有什么意义?

问题:是否可以使用比我的 RAM 大小更大的集合来 mongodump 数据库?怎么样?

mongodump 客户端:

macOS
mongodump --version
mongodump version: 4.0.3
git version: homebrew
Go version: go1.11.4
   os: darwin
   arch: amd64
   compiler: gc
OpenSSL version: OpenSSL 1.0.2r  26 Feb 2019

服务器:

built with docker FROM mongo:
Reports: MongoDB server version: 4.0.8

【问题讨论】:

  • 为了能够运行mongodump,不需要拥有比收集数据更多的 RAM。我怀疑您的问题与检测 Docker 部署中的可用 RAM 有关。根据MongoDB Production NotesIf you run mongod in a container (e.g. lxc, cgroups, Docker, etc.) that does not have access to all of the RAM available in a system, you must set storage.wiredTiger.engineConfig.cacheSizeGB to a value less than the amount of RAM available in the container. 默认为(可用 RAM -1 GB)的 50%。
  • 或者,您可以尝试升级到 MongoDB 4.0.9,其中包括更好地检测容器中的可用 RAM,并且不再需要手动调整 cacheSizeGB 设置。

标签: mongodb mongodump


【解决方案1】:

简单地逐片转储你的收藏:

mongodump --verbose \
          --uri="mongodb://mongousr:somepassword@host.domain.com:27017/somedb?authSource=admin" \
          --out="$BACKUP_PATH" -q '{_id: {$gte: ObjectId("40ad7bce1a3e827d690385ec")}}'

mongodump --verbose \
          --uri="mongodb://mongousr:somepassword@host.domain.com:27017/somedb?authSource=admin" \
          --out="$BACKUP_PATH" -q '{_id: {$lt: ObjectId("40ad7bce1a3e827d690385ec")}}'

或通过在 _id 或某些不同字段上设置的不同查询对您的转储进行分区。报告的 _id 只是一个例子。

【讨论】:

  • 感谢您的回答。在您的示例中,对 mongodump 的两个调用都写入同一个输出目录。是否为两个“切片”创建了单独的文件?恢复时,是否需要对 mongorestore 进行两次调用?我很难将这种方法与我传统的数据库备份和恢复概念相协调,例如pgdump。
  • 你必须使用两个不同的备份路径,否则你得到的第二个 .bson 文件会覆盖第一个。有 --archive 选项可将备份写入您想要的文件,但使用此选项您必须使用不同的路径,因为由于错误,第二个转储会删除您收藏的元数据文件,因此您可以t 恢复您的收藏。当然,在使用 mongorestore 时,您需要为之前创建的每个转储(文件夹)使用一个命令。
【解决方案2】:

Stennie 的回答确实有效。

storage.wiredTiger.engineConfig.cacheSizeGB 的默认值为max((RAM-1GB)/2, 256MB)。如果您的 mongodb 服务器在具有默认配置的 docker 容器中运行,并且主机中运行着其他应用程序,则当您转储大型集合时,内存可能会被填满。如果容器的 RAM 由于您的配置而受到限制,也会发生同样的事情。

您可以使用docker run --name some-mongo -d mongo --wiredTigerCacheSizeGB 1.5(数量取决于您的情况)。

【讨论】:

    【解决方案3】:

    另一种可能性是将压缩标志添加到 mongodump 的输出中。它帮助我备份了一个挂在 48% 而不压缩的数据库。所以语法是:

    mongodump --uri="mongodb://mongousr:somepassword@host.domain.com:27017/somedbauthSource=admin"  --gzip --out="$BACKUP_PATH"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-03
      • 2022-01-21
      • 1970-01-01
      • 2021-11-13
      • 1970-01-01
      • 1970-01-01
      • 2014-08-27
      相关资源
      最近更新 更多