새벽 유휴 뒤 첫 쿼리에서 Communications link failure가 납니다
조회 0 · 댓글 0
Nginx 뒤에 스프링부트를 올려둔 사내용 API 서버입니다. 낮에는 요청이 꾸준한데 밤부터 새벽까지는 호출이 거의 없습니다. 문제는 아침 첫 요청, 또는 점심처럼 한참 비었다가 들어온 첫 요청에서만 간헐적으로 DB 쿼리가 터진다는 겁니다. 같은 요청을 바로 다시 날리면 멀쩡합니다.
환경은 Ubuntu 22.04, Java 17, Spring Boot 3.2.x(HikariCP), MariaDB 10.6이고 커넥터는 mysql-connector-j 8.x 입니다. 풀 옵션은 예전에 재접속 부담을 줄여보려고 max-lifetime을 0으로 둔 것 말고는 대부분 기본값입니다.
spring.datasource.hikari.max-lifetime=0
spring.datasource.hikari.connection-timeout=30000
# minimum-idle, idle-timeout 미설정, maximum-pool-size=10 기본앱 로그에 찍히는 건 이런 식입니다.
com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure
The last packet successfully received from the server was 48,210,113 milliseconds ago. The last packet sent successfully to the server was 48,210,113 milliseconds ago.
...
Caused by: java.io.EOFException: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.그 직전에 HikariCP 쪽 로그도 같이 보입니다.
HikariPool-1 - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl@5145c183 (No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value.DB 자체는 멀쩡하게 떠 있고 다른 커넥션은 정상입니다. MariaDB에서 확인해보니 이렇습니다.
MariaDB [(none)]> SHOW VARIABLES LIKE 'wait_timeout';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout | 28800 |
+---------------+-------+마지막 패킷 수신 48210113ms 전이면 대략 13시간 전이라, wait_timeout 28800초(8시간)를 넘겨 서버가 이미 끊어버린 커넥션을 풀이 그대로 쥐고 있다가 내주는 것으로 보입니다. 지금까지는 앱을 재시작하면 당분간 괜찮아지는 식으로만 넘겼는데 근본 원인을 못 잡았습니다. HikariCP와 MariaDB 중 어느 쪽 타임아웃을 기준으로 무엇을 맞춰야 이 첫 요청 실패를 막을 수 있을까요?
로그인 후 답글을 남길 수 있습니다.