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