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 主机上设置此设置。
这里有一些其他有用的链接:
- http://focusmatic.tumblr.com/post/39569711018/solving-mongodb-connection-losses-on-windows-azure
- https://docs.mongodb.org/ecosystem/platforms/windows-azure/
- https://michaelmckeownblog.wordpress.com/2013/12/04/resolving-internal-ips-vs-dns-names-between-vms/
- https://gist.github.com/davideicardi/f2094c4c3f3e00fbd490
- MongoDB connection problems on Azure
- MongoDB connection timeouts (Azure)
使用 C# Mongo 驱动程序时,我们通过设置以下内容解决了这个问题
MongoDefaults.MaxConnectionIdleTime = TimeSpan.FromMinutes(1);
将我的 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 主机上设置此设置。
这里有一些其他有用的链接:
- http://focusmatic.tumblr.com/post/39569711018/solving-mongodb-connection-losses-on-windows-azure
- https://docs.mongodb.org/ecosystem/platforms/windows-azure/
- https://michaelmckeownblog.wordpress.com/2013/12/04/resolving-internal-ips-vs-dns-names-between-vms/
- https://gist.github.com/davideicardi/f2094c4c3f3e00fbd490
- MongoDB connection problems on Azure
- MongoDB connection timeouts (Azure)
使用 C# Mongo 驱动程序时,我们通过设置以下内容解决了这个问题
MongoDefaults.MaxConnectionIdleTime = TimeSpan.FromMinutes(1);