Azure VM上与MongoDb的连接超时

时间:2015-12-19 16:43:38

标签: mongodb azure mongodb-.net-driver azure-virtual-machine azure-virtual-network

将Azure Web App连接到Azure VM上托管的MongoDb时,我遇到了一些超时问题。

2015-12-19T15:57:47.330+0100 I NETWORK  Socket recv() errno:10060 A connection attempt 
 failed because the connected party did not properly respond after a period of time, 
 or established connection failed because connected host has failed to respond.
2015-12-19T15:57:47.343+0100 I NETWORK  SocketException: remote: 104.45.x.x:27017 error: 
 9001 socket exception [RECV_ERROR] server [104.45.x.x:27017]
2015-12-19T15:57:47.350+0100 I NETWORK  DBClientCursor::init call() failed

目前mongodb配置在单个服务器上(仅适用于dev),并通过公共IP公开。网站使用azure域名(* .westeurope.cloudapp.azure.com)连接到它,没有虚拟网络。

通常一切都运行良好,但经过几分钟的不活动后,我得到了超时异常。从我的PC上使用MongoDb shell时会发生同样的情况,所以我很确定这是mongodb方面的一个问题。

我错过了一些配置?

2 个答案:

答案 0 :(得分:11)

在这里搜索了一些我的注意事项:

  • 在Azure上访问的每个资源(数据库,VM,...)上实现某种重试逻辑通常是一种很好的做法。对于MongoDb,有一个部分实现,所以你应该写自己的。另请参阅this issuethis
  • 如果可能,Azure上的所有资源都应位于同一个Azure虚拟网络中(这样所有连接都使用Azure Private Ip而不是Public Ip。出于安全考虑,这也很有用,因为您不需要打开端点对公众。
  • 在Azure上部署MongoDb时,请尝试关注官方MongoDb guidelines
  • 在这种特殊情况下,您应该将net.ipv4.tcp_keepalive_time设置为低于Azure的tcp保持活动的值,默认情况下为240秒。通过这种方式,连接被关闭,MongoDb驱动程序可以拦截这种情况并打开一个新连接。如果Azure关闭连接,则驱动程序无法拦截它。如果要在Azure上更改此设置(不推荐),可以在Public Ip配置中找到它。

在我的开发环境中,我已将net.ipv4.tcp_keepalive_time设置为120,现在一切似乎都正常。请注意,如果您在Docker容器中托管MondoDb,则应在Docker主机上设置此设置。

这里有一些其他有用的链接:

答案 1 :(得分:4)

使用C#Mongo驱动程序时,我们通过设置以下

解决了这个问题
MongoDefaults.MaxConnectionIdleTime = TimeSpan.FromMinutes(1);