postgresql - Postgres 的 tcp_keepalives_idle 不更新 AWS ELB 空闲超时

标签 postgresql amazon-web-services tcp-keepalive

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

我遇到过 Postgres 中的 tcp_keepalives_idle 设置,理论上应该通过向客户端发送定期保持事件数据包来解决这个问题,从而创建事件,因此 ELB 不会认为客户端是闲置的。

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

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

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

最佳答案

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

由于托管数据库有点像黑盒子,您可以尝试控制客户端的行为。幸运的是 PostgreSQL 还提供了 keepalive parameters on the client side .

实验

psql 'host=elb_dns_name.com user=my_user keepalives_idle=1800' -c 'select pg_sleep(140)'

关于postgresql - Postgres 的 tcp_keepalives_idle 不更新 AWS ELB 空闲超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54885951/

相关文章:

ruby-on-rails - 如何摆脱 postgresql 但在使用 mongohq 时仍然在 heroku 上使用 ActiveRecord::RecordNotFound?

amazon-web-services - AWS CloudFormation CodePipeline、ParameterOverrides、将列表传递到嵌套堆栈

amazon-web-services - 使用 aws-cdk 和 launch-template 的 cfn-hup 的正确资源路径

通过 EC2 进行类似 Heroku 的部署和环境配置

elasticsearch - 在Elasticsearch服务器中配置保持事件超时

linux - IPPROTO_TCP 或 SOL_SOCKET

python - 根据缺失时间范围自动填充数据库中缺失的行

spring boot postgres : FATAL: sorry, 已经有太多客户

c - 如何在VxWorks中为特定套接字fd(非系统范围)设置TCP保持事件间隔?

ruby-on-rails - gem install pg for ruby​​ on rails,错误消息 : lack of necessary libraries and/or headers