docker swarm - 从 wildfly 到 postgres 的连接随机挂起

docker swarm - connections from wildfly to postgres randomly hang

我在部署 docker 堆栈(撰写文件)时遇到了一个奇怪的问题。

我有一个三节点 docker swarm - master 和两个 worker。 所有机器都是 CentOS 7.5,内核 3.10.0 和 docker 18.03.1-ce.

大多数东西 运行 都在 master 上,其中之一是 wildfly (v9.x) 应用程序服务器。 其中一名工人是一个 postgres 数据库。 部署堆栈后一切正常,但一段时间后(或可能在 Web 应用程序中执行特定操作后)请求开始挂起。 运行 netstat -ntp wildfly 容器内显示 52 个字节卡在 Send-q 中:

tcp        0     52 10.0.0.72:59338         10.0.0.37:5432          ESTABLISHED -

在 postgres 端,连接也处于 ESTABLISHED 状态,但发送和接收队列为 0。 它始终正好是 52 个字节。我在某处读到 ACK 带有时间戳的数据包也是 52 字节。有什么办法可以验证吗? 我们设置了以下 sysctl 可调参数:

net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 60
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_timestamps = 0

需要前三个,因为 this

堆栈中的所有服务都连接到 docker 创建的同一个 default 网络。 现在,如果我将 postgres 服务移动到与 wildfly 服务相同的主机上,问题似乎不会浮出水面,或者如果我为 postgres 声明一个单独的网络并将其仅添加到需要数据库(以及当然)问题似乎也没有表现出来。

有没有人遇到过类似的问题?谁能提供任何关于如何进一步调试问题的指示?

事实证明,这是一个已知问题,与在不同节点上提供服务的 swarm 中的池化连接有关。

基本上,解决方法是设置上述可调项 + 在套接字上启用 tcp keepalive。有关详细信息,请参阅 here and here