处理 MongoDB 从节点断开/重新连接

Posted

技术标签:

【中文标题】处理 MongoDB 从节点断开/重新连接【英文标题】:Handling MongoDB disconnect/reconnects from Node 【发布时间】:2012-12-27 10:13:25 【问题描述】:

当我的 MongoDB 连接空闲几分钟后,下一个请求以错误结束。从mongo 命令行客户端,它看起来像这样:

> db.users.find()
Sat Jan 12 23:42:35 Socket recv() errno:54 Connection reset by peer 107.22.25.25:47207
Sat Jan 12 23:42:35 SocketException: remote: 107.22.25.25:47207 error: 9001 socket exception [1] server [107.22.25.25:47207] 
Sat Jan 12 23:42:35 DBClientCursor::init call() failed
Sat Jan 12 23:42:35 query failed : chowology.users  to: ds047207.mongolab.com:47207
Error: error doing query: failed
Sat Jan 12 23:42:35 trying reconnect to ds047207.mongolab.com:47207
Sat Jan 12 23:42:35 reconnect ds047207.mongolab.com:47207 ok

我发现 MongoHQ 和 MongoLab 的沙盒实例存在问题。

由于重新连接,下一个请求正常进行。这是我的网络应用程序中的一个问题,因为几分钟不活动后,在网络请求期间会出现此错误。有两件事让我感到惊讶:

    MongoDB 连接如此频繁且频繁地被破坏,并且 驱动程序只是引发异常,而不是在重新连接后自动重试(我正在使用 connect-mongo,它使用 mongoose,而后者又使用 node-mongodb-native)。

这是其他人的经历吗?这个应该怎么处理?如果应用程序开发人员将他们的数据库操作包装在一些重试异常处理的废话中,我会感到惊讶。

【问题讨论】:

这可能有用:***.com/questions/14159134/… 【参考方案1】:

您想查看服务器对象的文档

http://mongodb.github.com/node-mongodb-native/api-generated/server.html#server

尤其是可以设置keepAlive 和连接超时的socketOptions。默认情况下,keepalive 关闭,超时为 0 或从不,这意味着操作系统默认套接字超时有效(因操作系统而异)。 Keep alive 将不时通过 tcp 套接字连接发送一个数据包以使其保持活动状态。有时防火墙配置不当,并且在关闭连接时不会发送结束数据包,从而导致连接死机并且处于不确定状态,这就是 monoglabs 人们所说的(老实说,它们的配置往往很糟糕)。

【讨论】:

感谢您提供详细信息。绕过我的路由器后,我不再有问题。这个路由器/防火墙配置是我可以自己做的吗?除了设置密码和打开传入端口之外,我对配置路由器一无所知。 完全取决于您的路由器。抱歉,我无法提供更多帮助,但路由器配置是一个特别可怕的痛苦世界,而且每个配置都不一样。 更新:更换路由器完全解决了这个问题。再次感谢。【参考方案2】:
    检查您的计算机不会进入睡眠状态 检查您的路由器/防火墙是否没有终止空闲连接

第一个问题原来是我的电脑在不知不觉中休眠并断开网络连接。这是一台新电脑,我没有意识到我没有禁用睡眠:-P

来自 MongoLab 的 Jared 帮助我解决了这个问题,我对此表示感谢。他说这种行为在通过防火墙时很常见(正如 mjhm 在他的评论中所建议的那样)。因此,一项测试是绕过它。

仍然通过我的路由器,闲置几个小时后我得到一个不同的错误:

db.users.find()
Sun Jan 13 14:55:02 Socket say send() errno:32 Broken pipe 107.22.25.25:47207
Error: 9001 socket exception [2] server [107.22.25.25:47207] 
Sun Jan 13 14:55:02 trying reconnect to ds047207.mongolab.com:47207
Sun Jan 13 14:55:02 reconnect ds047207.mongolab.com:47207 ok

我会从不通过我的路由器/防火墙的服务器再试一次。

驱动程序在当前操作上引发异常的行为是可以接受的,因为断开连接确实是一种例外情况。

更新:当我绕过我的路由器时,这些问题都不会出现,我的 Nodejitsu 实例也不会出现,我相信它在 Joyent 数据中心运行。

【讨论】:

【参考方案3】:

我遇到了同样的问题,我认为这是因为我在代理服务器后面访问互联网

【讨论】:

以上是关于处理 MongoDB 从节点断开/重新连接的主要内容,如果未能解决你的问题,请参考以下文章

Go语言实战基于 WebSocket + MongoDB 的IM即时聊天Demo

mongoDB有重新连接问题还是我做错了?

mongoDB有重新连接问题还是我做错了?

搭建高可用mongodb集群(分片)

如何从客户端断开和重新连接 socket.io?

PyQt 信号:在断开连接()之后,触发的信号仍然可以工作吗?