#Backend

Aurora MySQL의 숨겨진 idle close 동작 — HikariCP "Failed to validate connection" 추적기

Aurora MySQL의 숨겨진 idle close 동작 — HikariCP "Failed to validate connection" 추적기
01

Summary

왜 30초마다 핑을 날리는데 연결이 끊길까? Aurora MySQL의 기괴한 타임아웃 비밀

표준 MySQL만 믿다가는 당한다, HikariCP 커넥션 오류 뒤에 숨겨진 Aurora의 비표준 동작 완벽 분석

HikariCP의 keepalive 옵션이 무색하게 커넥션이 끊기는 현상을 추적하며 발견한 Aurora MySQL의 독특한 동작 방식을 다룹니다. 커뮤니티 MySQL과 달리 Aurora가 왜 두 가지 타임아웃 값을 모두 참조하는지 아키텍처 관점에서 설명하고, 실무에서 바로 적용 가능한 DB 파라미터 최적화 가이드를 제공합니다.

  • 01표준 MySQL과 달리 Aurora는 wait_timeout과 interactive_timeout 중 작은 값을 최종 타임아웃으로 선택함
  • 02Aurora의 thread-pool 아키텍처와 별도 모니터링 스레드가 idle 커넥션을 관리하는 내부 메커니즘 분석
  • 03JDBC의 interactiveClient 옵션이 false임에도 interactive_timeout이 영향을 주는 이유 규명
  • 04AWS 공식 문서에서도 확인하기 어려운 60초 주기 모니터 스레드의 실체 확인
  • 05커넥션 풀 유지 실패 문제를 해결하기 위한 DB 파라미터 그룹 설정 모범 사례 제시

RECOMMENDATION

Aurora MySQL을 사용하면서 HikariCP의 커넥션 검증 실패 로그가 뜬다면, 클라이언트 설정보다 먼저 DB 파라미터 그룹의 두 타임아웃 값이 동일한지 확인하십시오.

The Problem

HikariCP의 keepaliveTime이 30초로 설정되어 있음에도 불구하고, 서버 측에서 연결이 먼저 끊겨 'Failed to validate connection' 경고 로그가 분당 다수 발생하는 현상이 나타났습니다.

The Solution

표준 MySQL 동작 모델과 다른 Aurora MySQL의 내부 메커니즘을 분석하여, DB 파라미터 그룹의 interactive_timeout이 non-interactive 연결에도 영향을 준다는 사실을 확인하고 두 타임아웃 값을 동일하게 상향 조정했습니다.

The Result

DB 파라미터 수정 후 즉시 경고 로그가 중단되었으며, Aurora의 thread-pool 및 모니터 스레드 기반 idle 세션 관리 방식을 규명하여 향후 유사 문제에 대한 진단 가이드를 마련했습니다.

Trade-off

Aurora의 idle 종료 판정은 별도의 모니터 스레드가 약 60초 주기로 수행하므로, 설정한 타임아웃 값과 실제 종료 시점 사이에 수십 초의 오차가 발생할 수 있는 불확실성이 존재합니다.

03

Key Concepts

Concept · 01

Aurora Dual Timeout Evaluation

Aurora MySQL이 클라이언트의 interactive 여부와 상관없이 wait_timeout과 interactive_timeout 중 최솟값을 idle 종료 기준으로 사용하는 비표준 동작입니다.

  • JDBC 연결은 기본적으로 non-interactive로 분류되지만 Aurora에서는 두 설정값을 모두 평가합니다.
  • 작게 설정된 interactive_timeout이 의도치 않게 커넥션을 조기 종료시키는 원인이 됩니다.
Concept · 02

Thread-pool Multiplexing

Aurora MySQL이 제한된 워커 스레드로 다수의 사용자 커넥션을 처리하기 위해 사용하는 아키텍처로, 커넥션과 스레드가 1:1로 고정되지 않습니다.

  • 표준 MySQL의 네트워크 read-block 기반 타임아웃 메커니즘을 적용할 수 없는 구조적 원인입니다.
  • 스레드 효율성을 높이기 위해 커넥션이 idle 상태가 되면 워커 스레드는 다른 작업을 수행합니다.
Concept · 03

Monitor Thread

Aurora에서 idle 상태의 커넥션을 감시하고 강제로 종료시키기 위해 백그라운드에서 주기적으로 구동되는 전용 스레드입니다.

  • 약 60초의 주기로 동작하며 설정된 타임아웃을 초과한 세션을 일괄 정리합니다.
  • 이 주기로 인해 타임아웃 발생 시점이 설정값보다 늦어지는 등 불규칙한 패턴을 보일 수 있습니다.