Mongorestore 似乎内存不足并杀死了 mongo 进程

mpa*_*tan 3 mongodb mongorestore docker rancher mongodb-3.6

在当前设置中,有两个 Mongo Docker 容器,在主机 A 和 B 上运行,Mongo 版本为 3.4,并在副本集中运行。我想将它们升级到 3.6 并增加一个成员,以便容器可以在主机 A、B 和 C 上运行。容器有 8GB 内存限制并且没有分配交换(当前),并且在Rancher 中进行管理。所以我的计划是启动三个新容器,为它们初始化一个副本集,从 3.4 容器中进行转储,然后将其恢复为新的副本集 master。

转储很顺利,它的大小约为 16GB。当我尝试将其恢复到新的 3.6 master 时,恢复开始正常,但是在恢复了大约 5GB 的数据后,mongo 进程似乎被 OS/Rancher 杀死,而容器本身没有重新启动,MongoDB 进程只是崩溃并重新加载自己。如果我再次运行 mongorestore 到同一个数据库,它会说所有已经插入的条目的唯一键错误,然后从它停止的地方继续,只在 5GB 左右后再次执行相同的操作。所以看起来 mongorestore 将它恢复的所有条目加载到内存中。

所以我必须为此找到一些解决方案,并且:

  1. 每次崩溃时,只需运行 mongorestore 命令,以便它从停止的地方继续。它可能应该有效,但我觉得这样做有点不安。
  2. 一次恢复数据库一个集合,但最大的集合大于5GB,因此它也无法正常工作。
  3. 将交换或物理内存(临时)添加到容器中,以便在进程用完物理内存后该进程不会被终止。
  4. 别的东西,希望有更好的解决方案?

Hie*_*ieu 7

正如另一个答案指出的那样,增加交换大小对我有用。此外,该--numParallelCollections选项控制集合的数量mongodump/mongorestore应该并行转储/恢复。默认值为 4,可能会消耗大量内存。

  • 将 ```--numParallelCollections``` 设置为 ```1``` 对于我的情况来说是最有效和最简单的解决方案:具有 1GB RAM 的 EC2 实例。 (4认同)