MongoDB连接超时错误

24

我使用了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的不同连接选项,但没有意义。


对于希望设置初始数据库连接超时的任何人,可以通过serverSelectionTimeoutMS来实现。目前,此选项在此处https://mongodb.github.io/node-mongodb-native/3.6/reference/connecting/connection-settings/中未记录。 - Ricky Boyce
3个回答

22
我想提供这个答案,因为它在免费的在线mongodb大学考试问题中出现了。它很详细并提供了文档。
我已经弄清楚了,并将清理一些混淆,主要是由于课程中缺乏解释所致。我并不是批评,但需要进一步的解释才能正确回答这个问题。
首先,在应用程序中连接到mongodb时,您将使用驱动程序。该驱动程序必须通过一些障碍才能执行与mongodb服务器的任何操作。当您理解这个障碍概念时,您就会理解这个问题。
每个最终建立的连接都必须经过一系列事情才能通过障碍,并最终进行写入或读取操作。
从视觉上来看,您可以这样想:
IO / write request occurs ==> || 第一层障碍 --> (服务器选择 -(错误 -> serverSelectionTimeoutMS))==> || 第二层障碍 --> 与服务器的连接 -(错误 -> 'connectionTimeoutMS')==> || 第三层障碍 --> 套接字连接 -(错误 -> 'socketTimeoutMS')==****写关注选项障碍**==> || 第四层障碍 --> '写入关注规范{w:<value>,j:<boolean>,wtimeout:<number>} ' ==> || 第五层障碍 --> 成功的写入/读取操作
我们可以将障碍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,现在如果服务器没有运行,它会快速退出。 - Nelson Rodriguez
非常详细的解释。谢谢你。 - Alekhya Yalla

18

我有过类似的经历,由于一个查询需要太长时间才能回复。

在node mongo驱动中,您有两个可配置的超时时间:

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

如果您的查询花费了超过30秒来发送其第一个结果,则会以连接超时错误结束。

如果您的查询在两个结果之间花费了超过30秒,则可能会因池缩小而导致该连接关闭。

您可能希望增加超时时间,或确保查询足够快(例如创建索引)。我建议加速查询,因为增加超时时间可能会影响性能。


2
有没有可能提供一些关于哪些查询花费了太长时间的信息?在我的日志中,我只看到了连接超时的错误,但我找不到是哪个查询导致的。谢谢! - Thierry
我只是在客户端处理错误并在此记录查询。 - Cactusbone
哦,好的!谢谢! - Thierry

-1
“endpoint request timed out”错误可能也是由于IP问题引起的。 只需进入MongoDB Atlas管理面板,在安全选项卡中,更新IP地址为0.0.0.0/0。 enter image description here

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接