【问题标题】:AWS ELB dropping the connections. Need to keep it aliveAWS ELB 丢弃连接。需要让它活着
【发布时间】: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

(Source)

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

注意:我们现在设置了较低的值来测试问题

但是,当我运行任何查询时,它会在 80 秒后返回 EOFException(这是由于连接关闭)。我还通过运行从数据库客户端对此进行了测试 选择睡眠(90);

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

【问题讨论】:

  • 我不认为你可以将超时时间增加超过 4000 秒 (MAX)。但是,您可以探索将您的选择查询放入 memcached 缓存层的选项,可能是 Redis 等)
  • 我不希望 AWS 增加超时时间(从当前的 4000 开始;如果他们这样做了也不会抱怨),但有一些方法可以确保连接保持活跃。不过,Memcache 不适合我们的需求。
  • @Pankaj 增加超时实际上正是您所要求的。尽管您进行了设置,但连接在较高层仍然空闲,因此空闲超时正在触发。 TCP keepalives 不会增加有效负载字节计数器,这是正在考虑的“空闲”类型。
  • @Michael-sqlbot 我明白你在说什么,是的,在彻底阅读了文档之后,我明白你为什么是对的。或者,我们为我们的用例找到了几种解决此问题的方法,其中一种有效,另一种我们尚未尝试。一旦我们确认,将在此处更新(尽管年底将需要一些时间)。谢谢!

标签: amazon-web-services vertica


【解决方案1】:

对于在这篇文章中遇到类似问题的任何人,我们现在已经解决了这个问题。 问题是 ELB 不支持 TCP 参数(tcp keep-alives)。

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

  1. 消除 ELB,而将 EIP 用于数据库集群。
  2. 用 NLB 替换 ELB。

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

【讨论】:

    猜你喜欢
    • 2021-07-02
    • 2021-12-06
    • 1970-01-01
    • 2012-09-21
    • 2023-03-31
    • 2015-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多