카테고리 없음

RDS에서 "Aborted Connection" 메시지가 발생하는 이유와 해결 방법

idea9329 2025. 2. 18. 12:56
반응형

Amazon RDS(MySQL, MariaDB, Aurora 등)를 사용할 때 "Aborted connection" 메시지가 발생하는 주요 원인은 클라이언트와 데이터베이스 간의 연결이 비정상적으로 종료되었기 때문입니다. 이 문제는 네트워크, 타임아웃 설정, 애플리케이션 코드 문제 등 다양한 원인으로 발생할 수 있습니다.


1. "Aborted Connection" 주요 원인

✅ 1) 클라이언트가 연결을 닫지 않고 종료됨

  • 애플리케이션이 RDS에 연결한 후 정상적으로 close()를 호출하지 않고 종료될 경우 발생
  • 네트워크 문제로 인해 클라이언트가 강제 종료되었을 경우

🔍 해결 방법

  • 애플리케이션에서 데이터베이스 연결을 닫을 때 connection.close()를 명확히 호출
  • 연결을 재사용하는 커넥션 풀을 사용하고, 설정값을 조정하여 유휴 연결을 적절히 닫도록 구성

✅ 2) 타임아웃 설정으로 인해 연결이 자동 종료됨

  • MySQL/MariaDB의 wait_timeout  interactive_timeout 값이 너무 짧을 경우 발생
  • 클라이언트가 일정 시간 동안 쿼리를 보내지 않으면 RDS가 해당 연결을 강제로 종료

🔍 해결 방법

  • 현재 설정값 확인:
    SHOW VARIABLES LIKE 'wait_timeout';
    SHOW VARIABLES LIKE 'interactive_timeout';
  • 값을 늘려서 연결이 너무 빨리 끊기지 않도록 조정:
    SET GLOBAL wait_timeout = 28800;  -- 8시간 유지
    SET GLOBAL interactive_timeout = 28800;
  • MySQL 설정 (my.cnf) 변경 후 RDS 재시작:
    [mysqld]
    wait_timeout = 28800
    interactive_timeout = 28800

✅ 3) 네트워크 문제로 인한 연결 끊김

  • 클라이언트와 RDS 간 네트워크 연결이 불안정하거나, 로드 밸런서, 방화벽, NAT 게이트웨이 등의 영향으로 연결이 끊길 수 있음
  • AWS 내부 네트워크 문제, 인터넷 연결 불안정, VPN 문제 등도 원인이 될 수 있음

🔍 해결 방법

  • 애플리케이션과 RDS 간의 네트워크 상태 확인 (ping, telnet, nc 명령어 사용)
    ping <rds-endpoint>
    nc -zv <rds-endpoint> 3306
  • AWS VPC 보안 그룹 및 NACL 설정 확인
    • RDS 보안 그룹에서 클라이언트 IP가 허용되는지 확인
    • NACL이 RDS로의 트래픽을 차단하지 않는지 확인

✅ 4) 커넥션 풀(Connection Pool) 설정 오류

  • JDBC, HikariCP, C3P0 등의 커넥션 풀을 사용할 때, 설정값이 적절하지 않으면 "Aborted Connection" 오류 발생 가능
  • 커넥션 풀에 오래된 연결이 유지되다가 MySQL이 wait_timeout으로 종료할 경우 발생

🔍 해결 방법

  • 커넥션 풀에서 유휴 연결을 적절히 닫도록 설정
  • HikariCP 예제 (application.properties):
    spring.datasource.hikari.minimum-idle=5
    spring.datasource.hikari.maximum-pool-size=20
    spring.datasource.hikari.idle-timeout=30000  # 30초 후 유휴 연결 종료
    spring.datasource.hikari.max-lifetime=600000 # 10분 후 연결 갱신
    spring.datasource.hikari.keepalive-time=300000 # 5분마다 Keep-Alive 요청
  • MySQL JDBC URL에 autoReconnect=true  tcpKeepAlive=true 추가:
    jdbc:mysql://<rds-endpoint>:3306/mydb?autoReconnect=true&tcpKeepAlive=true

✅ 5) RDS에서 Max Connections 제한 초과

  • MySQL/MariaDB RDS는 max_connections 값 이상으로 동시 연결을 허용하지 않음
  • 너무 많은 클라이언트가 동시에 연결을 시도하면 일부 연결이 강제 종료되며 "Aborted connection" 발생

🔍 해결 방법

  • 현재 최대 연결 개수 확인:
    SHOW VARIABLES LIKE 'max_connections';
    SHOW GLOBAL STATUS LIKE 'Threads_connected';
  • 애플리케이션에서 불필요한 연결을 최소화하고 Connection Pool을 적절히 사용
  • 필요하면 max_connections 값을 증가:
    SET GLOBAL max_connections = 1000;
    • RDS에서는 Parameter Group에서 max_connections 값을 조정해야 적용됨

✅ 6) Query Execution 중단 또는 Kill 명령어 사용

  • 쿼리 실행 중 KILL <thread_id> 명령어를 실행하거나, long-running 쿼리가 강제 종료될 경우 발생

🔍 해결 방법

  • 현재 실행 중인 쿼리 확인:
    SHOW PROCESSLIST;
  • 특정 쿼리를 종료한 경우 Aborted connection 메시지가 발생할 수 있음

2. RDS "Aborted Connection" 해결을 위한 Best Practice

 애플리케이션에서 명확하게 connection.close() 호출
 wait_timeout  interactive_timeout 값을 늘려 비정상 종료 방지
 네트워크 상태 점검 (VPC 보안 그룹, NAT, 방화벽 설정 확인)
 커넥션 풀을 적절히 설정하여 유휴 연결을 줄이고, 너무 많은 동시 연결 방지
 RDS max_connections 값을 애플리케이션 트래픽에 맞게 조정
 장시간 실행되는 쿼리를 최적화하여 강제 종료되지 않도록 설정

🚀 이러한 조치를 적용하면 RDS에서 "Aborted Connection" 메시지를 줄이고, 안정적인 데이터베이스 운영이 가능합니다!

반응형