피어에 의한 도커 떼 데이터베이스 연결 재설정 데이터를 수신 할 수 없음 :

docker swarm으로 스프링 부트 응용 프로그램을 실행 중이며 데이터베이스에 postgres를 사용합니다. 둘 다 docker 서비스로 실행하면 로그에 표시된 것처럼 데이터베이스 연결이 일관되고 무작위로 (타임 스탬프에서 볼 수 있듯이) 실패합니다.

2017-10-26T 17:14:15 .200415747Z app-db.1.1ayo6h8ro1og@scw-c2964a | LOG : 클라이언트로부터 데이터를 수신 할 수 없음 : 피어에 의한 연결 재설정

2017-10-26T 17시 43분 36초 .481718562Z app-db.1.1ayo6h8ro1og@scw-c2964a | LOG : 클라이언트로부터 데이터를 수신 할 수 없음 : 피어에 의한 연결 재설정

2017-10-26T 17:43:56 .954152654Z app-db.1.1ayo6h8ro1og@scw-c2964a | LOG : 클라이언트로부터 데이터를 수신 할 수 없음 : 피어에 의한 연결 재설정

2017-10-26T 17:44:17 .434171472Z app-db.1.1ayo6h8ro1og@scw-c2964a | LOG : 클라이언트로부터 데이터를 수신 할 수 없음 : 피어에 의한 연결 재설정

2017-10-26T 17:49:04 .154174253Z app-db.1.1ayo6h8ro1og@scw-c2964a | LOG : 클라이언트로부터 데이터를 수신 할 수 없음 : 피어에 의한 연결 재설정

나는 그 이유를 이해하거나 알 수 없었다. 어떤 아이디어라도 감사합니다.

편집하다:

우리는 응용 프로그램을 테스트 할 때 다음과 같은 오류가 발생한다는 것을 깨달았습니다.

SQLTransientConnectionException : HikariPool-1-연결을 사용할 수 없습니다. 요청이 937517ms 후에 시간 초과되었습니다

감사.



답변

Spring Boot 앱과 PostgreSQL의 Docker Swarm 스택을 배포하는 것과 동일한 오류가 발생했습니다. 약 1 주일 동안이 문제를 해결 한 후 비활성으로 인해 컨테이너간에 방화벽이 연결을 끊는 문제가 있음을 알았습니다. 빠른 대답, Linux 컴퓨터에서 다음 cmd를 실행하십시오.

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

또한 다음과 같은 바람둥이 연결 풀 속성을 포함 시켰습니다.

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

해결책은이 블로그 포스트에서 나온 것입니다 : 탄성 검색에서 특정 예외를 다루기


답변

유휴 연결 종료를 방지하는 다른 방법이 있습니다. 이 문제는 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


답변