Azure VM 上 MongoDb 的连接超时

Connection timeout to MongoDb on Azure VM

将我的 Azure Web 应用程序连接到托管在 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 配置在单个服务器上(仅供开发人员使用)并通过 public ip 公开。网站使用 azure 域名 (*.westeurope.cloudapp.azure.com) 连接到它并且没有虚拟网络。

通常一切正常,但在几分钟不活动后,我收到超时异常。从我的电脑上使用 MongoDb shell 时也会发生同样的情况,所以我很确定这是 mongodb 方面的问题。

我缺少一些配置?

在这里搜索后我的考虑:

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

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

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

使用 C# Mongo 驱动程序时,我们通过设置以下内容解决了这个问题

MongoDefaults.MaxConnectionIdleTime = TimeSpan.FromMinutes(1);