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

时间:2013-01-13 08:05:54

标签: node.js mongodb mlab node-mongodb-native

当我的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的沙箱实例的问题。

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

  1. MongoDB连接被定期和频繁地销毁,
  2. 驱动程序只是引发异常,而不是在重新连接后自动重试(我使用的是使用mongoose的connect-mongo,后者又使用node-mongodb-native)。
  3. 这是其他人的经历吗?这怎么应该处理?如果应用程序开发人员将他们的数据库操作包装在一些重试异常处理废话中,我会感到惊讶。

3 个答案:

答案 0 :(得分:3)

您想查看Server对象的文档

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

特别是socketOptions,您可以在其中设置keepAlive和连接超时。默认情况下,keepalive处于关闭状态,超时为0或从不表示os默认套接字超时有效(从os到os不等)。保持活动状态会在tcp套接字连接中偶尔发送一个数据包以使其保持活动状态。有时防火墙配置不当,并且在关闭连接时不会发送结束数据包,导致连接死机并处于不稳定状态,这是单声道人们正在讨论的内容(通常情况下,他们的配置非常糟糕)。 p>

答案 1 :(得分:1)

  1. 检查您的计算机是否无法入住
  2. 检查您的路由器/防火墙是否未杀死空闲连接
  3. 第一个问题原来是我的电脑在不知不觉中睡不着网络连接。这是一台新电脑,我没有意识到我没有禁用睡眠:-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
    

    我会从没有通过我的路由器/防火墙的服务器再次尝试。

    驱动程序在当前操作系统上引发异常的行为是预期和可接受的,因为丢弃的连接确实是一种例外情况。

    更新:当我绕过路由器时,这些问题都不会发生,也不会发生在我认为在Joyent数据中心运行的Nodejitsu实例中。 < / p>

答案 2 :(得分:0)

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