7

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

4

1 回答 1

5

来自:http ://christiankvalheim.com/post/32209721702/tcp-keepalive

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

应用程序和 mongodb 实例之间有一个防火墙,它不遵守 keepAlive。

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

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

于 2013-01-05T02:06:56.133 回答