node-mongodb-native MongoClient 意外关闭连接

Posted

技术标签:

【中文标题】node-mongodb-native MongoClient 意外关闭连接【英文标题】:node-mongodb-native MongoClient unexpectedly closing connections 【发布时间】:2012-12-19 00:13:11 【问题描述】:

我一直在搜索 mongodb 中意外关闭的连接,但只能找到希望关闭连接的人提出的问题。

我正在使用 node-mongodb-native 连接到数据库,但我不断收到看似随机的“错误:连接已关闭”消息。如果我手动重试请求(浏览器刷新),则请求有效。

知道是什么原因造成的吗?是否有一些简单的选项会有所帮助?

我正在使用以下方法获取我的数据库句柄:

     MongoClient.connect(connection_string,  auto_reconnect: true , function (err, db) 
     //server code/routes in here
     

我一直在查看https://github.com/mongodb/node-mongodb-native/blob/master/lib/mongodb/connection/server.js,但我意识到我对连接池的管理方式的有限理解让我大吃一惊。我的印象是他们会在我的服务器的整个生命周期内保持打开状态。有人可以帮忙吗?

编辑: 在阅读了 mjhm 的 cmets 之后,我开始更深入地研究 TCP keep alive。偶然发现一些网站暗示这可能是 Azure 所做的(这个问题现在被错误分类了!)。显然,Azure 负载均衡器会在活动 1 分钟后终止连接。我正在使用 Azure 网站,所以它可能适用也可能不适用,但我认为这种洞察力足以开始新的调查。更多细节在这里http://blogs.msdn.com/b/avkashchauhan/archive/2011/11/12/windows-azure-load-balancer-timeout-details.aspx

【问题讨论】:

您能提供更多信息吗?你的数据库是本地主机还是另一台机器?哪些数据库调用触发了连接关闭消息?服务器上有多少负载?等等。 您好,数据库托管在 mongohq 上。服务的负担很小。我无法可靠地重现该问题,但我注意到 find() 调用肯定会失败。我尝试在 node-mongodb-native 驱动器中将 keepAlive 标志硬编码为 true,但这也不起作用。 这篇笔记有一些建议,christiankvalheim.com/post/32209721702/tcp-keepalive 谢谢!我想你是对的。我可以将其标记为答案。 【参考方案1】:

发件人:http://christiankvalheim.com/post/32209721702/tcp-keepalive

TCP 保持连接 使用 mongodb node.js 驱动程序时经常出现的一个问题是套接字停止响应。这通常有两个来源。

应用程序和mongodb实例之间有防火墙,它没有观察keepAlive。

您的系统上的套接字超时太高,导致套接字挂起并且永远不会关闭。 第一种情况可以通过设置套接字连接选项并启用 keepAlive 并在套接字上设置硬超时值来解决。这将确保正确配置的防火墙将保持连接处于活动状态,如果没有,它将超时。 另一件需要调整的是 os tcp_keepalive_time。基本上,对于 MongoDB(Linux 上默认为 2 小时)之类的东西来说,它太高了。将此值设置得较低将正确超时死套接字并让驱动程序恢复。

阅读更多关于它的好链接。 http://www.mongodb.org/display/DOCS/Troubleshooting#Troubleshooting-Socketerrorsinshardedclustersandreplicasets

【讨论】:

以上是关于node-mongodb-native MongoClient 意外关闭连接的主要内容,如果未能解决你的问题,请参考以下文章

Mongo 连接流在 NodeJS 应用程序中意外关闭

Mongo JSON 文档 -> JSON -> BSON

Lambda:找不到模块 './drivers/node-mongodb-native/connection'”,虽然添加了 mongoose 层

node-mongodb-native MongoClient 意外关闭连接

带有nestjs的Angular-universal:错误:找不到模块'./drivers/node-mongodb-native/connection'

node.js如何配置mongodb连接池?