3

我在 Postgres 前面有一个 Amazon ELB。这是出于与 Kubernetes 相关的原因,请参阅此问题。我正在尝试解决 1 小时的最大AWS ELB 空闲超时限制,这样我就可以让客户端执行长时间运行的事务而不会被 ELB 断开连接。在我的情况下,我无法控制客户端配置,因此任何解决方法都需要在服务器端进行。

我遇到了tcp_keepalives_idlePostgres 中的设置,理论上应该通过向客户端发送定期保活数据包来解决这个问题,从而创建活动,因此 ELB 不会认为客户端处于空闲状态。

我尝试通过将idle timeoutELB 上的 设置为2 minutes. 我设置tcp_keepalives_idle为 30 秒,这应该强制服务器每 30 秒向客户端发送一次 keepalive。然后我通过负载均衡器执行以下查询psql -h elb_dns_name.com -U my_user -c "select pg_sleep(140)":2分钟后,ELB断开客户端。为什么keepalives没有通过客户端?有什么东西pg_sleep可能会阻止他们吗?如果是这样,是否有更好的方法来模拟长时间运行的查询/事务?

我担心这可能是一次深入的研究,我可能需要带出tcpdump或类似的工具。不幸的是,随着所有 k8s 的喋喋不休,事情的解析确实变得有点复杂。所以在走这条路之前,我想看看我是否遗漏了一些明显的东西。如果没有,任何关于如何最好地确定是否通过 ELB 实际将 keepalive 发送到服务器并最终到达客户端的提示将不胜感激。

更新:我就此联系了亚马逊。显然idle被定义为不通过网络传输dataData被定义为任何具有有效负载的网络数据包。由于 TCP keep-alives 没有有效负载,因此客户端和服务器 keep-alives 被认为是空闲的。因此,除非有办法让服务器在其保持活动负载中发送数据,或以其他形式发送数据,否则这可能是不可能的。

4

1 回答 1

2

Keepalive 是在 TCP 级别发送的,远低于 PostgreSQL,因此如果服务器正在运行 apg_sleep或其他东西,这并没有什么区别。

由于托管数据库有点像黑匣子,您可以尝试控制客户端的行为。幸运的是 PostgreSQL在客户端也提供了 keepalive 参数

尝试

psql 'host=elb_dns_name.com user=my_user keepalives_idle=1800' -c 'select pg_sleep(140)'
于 2019-02-26T13:18:02.647 回答