AWS Aurora RDS(MySQL) 환경에서 HikariCP의 keepaliveTime이 필요 없는 이유

AWS Aurora RDS(MySQL 호환) 환경에서 HikariCP의 keepaliveTime 설정을 사용하지 않는 것이 더 좋다는 점에 대해 설명드립니다. Aurora는 일반적인 MySQL과는 다르게 커넥션을 관리하는 방식이 다르며, 이를 고려하여 커넥션 풀링 전략을 최적화하는 것이 중요합니다.


1. Aurora MySQL의 커넥션 관리 특성

Aurora MySQL은 MySQL과 호환되지만 내부적으로 분산 스토리지 아키텍처를 사용하고, 자동 장애 조치(Failover) 및 Auto Scaling 기능을 제공합니다. 이로 인해 다음과 같은 특징이 있습니다.

  • Failover 발생 시 기존 커넥션이 끊어질 수 있음
    Aurora는 장애가 발생하면 자동으로 새로운 Primary 노드를 설정하지만, 이 과정에서 기존 커넥션이 끊어집니다.
  • Auto Scaling이 활성화된 경우 연결 노드가 동적으로 변경됨
    Aurora는 부하에 따라 리더 노드(Replica)를 추가하거나 제거할 수 있으며, 연결을 유지하려는 시도가 오히려 비효율적일 수 있습니다.
  • Aurora Proxy 사용 시 커넥션 관리가 자동화됨
    Aurora는 Aurora Proxy를 통해 커넥션 풀링을 자체적으로 관리할 수 있습니다. 이 경우 클라이언트 측의 KeepAlive 설정이 불필요하게 됩니다.

2. HikariCP의 keepaliveTime이란?

HikariCP의 keepaliveTime 설정은 idle 상태의 커넥션이 MySQL과의 연결이 유지되고 있는지 주기적으로 확인하는 기능입니다.

  • 주어진 시간이 지나면 HikariCP가 백그라운드에서 Ping을 실행하여 연결이 끊어졌는지 확인합니다.
  • MySQL의 wait_timeout(서버에서 비활성 상태의 커넥션을 자동 종료하는 시간)보다 짧게 설정하면 HikariCP가 지속적으로 Ping을 보내면서 커넥션을 유지하려고 함.

하지만, Aurora 환경에서는 이러한 KeepAlive 요청이 불필요한 네트워크 트래픽을 발생시키고, 오히려 효율성을 떨어뜨릴 수 있습니다.


3. Aurora MySQL에서 keepaliveTime을 사용하면 문제가 되는 이유

Failover 발생 시 KeepAlive가 무의미함

  • Aurora에서 Failover가 발생하면 새로운 Primary 인스턴스로 자동 전환되며 기존 커넥션은 모두 끊어짐.
  • 이때 keepaliveTime이 설정되어 있더라도, 기존 커넥션은 복구되지 않음.

Aurora Proxy와 충돌 가능성

  • Aurora Proxy를 사용할 경우, Aurora가 커넥션을 자체적으로 유지 및 관리합니다.
  • HikariCP에서 KeepAlive Ping을 보내는 것이 불필요한 부하를 유발할 수 있음.

MySQL의 wait_timeout 값과 중복된 동작

  • Aurora의 wait_timeout 설정이 적절하면 서버 측에서 커넥션을 정리할 시간이 충분하기 때문에 KeepAlive를 따로 설정할 필요 없음.

4. Aurora 환경에서 최적화된 HikariCP 설정

Aurora 환경에서는 keepaliveTime을 설정하지 않는 대신, 아래 설정을 고려하는 것이 더 효과적입니다.

✅ 1) minimumIdle 값 조정

hikari.minimumIdle=10
  • minimumIdle 값을 너무 낮게 설정하면 Aurora의 Auto Scaling에 따라 커넥션이 자주 닫힐 수 있음.
  • 적절한 minimumIdle 값을 설정하여 커넥션이 너무 자주 생성/해제되지 않도록 조정.

✅ 2) idleTimeout 조정

properties복사편집hikari.idleTimeout=300000  # 5분
  • idleTimeoutAurora의 wait_timeout보다 짧게 설정하면, MySQL이 연결을 강제로 종료하기 전에 HikariCP가 먼저 커넥션을 정리함.
  • MySQL에서 wait_timeout이 10분이라면, idleTimeout을 5~7분 정도로 설정하는 것이 좋음.

✅ 3) validationQuery 설정

hikari.connectionTestQuery=SELECT 1
  • 커넥션을 사용할 때마다 SELECT 1을 실행하여 유효한 연결인지 확인.
  • Aurora가 커넥션을 자동으로 종료했을 경우, 빠르게 재연결이 가능하도록 함.

✅ 4) exceptionOverrideClass 활용

hikari.exceptionOverrideClass=com.example.AuroraFailoverHandler
  • Aurora 장애(Failover) 시 HikariCP가 빠르게 새로운 커넥션을 맺을 수 있도록 예외를 감지하여 재연결을 수행하는 로직을 추가.
  • 커스텀 핸들러를 구현하여 특정 예외가 발생했을 때, 자동으로 새로운 연결을 시도할 수 있음.

5. 결론

  • Aurora 환경에서는 keepaliveTime을 설정하지 않는 것이 더 적절함.
  • Aurora는 Failover, Auto Scaling, Proxy 등을 통해 자체적으로 커넥션을 관리하기 때문에, KeepAlive Ping을 주기적으로 보내는 것은 불필요한 리소스 낭비가 될 수 있음.
  • 대신, idleTimeout, minimumIdle, validationQuery, exceptionOverrideClass 등을 적절히 설정하는 것이 더 효과적인 접근 방법임.

Aurora의 특성을 이해하고 적절한 설정을 적용하면 보다 안정적인 HikariCP 커넥션 풀링 환경을 구성할 수 있습니다. 🚀

관련 글

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다