【发布时间】:2019-05-18 13:06:56
【问题描述】:
我有我的 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(这是由于连接关闭)。我还通过运行从数据库客户端对此进行了测试 选择睡眠(90);
我有什么方法可以让这个连接保持几个 (4-6) 小时?
【问题讨论】:
-
我不认为你可以将超时时间增加超过 4000 秒 (MAX)。但是,您可以探索将您的选择查询放入 memcached 缓存层的选项,可能是 Redis 等)
-
我不希望 AWS 增加超时时间(从当前的 4000 开始;如果他们这样做了也不会抱怨),但有一些方法可以确保连接保持活跃。不过,Memcache 不适合我们的需求。
-
@Pankaj 增加超时实际上正是您所要求的。尽管您进行了设置,但连接在较高层仍然空闲,因此空闲超时正在触发。 TCP keepalives 不会增加有效负载字节计数器,这是正在考虑的“空闲”类型。
-
@Michael-sqlbot 我明白你在说什么,是的,在彻底阅读了文档之后,我明白你为什么是对的。或者,我们为我们的用例找到了几种解决此问题的方法,其中一种有效,另一种我们尚未尝试。一旦我们确认,将在此处更新(尽管年底将需要一些时间)。谢谢!
标签: amazon-web-services vertica