【问题标题】:mongodb connection timed out errormongodb连接超时错误
【发布时间】:2019-03-07 06:12:11
【问题描述】:

我使用了 mongodb 数据库和 node.js v12.0.10 来连接和更新 mongodb 集合。 连接代码如下:

 async.parallel({
        RE5: function (cb) {
            MongoClient.connect(config.riskEngineDB, function (err, r5DB) {
                cb(err, r5DB);
            })
        },
        MDB: function (cb) {
            MongoClient.connect(config.monitoringDB, function (err, mDB) {
                cb(err, mDB);
            })
        }
    },
    function (err, DBs) {
        assert.equal(null, err);
        console.log("Connected correctly to Dbs");
        // ..doing updates..

 })

运行一段时间后,脚本打印以下错误:

  { [MongoError: connection 39 to 127.0.0.1:27017 timed out]
  name: 'MongoError',
  message: 'connection 39 to 127.0.0.1:27017 timed out' }

供您参考,我使用了不同的 mongodb 连接选项,但没有意义。

【问题讨论】:

标签: javascript node.js mongodb nosql


【解决方案1】:

我想提供这个答案,因为它出现在免费在线 mongodb 大学的 mongodb 考试问题中。它是彻底的并提供文档。

我已经弄清楚了,并且会清理一些主要是由于课程中缺乏解释而引起的混乱。我不是批评,但需要进一步解释才能正确回答这个问题。

首先,当通过应用程序连接到 mongodb 时,您将使用驱动程序。该驱动程序具有必须通过的障碍才能对 mongodb 服务器执行任何操作。当你理解了这个障碍概念时,你就会理解这个问题。

为了通过障碍并最终执行写入或读取操作,必须发生最终构成事物列表的每个连接。

在视觉上你可以这样想:

IO / 写请求发生 ==> || 第一个障碍 --> (服务器选择 - (err -> serverSelectionTimeoutMS ) ) ==> || 2nd 障碍 --> 连接到服务器 - (err -> 'connectionTimeoutMS') ==> || 3rd 障碍 --> 套接字连接 - (err -> 'socketTimeoutMS') ==****写关注选项障碍**==> || 第四障碍 --> 'write concern specification { w: <value>, j: <boolean>, wtimeout: <number> }' ==> || 第 5 个屏障 --> 成功的写入/读取操作

*****注意**:根据您的逻辑,在此管道的任何地方都会发生故障,可能不会发生成功的写入/读取操作。

我们可以将障碍 1 - 3 视为连通性的网络障碍。如果网络出现故障或出现问题,这些是人们会通过超时和对这些超时的异常处理注意到的问题。必须了解的是,如果您一开始就无法连接到服务器,则无法执行带有写入问题的写入操作。本课本可以说明这些要点。

写入或读取操作的第一组障碍是建立与服务器的连接...这在上面的障碍 1 - 3 中进行了说明。

然后,在通过集群和/或集群副本集建立服务器连接后,您可以定义写入关注点。

在我们建立连接后,可能不会由于网络连接以外的原因发生写入。这些可能是由于 DDOS 或黑客攻击导致的数据冲突或写入的极端分配,或者通常没有足够的服务器空间将数据写入服务器。关键是,其他事情可能会导致对写入关注点的反应,因此通过选项控制来处理写入关注点错误。

我希望这会有所帮助,因为它使我能够相应地理解问题和正确答案。大多数情况下,我们并没有真正教过这个,所以我希望这可以帮助其他人学习和理解这个反馈循环。

以下是我阅读的一些文章,可帮助我得出这个答案/结论。如果有人对我的解释有更好或改进,请随时提供反馈。

https://scalegrid.io/blog/understanding-mongodb-client-timeout-options/

https://scalegrid.io/blog/mongodb-write-concern-3-must-know-caveats/

https://docs.mongodb.com/manual/reference/write-concern/

https://www.mongodb.com/blog/post/server-selection-next-generation-mongodb-drivers

【讨论】:

  • 谢谢!这就是我需要的。我有一个可选的 MongoDB 服务,如果服务器没有启动,系统应该尽快继续运行,但这需要 30 秒。直到我最终得到这个答案:我需要设置的值是 serverSelectionTimeoutMS,现在如果服务器没有运行,它会快速退出
  • 非常详细的解释。谢谢你。
【解决方案2】:

我有类似的经历,因为一个问题需要太多时间来回复

您在 node mongo 驱动程序中有 2 个可配置的超时:

connectTimeoutMSsocketTimeoutMS,都默认为 30 秒(http://mongodb.github.io/node-mongodb-native/2.2/reference/connecting/connection-settings/

如果您的查询发送第一个结果的时间超过 30 秒,它将以连接超时错误结束。

如果您的查询在两个结果之间的时间超过 30 秒,则它可能会因池收缩而关闭该连接。

您可能想要增加超时时间,或者确保您的查询足够快(例如创建索引)。我建议加快查询速度,因为增加超时可能会降低性能。

【讨论】:

  • 是否有可能获得一些关于哪些查询耗时过长的信息?在我的日志中,我只有错误提示连接超时,但我找不到它是哪一个。谢谢!
  • 我只是在处理错误客户端并在此处记录查询。
  • 哦,好吧!谢谢!
猜你喜欢
  • 2020-11-27
  • 2017-06-29
  • 2019-11-01
  • 2017-12-18
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 2015-10-20
相关资源
最近更新 更多