docker swarm数据库连接被对等方重置


12

我正在使用docker swarm运行spring boot应用程序,并且将postgres用于数据库。当我将它们作为docker服务运行时,数据库连接始终随机地失败(如您在时间戳上所见),如日志所示:

2017-10-26T 17:14:15 .200415747Z app-db.1.1ayo6h8ro1og@scw-c2964a | 日志:无法从客户端接收数据:对等重置连接

2017-10-26T 17:43:36 .481718562Z app-db.1.1ayo6h8ro1og@scw-c2964a | 日志:无法从客户端接收数据:对等重置连接

2017-10-26T 17:43:56 .954152654Z app-db.1.1ayo6h8ro1og@scw-c2964a | 日志:无法从客户端接收数据:对等重置连接

2017-10-26T 17:44:17 .434171472Z app-db.1.1ayo6h8ro1og@scw-c2964a | 日志:无法从客户端接收数据:对等重置连接

2017-10-26T 17:49:04 .154174253Z app-db.1.1ayo6h8ro1og@scw-c2964a | 日志:无法从客户端接收数据:对等重置连接

我无法理解或发现原因。我将不胜感激。

编辑:

我们意识到,在测试应用程序时,它还会引发如下错误:

SQLTransientConnectionException:HikariPool-1-连接不可用,请求在937517ms之后超时

谢谢。

Answers:


10

我在部署Spring Boot应用程序和PostgreSQL的Docker Swarm堆栈时遇到了相同的错误。经过大约一个星期的努力,我发现问题出在防火墙由于容器不活动而断开了容器之间的连接。快速解答,在Linux机器上运行以下cmd:

sudo sysctl -w \
net.ipv4.tcp_keepalive_time=600 \
net.ipv4.tcp_keepalive_intvl=60 \
net.ipv4.tcp_keepalive_probes=3

同样,我还包括以下tomcat连接池属性:

tomcat:
  max-active: 10
  initial-size: 5
  max-idle: 8
  min-idle: 5
  test-on-borrow: true
  test-while-idle: true
  test-on-return: false
  test-on-connect: true
  validation-query: SELECT 1
  validation-interval: 30000
  max-wait: 30000
  min-evictable-idle-time-millis: 60000
  time-between-eviction-runs-millis: 5000
  remove-abandoned: true
  remove-abandoned-timeout: 60

解决方案来自此博客文章:应对弹性搜索中的可用节点异常处理


我会尽快尝试。谢谢您的帮助!
ElifcanÇakmak17年

嗨,我尝试了解决方案,我只应用了第一部分。从昨天开始一直没有失败。我想它有用:)非常感谢!
ElifcanÇakmak17年

运行内核4.13或更高版本的容器将不再tcp_keepalive_time从主机继承(来源:success.docker.com/article/ipvs-connection-timeout-issue),因此该方法不再适用于较新的容器。但是,从Docker 19.03开始,有一个sysctl选项可以提供给服务(例如,在撰写文件中)。这可用于直接在容器中设置以上标志,而不会与主机混淆。 docs.docker.com/compose/compose-file/#sysctls
avejidah

2

还有另一种防止关闭空闲连接的方法。该问题与默认的群集服务发现有关,该发现会在15分钟后关闭空闲连接。
明确指定dnsrr 端点模式可以解决问题,例如:

version: '3.3'

services:
  foo-service:
    image: example/foo-service:latest
    hostname: foo-service
    networks:
      - foo_network
    deploy:
      endpoint_mode: dnsrr
      # ...

networks:
  foo_network:
    external: true
    driver: overlay
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.