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

(Source)

我们的 ELB 超时现在设置为 80 秒。

注意:我们暂时设置了较低的值来测试这个问题

但是,当我 运行 任何查询时,它 returns 在 80 秒后出现 EOFException(这是由于连接关闭)。我还通过 运行ning 从数据库客户端测试了这个 SELECT 睡眠(90);

有什么方法可以让这个连接保持几 (4-6) 小时吗?

对于遇到此 post 并遇到类似问题的任何人,我们现在已经解决了它。 问题是 ELB 不遵守 TCP 参数(tcp keep-alives)。

有几种方法可以解决这个问题:

  1. 取消 ELB,数据库集群使用 EIP。
  2. 用 NLB 替换 ELB。

我们继续使用 NLB,因为这对我们来说似乎是理想的解决方案。但是,如果您仍然遇到 NLB 问题,请务必阅读通过它连接时带来的限制(例如,您需要在客户端使用 nitro 实例通过 vpc 内部连接等连接到 NLB)