반응형
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" 메시지를 줄이고, 안정적인 데이터베이스 운영이 가능합니다!
반응형