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

时间:2018-07-13 11:15:47

标签: postgresql docker wildfly docker-swarm

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

我有一个三节点码头工人群-主人和两个工人。 所有机器都是具有内核3.10.0和docker 18.03.1-ce的CentOS 7.5。

大多数事情都在主服务器上运行,其中之一是Wildfly(v9.x)应用程序服务器。 一个工作人员上有一个postgres数据库。 部署堆栈后,一切正常,但过一会儿(或可能在Web应用程序中执行特定操作之后),请求开始挂起。 在wildfly容器中运行netstat -ntp会显示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

由于View,需要前三个。

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

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

1 个答案:

答案 0 :(得分:0)

事实证明,这是一个已知问题,其中群集连接中的池连接具有不同节点上的服务。

基本上,解决方法是在套接字上设置以上可调参数+启用tcp keepalive。有关更多详细信息,请参见herehere