【问题标题】:docker swarm - connections from wildfly to postgres randomly hangdocker swarm - 从wildfly到postgres的连接随机挂起
【发布时间】:2018-12-21 18:16:15
【问题描述】:

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

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

大多数东西都在主服务器上运行,其中之一是 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

因为this,所以需要前三个。

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

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

【问题讨论】:

    标签: postgresql docker wildfly docker-swarm


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-05-09
      • 2021-07-25
      • 1970-01-01
      • 2017-12-23
      • 1970-01-01
      • 1970-01-01
      • 2018-11-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多