Mongoose: 4.7.1 => 4.7.2:MongoError 连接超时

创建于 2016-12-09  ·  44评论  ·  资料来源: Automattic/mongoose

测试[email protected] / [email protected]时,我得到:

MongoError:连接 2 到 XXXXXX 超时
在 Function.MongoError.create (/node_modules/mongodb-core/lib/error.js:29:11)
在套接字。(/node_modules/mongodb-core/lib/connection/connection.js:186:20)
在 Socket.g (events.js:286:16)
在 emitNone (events.js:86:13)
在 Socket.emit (events.js:185:7)
在 Socket._onTimeout (net.js:333:8)
在 tryOnTimeout (timers.js:224:11)
在 Timer.listOnTimeout (timers.js:198:5)' } ' 连接 2 到 XXXXXX 超时

[email protected] / [email protected] 不会发生这种情况。

更多细节:

  • 查询:与 allowDiskUse(true).read('secondaryPreferred').cursor() 聚合
  • 时间:发送查询后大约 35 秒发生错误(在收到第一个结果之前)
  • 节点版本:v6.3.0
  • npm 版本:3.10.9
  • 连接选项:
{
 "socketOptions": {
    "socketTimeoutMS": 240000,
    "keepAlive": 10000,
    "connectTimeoutMS" : 30000
} 
  • 询问:
[
    { $match: {
            _id: { $lt: oid },
            signature: { $exists: true }
        }
    },
    { $group: { 
            _id: { myid: '$myid', signature: '$signature' },
            count: { $sum:  1 },
            myid: { $first: '$myid' },
            docs: { $push: { _id: '$_id', name: '$name' } }
        }
    },
    { $match: {
            count: { $gt : 1 }
        }
    }
]

最有用的评论

这个问题已经有一段时间没有解决了。
我们应该怎么做才能解决这个问题?
在某些时候,我想更新到最新版本,但只有在解决了这个问题后我才能这样做。

所有44条评论

我遇到了同样的问题, [email protected][email protected]

  • 将 socketTimeoutMS 设置为更高的值或 0 没有区别
  • 将 connectTimeoutMS 设置为更高的值或 0 没有区别
  • 没有触发“关闭”或“重新连接”事件,只有“超时”,这会导致回调中的 Mongoose 错误

回滚到[email protected] / [email protected]解决问题,即不会导致超时

[email protected]到 2.2.12 超时事件监听器从“once”变成了“on”,也许这与它有关?

或者我们应该把它作为一个问题发布在 mongodb 本机驱动程序中?

@silentjohnny遇到与[email protected]相同的问题

我会在 mongodb 本机驱动程序中发布一个问题,mongoose 在初始连接方面并没有做太多事情。

诡异的。 我遇到了同样的问题,但是[email protected]及更高版本正在使用[email protected]
使用[email protected][email protected]它确实有效! .
我的聚合查询没有任何选项,所以我不知道,也许这就是我和原始问题@dcolens之间的区别。

有人向本机驱动程序提出问题吗? 所以我可以跟着它...
现在我住在[email protected]

[email protected]更新为[email protected] ,其中包括用于监视操作超时和在运行操作时生成超时事件的修复@1284917

很快 Mongoose 会更新到[email protected] ,我会试一试。

对我来说同样的问题,我什至不确定是否只是长时间运行的聚合超时,或者它是随机的,而不是真正的超时。 有时它似乎几乎立即超时,但有时它会运行 30 秒左右。 在这种特殊情况下,我同时运行了四个 aggregate.exec。

恢复到[email protected][email protected]修复它,所以我现在正在这样做。

由于 mongoose 4.7.7 使用[email protected],这有望在下一个版本中得到修复。 无论哪种方式,这都不是像@vkarpov15所说的真正的猫鼬问题,而是更多地与mongodb有关。 我现在要关闭这个,但是如果你在下一个版本之后仍然遇到同样的问题,你应该在 mongodb 端打开一张票或 PR。

我认为这个问题可能比表面上看到的更多。 我必须恢复到 4.4.20 才能完全阻止在所有情况下发生的这些聚合超时。 在多个并发执行的某些情况下,4.7.x 和 4.6.x 都有虚假的非常快的超时。 我跳过了 4.5 并直接回到了我们在生产中使用的已知良好版本(4.4.20),这完全解决了问题,但是 TBH 我仍然对正在发生的事情感到困惑。 很抱歉,我没有任何进一步的数据要添加,但我不确定这是否仅仅是 mongoose 使用的本机 mongodb 驱动程序版本的问题,或者是否有多个因素在起作用.

[email protected][email protected] 有同样的问题。 超时真的很奇怪。 这个很短(大约 5 秒)并且非常可重复,但其他查询需要超过 5 秒并且不会超时

我确定超时通常是虚假的。 在我看到的一种情况下,我同时启动了四个聚合.exec 操作,大约需要 30 秒。 一个8秒超时,一个20秒超时,另外两个30秒正常完成。 重复导致不同的超时顺序,但总是产生相似的结果。 我怀疑在错误的连接上错误地设置了超时,或者在操作完成时没有被删除,因此它们在随后的 exec 上意外触发。 反正是这样的。 不幸的是,我现在没有时间去追求它。

[email protected]似乎已经为我解决了超时问题。 @steve-p-com 就像您建议的那样,4.7.2 中的超时确实是虚假的,并导致在错误的连接上发出错误事件,这已由[email protected]解决,因此[email protected]应该在你的情况下工作正常。 您是否使用该版本进行了测试?

尚未测试 4.7.9 或 4.8.0,也许[email protected]引入了回归,这可以解释@flosky遇到的问题。 该超时是否也发生在[email protected] 上?

我今天重新测试了 4.8.1,没有遇到任何意外超时问题。 我首先删除了所有 npm 缓存和纱线缓存,然后删除了 node_modules,然后重新安装了所有内容。 到目前为止,一切都很好。

4.8.1 也发生在我身上。 我在 Mongoose 和 MongoDB 上返回了许多版本,并且一直遇到问题。

@thenitai你有更多的上下文/我们可以看看你是如何设置你的 mongoDB 连接的吗?

@varunjayaraman我发现我们的域错误代码正在捕获错误,因此重新启动了我们的应用程序。 但是,问题仍然存在。

不太确定您需要在我们的连接设置中看到什么。 你的意思是连接选项? 如果是这样,它们是:

var dbOptions = {
            db: { native_parser: true },
            server: {
                auto_reconnect: true,
                socketOptions: {
                    keepAlive: 1, 
                    connectTimeoutMS: 300000,
                    socketTimeoutMS: 300000
                }
            }
        };

我也有同样的问题。 即使使用最新版本 v4.8.4

刚刚发现问题。 在我的情况下,这是因为服务器内存使用率太高(总是95%~99%),增加内存后就没有问题了。

我在使用 Mongoose 4.7.7 、 MongoDB 3.4.1和 Node 4.7.2的服务器上也看到了这个问题。 当我的服务器上的内存使用率很高时,超时似乎是随机发生的:

CosWebsite-27 MongoError: connection 42 to 127.0.0.1:27017 timed out
CosWebsite-27     at Function.MongoError.create (/home/cos/cos/node_modules/mongodb/node_modules/mongodb-core/lib/error.js:29:11)
CosWebsite-27     at Socket.<anonymous> (/home/cos/cos/node_modules/mongodb/node_modules/mongodb-core/lib/connection/connection.js:186:20)
CosWebsite-27     at Socket.g (events.js:260:16)
CosWebsite-27     at emitNone (events.js:67:13)
CosWebsite-27     at Socket.emit (events.js:166:7)
CosWebsite-27     at Socket.wrapped (/home/cos/cos/node_modules/newrelic/lib/transaction/tracer/index.js:183:28)
CosWebsite-27     at Socket.wrappedEmit [as emit] (/home/cos/cos/node_modules/newrelic/lib/transaction/tracer/index.js:220:46)
CosWebsite-27     at Socket._onTimeout (net.js:333:8)
CosWebsite-27     at _runOnTimeout (timers.js:537:11)
CosWebsite-27     at _makeTimerTimeout (timers.js:528:3)
CosWebsite-27     at Timer.unrefTimeout (timers.js:597:5)
... times 6
CosWebsite-27 GET /clans/compas-c-r-98QP9J2G/members 500 10569.300 ms - 9893
CosWebsite-27 GET /players/1000-99JQVQ9VU 500 12388.484 ms - 9849
CosWebsite-27 GET /players/R0YUPPRR/profile 500 8204.622 ms - 9857
CosWebsite-27 GET /players/UG8YJUJY/profile 500 4622.819 ms - 9857
CosWebsite-27 GET /clans/next-state-P8RYGQYV 500 11526.859 ms - 9861
CosWebsite-27 GET /clans/YY2CCUVV 500 6755.380 ms - 9817

正如您所看到的请求,没有一个请求持续超过 12 秒。 我的猫鼬连接器是这样设置的:

const mongoDB = {
    uri: "mongodb://127.0.0.1:27017/XXX",
    options: {
        host: '127.0.0.1',
        port: '27017',
        database: "XXX",
        compression: false,
        server: {
            poolSize: 5,
            auto_reconnect: true,
            socketOptions: {
                socketTimeoutMS: 0,
                connectTimeoutMS: 0
            }
        },
        promiseLibrary: Promise
    }
};

知道可能出了什么问题吗?

@adrienbaron我也是!!!
有人请帮助我。

是否有人向本地 mongo 驱动程序的开发人员提交了错误报告?

这个问题在 4.9.1 中还存在吗?

是的,4.9.1 中仍然存在问题......

猫鼬@4.9.1
[email protected]
[email protected]

今天更新到最新的猫鼬版本后也遇到了同样的问题,然后我降级回 4.7.1,一切正常!

这个问题已经有一段时间没有解决了。
我们应该怎么做才能解决这个问题?
在某些时候,我想更新到最新版本,但只有在解决了这个问题后我才能这样做。

大约一个月前,我将 Mongoose 从 4.4.17 更新到了 4.7.9。 从那时起,每天的 cronjob 现在已经出错了 3 次,总是出现 mongo 连接超时错误。

我将切换到 Mongoose 4.7.1,看看这是否有帮助。

编辑:错误信息

2017-04-19 03:09:23: You have triggered an unhandledRejection, you may have forgotten to catch a Promise rejection:
MongoError: connection 261 to localhost:27017 timed out
    at Function.MongoError.create (/var/www/someproject/node_modules/mongodb-core/lib/error.js:29:11)
    at Socket.<anonymous> (/var/www/someproject/node_modules/mongodb-core/lib/connection/connection.js:186:20)
    at Socket.g (events.js:286:16)
    at emitNone (events.js:86:13)
    at Socket.emit (events.js:185:7)
    at Socket._onTimeout (net.js:333:8)
    at tryOnTimeout (timers.js:224:11)
    at Timer.listOnTimeout (timers.js:198:5)

@centigrade-thomas-becker 我在生产中遇到同样的问题一个多月了,我昨天切换回 4.7.1,没有更多问题了!

同样的问题发生@ 4.7.7

Mongo 4.7.1 的问题比 4.7.9 少,但在保存到 MongoDB 时仍然偶尔会收到错误消息:

2017-04-30 03:09:32: Error: connection timeout
    at .<anonymous> (/var/www/someproject/node_modules/mongoose/lib/drivers/node-mongodb-native/connection.js:168:17)
    at emitTwo (events.js:106:13)
    at emit (events.js:191:7)
    at listener (/var/www/someproject/node_modules/mongodb/lib/db.js:1791:14)
    at emitOne (events.js:96:13)
    at emit (events.js:188:7)
    at .<anonymous> (/var/www/someproject/node_modules/mongodb/lib/server.js:270:14)
    at g (events.js:286:16)
    at emitOne (events.js:96:13)
    at emit (events.js:188:7)
    at .<anonymous> (/var/www/someproject/node_modules/mongodb-core/lib/topologies/server.js:322:12)
    at emitOne (events.js:96:13)
    at emit (events.js:188:7)
    at .<anonymous> (/var/www/someproject/node_modules/mongodb-core/lib/connection/pool.js:271:12)
    at g (events.js:286:16)
    at emitTwo (events.js:106:13)
    at emit (events.js:191:7)
    at Socket.<anonymous> (/var/www/someproject/node_modules/mongodb-core/lib/connection/connection.js:175:10)
    at Socket.g (events.js:286:16)
    at emitNone (events.js:86:13)
    at Socket.emit (events.js:185:7)
    at Socket._onTimeout (net.js:333:8)
    at tryOnTimeout (timers.js:224:11)
    at Timer.listOnTimeout (timers.js:198:5)

该错误发生在运行 Ubuntu 15.04 的 Linux VM 上

与这里相同:

├─┬ [email protected]
│ ├─┬ [email protected]
│ │ ├── [email protected]

mongo 版本 @ 3.2.11

在 AWS EC2 上。

任何更新/解决方法? keepAlive: true会产生积极的影响吗?

不确定这是否对任何人有帮助,但在我们的例子中,我们注意到我们通过options.server传入了超时参数( socketTimeoutMS等)。 这是_错误_! 我们正在使用副本集,因此我们的选项应如下所示:

在我们的例子中,应用程序实际上需要能够连接到副本或普通服务器,所以我们这样做了:

const serverOptions = {
  poolSize: 100,
  socketOptions: {
    socketTimeoutMS: 60000
  }
};

mongoose.createConnection(dbpath, {
  server: serverOptions,
  replset: serverOptions
});

希望对某人有所帮助!

大家好,
我正在使用 mlab 来托管我的数据库。 我收到这个错误
Mongo DB 连接错误:{[MongoError:连接 0 到 ds155841.mlab。 com:xxxxx超时'}

@RemeAjayi我认为这与这张票无关。
在深入研究问题后,您应该尝试/创建另一个。

@ ht2 你拯救了我的一天❤️

原始问题有什么可行的解决方案吗?

如果它对任何人有帮助,我在并行化 2 个残酷的find()查询(使用 Promise 模式)时遇到了这个问题。

车削

Promise.all([
  col1.find({longQuery: true}),
  col2.find({longQuery: true})
])
.spread(function(result1, result2) {
  //stuff
});

进入顺序方法

col1.find({longQuery: true})
.then(function(result1) {
  return Promise.all([
    result1,
    col2.find({longQuery: true})
  ]);
})
.spread(function(result1, result2) {
  //stuff
});

让它工作

@cyrilchapon认为它对我有用,但您的顺序方法并没有解决我的问题:/

它是间歇性的..有时它有效,有时它超时..

为什么会这样无声的关闭?

我之前评论的后续行动https://github.com/Automattic/mongoose/issues/4789#issuecomment -298849907

我将有问题的数据库从虚拟机移动到带有全​​新 linux、nodeJS 和 mongoDB 的 docker 容器。 我创建了一个压力测试,它整天只截断和重新填充数据库。 我发现大约 6000 次测试运行中有 1 次导致超时错误。

在我上次发表评论后,我猜想有同样的经历,忘了提及。

但是将 node 更新到其最新版本之一以及所有其他部门显然起到了作用。

现在有了上面的评论,我相信这是遗留错误的问题

我也遇到了与mongo 3.6.2mongoose 4.9.2相同的问题
我通过传递额外的连接参数来修复它

MONGO_URI=mongodb://user:[email protected]:27017/dbname?keepAlive=true&poolSize=30&autoReconnect=true&socketTimeoutMS=360000&connectTimeoutMS=360000

@mzahidriaz 非常感谢您的解决方案对我有用,但是您能否解释或参考链接以说明您如何选择这些参数来解决此问题?

@MinhNguyen41092现在唯一的文档是 MongoDB 驱动程序文档http://mongodb.github.io/node-mongodb-native/3.1/api/MongoClient.html#connect 。 我们会将有关此的详细信息添加到http://mongoosejs.com/docs/connections.html

对于那些遇到间歇性错误的人,我在 mongoose-4.13.11 和 mongodb-2.2.35 mongodb-core-2.1.19 在特定环境中也有这些错误。 在我们的测试套件中不同点的各种查询,虽然主要测试我们应用程序的一个特定部分,该部分具有较重的查询并在并行 IIRC 中执行操作,但都收到此错误消息。 整个测试套件甚至不需要 15 秒来运行,所以我不可能一开始就达到内置的默认 30 秒超时:

     MongoError: connection 0 to localhost:27017 timed out
      at Function.MongoError.create (node_modules/mongoose/node_modules/mongodb-core/lib/error.js:29:11)
      at Socket.<anonymous> (node_modules/mongoose/node_modules/mongodb-core/lib/connection/connection.js:200:20)
      at Socket._onTimeout (net.js:448:8)

这仅发生在我们的 CI 测试构建服务器中。 我无法在我的开发机器上重现它。

(在我自己的系统中(私人仓库,这是我自己的参考,以防需要再次挖掘它),这个错误至少出现在内部版本号是 358、356、355、352 中)。

打开useMongoClient: true后,到目前为止,测试似乎在 CI 环境中可靠地通过了。 我已经成功运行了 3 次,但由于奇怪的超时错误,许多之前的连续运行都失败了。

我认为@thenitai @steve-p-com @adrienbaron也正在经历奇怪的虚假超时。 我认为这个错误在 4.11 发布之前就发生在你们身上,甚至带来了useMongoClient: true作为选项。 您能说出这是否对您的工作负载产生了影响吗?

[email protected]
[email protected]
猫鼬@4.9.10
遇到同样的问题,这几天roll bar出现1.5M的错误,用什么可以连接? 如何解决?
screen shot 2019-02-25 at 2 53 37 pm
screen shot 2019-02-25 at 2 54 01 pm
screen shot 2019-02-25 at 2 55 27 pm

@SergeyVatz请参阅 #5376 上对您的问题的回复

此页面是否有帮助?
0 / 5 - 0 等级