AWS ELB 断开连接。需要让它活着
AWS ELB dropping the connections. Need to keep it alive
我有我的 AWS 部署的 SpringBoot 应用程序,它触发 select 查询(基于请求)并生成包含结果集的输出文件 (zip)。
通讯为:
SpringBoot app -> AWS Route 53 -> AWS ELB -> Vertica DB Cluster
触发的查询可以 运行 几个小时,因此,我的连接将保持活动状态。问题是 ELB 似乎在空闲超时期限后断开连接。应用程序连接到端口 5433 上的 Vertica DB。
[root@ip-10-122-5-151 logs]# netstat -anpo | grep 5433
tcp6 0 0 10.122.5.151:47956 10.122.32.89:5433 ESTABLISHED 26605/java keepalive (9.06/0/0)
tcp6 0 0 10.122.5.151:58416 10.122.33.133:5433 ESTABLISHED 26605/java keepalive (8.67/0/0)
tcp6 0 0 10.122.5.151:47966 10.122.32.89:5433 ESTABLISHED 26605/java keepalive (11.10/0/0)
tcp6 0 0 10.122.5.151:47972 10.122.32.89:5433 ESTABLISHED 26605/java keepalive (12.38/0/0)
tcp6 0 0 10.122.5.151:47960 10.122.32.89:5433 ESTABLISHED 26605/java keepalive (10.08/0/0)
tcp6 0 0 10.122.5.151:47970 10.122.32.89:5433 ESTABLISHED 26605/java keepalive (12.13/0/0)
可以看出,client有keep-alive。在Vertica集群上,我们设置了属性:
echo 60 > /proc/sys/net/ipv4/tcp_keepalive_time
echo 30 > /proc/sys/net/ipv4/tcp_keepalive_intvl
echo 20 > /proc/sys/net/ipv4/tcp_keepalive_probes
我们的 ELB 超时现在设置为 80 秒。
注意:我们暂时设置了较低的值来测试这个问题
但是,当我 运行 任何查询时,它 returns 在 80 秒后出现 EOFException(这是由于连接关闭)。我还通过 运行ning 从数据库客户端测试了这个
SELECT 睡眠(90);
有什么方法可以让这个连接保持几 (4-6) 小时吗?
对于遇到此 post 并遇到类似问题的任何人,我们现在已经解决了它。
问题是 ELB 不遵守 TCP 参数(tcp keep-alives)。
有几种方法可以解决这个问题:
- 取消 ELB,数据库集群使用 EIP。
- 用 NLB 替换 ELB。
我们继续使用 NLB,因为这对我们来说似乎是理想的解决方案。但是,如果您仍然遇到 NLB 问题,请务必阅读通过它连接时带来的限制(例如,您需要在客户端使用 nitro 实例通过 vpc 内部连接等连接到 NLB)
我有我的 AWS 部署的 SpringBoot 应用程序,它触发 select 查询(基于请求)并生成包含结果集的输出文件 (zip)。 通讯为:
SpringBoot app -> AWS Route 53 -> AWS ELB -> Vertica DB Cluster
触发的查询可以 运行 几个小时,因此,我的连接将保持活动状态。问题是 ELB 似乎在空闲超时期限后断开连接。应用程序连接到端口 5433 上的 Vertica DB。
[root@ip-10-122-5-151 logs]# netstat -anpo | grep 5433
tcp6 0 0 10.122.5.151:47956 10.122.32.89:5433 ESTABLISHED 26605/java keepalive (9.06/0/0)
tcp6 0 0 10.122.5.151:58416 10.122.33.133:5433 ESTABLISHED 26605/java keepalive (8.67/0/0)
tcp6 0 0 10.122.5.151:47966 10.122.32.89:5433 ESTABLISHED 26605/java keepalive (11.10/0/0)
tcp6 0 0 10.122.5.151:47972 10.122.32.89:5433 ESTABLISHED 26605/java keepalive (12.38/0/0)
tcp6 0 0 10.122.5.151:47960 10.122.32.89:5433 ESTABLISHED 26605/java keepalive (10.08/0/0)
tcp6 0 0 10.122.5.151:47970 10.122.32.89:5433 ESTABLISHED 26605/java keepalive (12.13/0/0)
可以看出,client有keep-alive。在Vertica集群上,我们设置了属性:
echo 60 > /proc/sys/net/ipv4/tcp_keepalive_time
echo 30 > /proc/sys/net/ipv4/tcp_keepalive_intvl
echo 20 > /proc/sys/net/ipv4/tcp_keepalive_probes
我们的 ELB 超时现在设置为 80 秒。
注意:我们暂时设置了较低的值来测试这个问题
但是,当我 运行 任何查询时,它 returns 在 80 秒后出现 EOFException(这是由于连接关闭)。我还通过 运行ning 从数据库客户端测试了这个 SELECT 睡眠(90);
有什么方法可以让这个连接保持几 (4-6) 小时吗?
对于遇到此 post 并遇到类似问题的任何人,我们现在已经解决了它。 问题是 ELB 不遵守 TCP 参数(tcp keep-alives)。
有几种方法可以解决这个问题:
- 取消 ELB,数据库集群使用 EIP。
- 用 NLB 替换 ELB。
我们继续使用 NLB,因为这对我们来说似乎是理想的解决方案。但是,如果您仍然遇到 NLB 问题,请务必阅读通过它连接时带来的限制(例如,您需要在客户端使用 nitro 实例通过 vpc 内部连接等连接到 NLB)