【问题标题】:Monitoring MongoDB "background operations"?监控 MongoDB“后台操作”?
【发布时间】:2016-02-21 08:59:18
【问题描述】:

编辑: 基本上,我正在寻找一些关于如何理解我的 MongoDB 实例上正在运行的后台操作的提示,并可能在必要时减少/禁用它们,这样它们就不会干扰运行测试。我尝试了mongostatmongotop,但没有找到任何可以帮助我了解正在运行的后台操作以及启动它们的内容。 db.currentOp() 在我开始运行测试之前运行时始终返回一个空数组。

我在使用 node (mocha, cucumber) 开发时定期运行测试。从昨天开始,大约 25% 的时间服务器初始化尝试连接 mongodb 失败,并出现以下错误:

**Unhandled rejection MongoError: exception: cannot perform operation: a background operation is currently running for collection** somecollection
    at Function.MongoError.create (/somepath/node_modules/pow-mongodb-fixtures/node_modules/mongodb/node_modules/mongodb-core/lib/error.js:31:11)
    at /somepath/node_modules/pow-mongodb-fixtures/node_modules/mongodb/node_modules/mongodb-core/lib/topologies/server.js:793:66
    at bound (domain.js:254:14)
    at runBound (domain.js:267:12)
    at Callbacks.emit (.../node_modules/pow-mongodb-fixtures/node_modules/mongodb/node_modules/mongodb-core/lib/topologies/server.js:94:3)
    at null.messageHandler (/somepath/node_modules/pow-mongodb-fixtures/node_modules/mongodb/node_modules/mongodb-core/lib/topologies/server.js:235:23)
    at Socket.<anonymous> (/somepath/node_modules/pow-mongodb-fixtures/node_modules/mongodb/node_modules/mongodb-core/lib/connection/connection.js:294:20)
    at Socket.emit (events.js:107:17)
    at readableAddChunk (_stream_readable.js:163:16)
    at Socket.Readable.push (_stream_readable.js:126:10)
    at TCP.onread (net.js:538:20)

我们使用 pow-mongodb-fixtures 来清除数据库并在运行测试之前用一些基本数据填充它,这就是发生这种情况的地方。当这种情况开始发生时,AFAIK 并没有发生重大变化。我什至可以开始研究此错误的根源有什么想法吗?

【问题讨论】:

  • 使用 db.currentOp() 检查正在运行的后台进程。在活动后台进程的情况下,您的客户端被配置为抛出此错误
  • 这个命令总是返回一个空数组。可能当我运行它时,“后台操作”已经完成。不过,有时我需要运行 3 或 4 次才能克服此错误。
  • 您可能使用db.currentOp() 走在正确的轨道上,但可能只是没有正确使用它。这篇文章更深入; Viewing and killing currently executing operations in MongoDB
  • 在运行测试之前我们 1. 清除整个数据库,然后 2. 插入一些基本文件。步骤 2 使用 mongoose 运行,因此它还添加了索引,但这仅在清除完成后才会发生。据我所知,这是清理失败。我可能是错的,错误可能来自确保索引的插入步骤(应该都已经存在的索引)。
  • @robocode,当我运行它时,db.currentOp() 再次返回一个空数组。您链接的文章假设您有一个需要一分钟或更长时间才能完成的操作,并且您有足够的时间进行调查。在我的情况下,这些后台操作似乎会运行一两秒钟然后停止,但经常是偶尔会干扰清除数据库。

标签: node.js mongodb mongodb-indexes


【解决方案1】:

好吧,我不会将此标记为答案,因为我正在寻找一种方法来监视正在发生的事情并通过 mongo db 找出问题。不过,我确实发现了问题所在。这不是世界上最有用的解决方案,但事实证明我们正在异步启动服务器,这将运行所有 mongoose 模式,从而检查/重新创建所有索引,并且或多或少同时运行夹具代码以清除我的收藏。

简而言之,在创建索引时不要尝试删除集合:)

【讨论】:

  • 如果您使用的是 Mongoose,您可能在创建索引时错过了使用选项 {"background": false}。然后,当某些操作试图删除集合时,索引可能会在后台运行。将 background 设置为 false 会使索引在前台运行。
  • 使用 Mongoose 时的另一个解决方法是在删除集合之前调用“model.init()”。即使在后台创建索引,这也应该有效。更多信息thecodebarbarian.com/whats-new-in-mongoose-5-2-syncindexes
【解决方案2】:

在这种情况下,您的朋友是:

db.currentOp(true)

指定 true 包括对空闲连接的操作和系统操作。

请看这里:https://docs.mongodb.org/manual/reference/method/db.currentOp/

【讨论】:

  • 当然我做到了,但是您继续指定运行 db.currentOp() 没有额外的参数,这可能对您的情况有所帮助。无论如何,很高兴听到您的问题得到解决:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-10
  • 2014-07-16
  • 1970-01-01
相关资源
最近更新 更多