Docker-Schwarm-Datenbankverbindung durch Peer zurückgesetzt

12

Ich führe eine Spring-Boot-Anwendung mit Docker-Schwarm aus und verwende Postgres für die Datenbank. Wenn ich beide als Docker-Dienst ausführe, schlägt die Datenbankverbindung konsistent und zufällig fehl (wie Sie auf dem Zeitstempel sehen können), wie im Protokoll angegeben:

2017-10-26T 17:14:15 .200415747Z app-db.1.1ayo6h8ro1og@scw-c2964a | LOG: Daten vom Client konnten nicht empfangen werden: Verbindung durch Peer zurückgesetzt

2017-10-26T 17:43:36 .481718562Z app-db.1.1ayo6h8ro1og@scw-c2964a | LOG: Daten vom Client konnten nicht empfangen werden: Verbindung durch Peer zurückgesetzt

2017-10-26T 17:43:56 .954152654Z app-db.1.1ayo6h8ro1og@scw-c2964a | LOG: Daten vom Client konnten nicht empfangen werden: Verbindung durch Peer zurückgesetzt

2017-10-26T 17:44:17 .434171472Z app-db.1.1ayo6h8ro1og@scw-c2964a | LOG: Daten vom Client konnten nicht empfangen werden: Verbindung durch Peer zurückgesetzt

2017-10-26T 17:49:04 .154174253Z app-db.1.1ayo6h8ro1og@scw-c2964a | LOG: Daten vom Client konnten nicht empfangen werden: Verbindung durch Peer zurückgesetzt

Ich konnte den Grund dafür nicht verstehen oder entdecken. Ich würde mich über Ideen freuen.

bearbeiten:

Wir haben festgestellt, dass beim Testen der Anwendung auch der folgende Fehler auftritt:

SQLTransientConnectionException: HikariPool-1 - Verbindung ist nicht verfügbar, Zeitüberschreitung der Anforderung nach 937517 ms

Vielen Dank.

Elifcan Çakmak
quelle

Antworten:

9

Ich habe den gleichen Fehler beim Bereitstellen des Docker Swarm-Stacks von Spring Boot App und PostgreSQL. Nachdem ich ungefähr eine Woche lang damit gekämpft hatte, stellte ich fest, dass das Problem darin bestand, dass die Firewall Verbindungen zwischen Containern aufgrund von Inaktivität abbrach. Schnelle Antwort, führen Sie folgendes cmd auf einem Linux-Computer aus:

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

Außerdem habe ich die folgenden Eigenschaften des Tomcat-Verbindungspools aufgenommen:

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

Die Lösung kam von diesem Blogpost: HANDEL MIT NODENOTAVAILABLE AUSNAHMEN IN DER ELASTICSEARCH

Aleksandr Kravets
quelle
Ich werde es so schnell wie möglich versuchen. Danke für Ihre Hilfe!
Elifcan Çakmak
Hallo, ich habe die Lösung ausprobiert und nur den ersten Teil angewendet. es ist seit gestern auf und nicht gescheitert. Ich denke, es funktioniert :) Vielen Dank!
Elifcan Çakmak
Container, auf denen Kernel 4.13 oder höher ausgeführt wird, erben nicht mehr tcp_keepalive_timevom Host (Quelle: success.docker.com/article/ipvs-connection-timeout-issue ), sodass dieser Ansatz mit neueren Containern nicht mehr funktioniert. Ab Docker 19.03 gibt es jedoch eine sysctlOption, die für Dienste bereitgestellt werden kann (z. B. in einer Erstellungsdatei). Dies kann verwendet werden, um die oben genannten Flags direkt in den Containern zu setzen, ohne den Host zu beeinträchtigen. docs.docker.com/compose/compose-file/#sysctls
avejidah
1

Es gibt eine andere Möglichkeit, das Schließen der Leerlaufverbindung zu verhindern. Das Problem hängt mit der Standarderkennung des Schwarmdienstes zusammen, bei der die Leerlaufverbindung nach 15 Minuten geschlossen wird.
Explizit angegeben, der dnsrr Endpunktmodus behebt das Problem, z.

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
xxxception
quelle