피어에 의한 도커 떼 데이터베이스 연결 재설정


12

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 후에 시간 초과되었습니다

감사.

답변:


10

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

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


최대한 빨리 시도하겠습니다. 도와 주셔서 감사합니다!
Elifcan Çakmak

안녕하세요, 나는 해결책을 시도하고 첫 번째 부분 만 적용했습니다. 어제부터 일어 났지만 실패하지 않았습니다. 나는 그것이 작동한다고 생각한다 :) 고마워!
Elifcan Çakmak

커널 4.13 이상을 실행하는 컨테이너는 더 이상 tcp_keepalive_time호스트에서 상속하지 않으므로 (source : 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.