我有SpringBoot应用程序的AWS部署,该应用程序触发选择查询(基于请求)并生成包含结果集的输出文件(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)
可以看出,客户端保持活动状态。在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秒。
注意:我们现在设置了较低的值来测试问题
但是,当我运行任何查询时,它会在80秒后返回EOFException(这是由于连接关闭)。我还通过运行从数据库客户端对此进行了测试 SELECT SLEEP(90);
我有什么办法可以使该连接保持几(4-6)小时?
答案 0 :(得分:0)
对于任何因类似问题而在这篇文章上绊脚石的人,我们现在解决了它。 问题在于ELB不遵守TCP参数(tcp保持活动状态)。
有两种解决方法:
我们继续使用NLB,因为这对我们来说似乎是理想的解决方案。但是,如果您仍然对NLB有问题,请仔细阅读通过NLB进行连接时所带来的限制(例如,您需要在客户端使用nitro实例通过vPC内部连接来连接到NLB等)