Mysql, HikariCP connection timeout으로 인한 connection 누수

이동욱·2023년 8월 21일
0

TroubleShooting

목록 보기
3/9

Mysql, HikariCP connection timeout으로 인한 connection 누수

1. 개요


프로젝트 진행 중 db로 mysql을 사용하는데 내가 직접 설치해서 써야하는 상황이라 직접 설치하고 개발하면서 테스트하던 도중 'communications link failure' 에러가 계속해서 발생했다.

2. 원인


해당 프로젝트에서 db는 mysql, jdbc data source 구현체는 hikariCP를 사용했는데 이 둘 간의 timeout 설정이 맞지 않아 발생했던 문제였다.

mysql은 connection pool 내 connection이 사용중이지 않으면 wait_timeout이 지날때 종료하고 hikariCP에는 connection의 수명시간인 maxLifeTime이 있다. 이 둘을 확인해본 결과 hikariCp의 maxTimeout은 default로 30분이었고 mysql의 wait_timeout은 설정파일을 보니 1분으로 되어있었다.

hikariCP가 mysql과 connection을 맺은 이후 connection이 mysql의 설정에 따라 사용하지 않으면 1분 후 종료되고 해당 connection을 hikariCP에선 그대로 사용하려 했기 때문에 발생한 문제였다.
(내가 설치할 때 왜 이 설정을 그냥 넘어갔지 ... ㅠㅠ 실수해버렸다.)

3. 조치


mysql의 wait_timeout을 늘려주었다. 추가로 찾아보니 보통 db의 wait_timeout을 hikariCP의 maxTimeout보다 길게 설정할 것을 권장한다고 한다.

4. 결과


이제 정상적으로 작동하는 것을 확인할 수 있었다. ^0^

5. 추가


  • 2023-12-11 추가
    같은 고객사에 다른 프로젝트 지원 나갔을 때 해당 에러가 또 발생해 오류메시지가 뜬다고 한 번 봐달라고 요청이 왔다. 본사에 문의를 했다고 하는데 온 김에 겸사겸사 물어보셨다고
    그래서 파악해보니 에러가 거의? 안나다가 급격하게 늘어난 시점이 추석 전후라고 ... 그래서 일단 connection 개수를 늘려서 1차적으로 조치를 하고 후 상황을 보고 있다고 했다.
    나도 일단 다시 한 번 찾아보면서 추가하면 좋을만한? 설정 등을 가이드해줬다.
  1. hikaricp에서는 minimum-idle과 maximum pool size를 성능을 위해 동일하게 하는 것이 권장된다고 한다.(추가적인 커넥션 생성 비용 방지를 위해)
  2. keepalivetime 옵션(유휴 커넥션 강제 종료 시키지 않기 위해 hikaricp가 db로 헬스체크를 보내는 주기)을 추가해보면 좋겠다고
profile
lduk 웹 개발자(back)

0개의 댓글