【问题标题】:MongoRestore Create Index Phase Uses 100% resources and locks up databaseMongoRestore 创建索引阶段使用 100% 资源并锁定数据库
【发布时间】:2013-12-19 14:26:58
【问题描述】:

我正在使用 MongoDB。我有一个包含 7M 记录和加权文本搜索索引的表。

当我执行 MongoRestore 时,恢复的创建索引阶段会使用 100% 的数据库资源。 MongoDB 在完成之前对任何事情都没有响应。我的数据库被锁定到任何传入连接。事实上,它停止向我的输出报告索引创建的任何进度,并且我的 mongodb 客户端开始收到请求超时错误。我仍然可以进入服务器端 mongodb 日志以检查索引创建的进度。

我需要数据库在此过程发生时做出响应。它适用于我所有其他较小的表。下一个最大的表,它工作得很好,并且仍然使用加权文本搜索索引,大约有 3M 条记录。

我该怎么办?!谢谢。

【问题讨论】:

  • 是否有必要将大型集合恢复到实时运行的数据库中?也有可能盒子上根本没有足够的资源来处理您正在尝试做的事情。您始终可以在不构建索引的情况下进行 mongorestore,然后在后台单独启动索引构建(使用背景选项)。

标签: mongodb database-performance


【解决方案1】:

我还没有尝试过,但似乎使用{ background: true } 创建的索引是由mongodump 与此属性一起转储的。该属性将在索引创建阶段传递给mongorestore

也许您可以使用后台选项重新创建一些战略索引,然后转储数据库。然后,恢复过程应该减少服务器的压力,并更快地完成。在 MondoDB 重建后台索引时,应该允许读写操作。

请注意,后台索引构建需要更长的时间才能完成并导致更大的索引。此外,这不适用于辅助副本集成员,因为后台索引创建操作将在它们上进行。

http://docs.mongodb.org/manual/tutorial/build-indexes-in-the-background/ http://docs.mongodb.org/manual/tutorial/build-indexes-on-replica-sets/

HTH。

【讨论】:

    【解决方案2】:

    我遇到了类似的问题:

    1. Mongo 还原占用了大量资源,以至于其他数据库操作只会超时或需要大约一分钟才能完成(还原本质上是对数据库的拒绝服务攻击)。
    2. Mongo 恢复索引阶段完全阻塞了数据库。

    我发现限制恢复的带宽问题 1 已解决。我使用 linux tc 命令行工具来实现这一点。调整速率和从非常低的突发,直到其他数据库操作开始受到影响,然后将其缩小一点。该命令如下所示: sudo tc qdisc change dev enp3s0 root tbf rate 30000kbit burst 40000kbit latency 5ms

    为了解决问题 2,我发现 this link 建议您:

    • 更新转储目录中的 *.metadata.json 文件以添加 background:true 如果不存在。
    • 使用 mongorestore 的 --noIndexRestore 选项来避免意外在前台构建任何索引,然后在 mongorestore 完成数据恢复后使用 background:true 创建索引。

    当然,所有这些都是一个问题,因为没有遵循 MongoDB 最佳实践,即让操作数据库始终以某种形式的副本集工作。如果存在复制,则可以使用更多选项,例如(过于简化)从较大的复制集中取出一个,还原到它,然后将其移回复制集中。

    【讨论】:

      猜你喜欢
      • 2011-03-09
      • 2018-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-28
      • 2011-10-13
      • 2013-01-31
      相关资源
      最近更新 更多