[AWS] - RDS Too many Connection 오류 해결
RDS를 운영하다 보면 다음과 같은 오류 메시지와 함께 데이터베이스 연결이 끊기는 상황이 발생할 수 있습니다.
"Too many connections"
이는 데이터베이스에 허용된 최대 동시 연결 수(max_connections)를 초과했을 때 나타나는 오류입니다.
- 커넥션 풀의 연결 수가 부족한 경우
- 이미 종료된 커넥션이 정리되지 않고 남아 있는 경우
- 사용되지 않는 커넥션이 과도하게 오래 유지되고 있는 경우
이와 같은 상황에서는 연결 요청이 정상적으로 처리되지 못해, RDS 접속 자체가 실패할 수 있습니다.
그래서 오늘은 이 오류에 대한 원인 분석과 해결 방법을 정리해보려고 합니다.
가장 근본적인 해결책은 RDS에 적용된 파라미터 그룹(Parameter Group)을 새롭게 생성하고,
max_connections 값을 늘려 설정한 뒤 해당 그룹을 데이터베이스 인스턴스에 적용하는 것입니다.
AWS RDS에서는 아무런 설정을 변경하지 않을 경우, 아래와 같이 기본 파라미터 그룹(default.mysql8.0 등)이 자동으로 적용됩니다. 이 기본 그룹은 수정이 불가능하므로, 새 파라미터 그룹을 생성해 직접 max_connections 값을 조정해야 합니다. 파라미터 그룹 적용 후에는 인스턴스를 재시작해야 설정이 반영됩니다.
이 DB 파라미터 그룹에서 max_connections 값을 확인해 보면 다음과 같이 설정되어 있는 것을 알 수 있습니다:
조금 더 자세히 설명하자면, 현재 사용 중인 데이터베이스 인스턴스 클래스는 db.t4g.micro입니다. 이 인스턴스는 1,073,741,824 바이트(1 GB)의 메모리를 가지고 있으며, 이를 계산식에 적용해 보면
즉, 이 설정 기준으로 최대 연결 수(max_connections)는 약 85개로 지정되어 있다는 의미입니다.
그런데 이상한 점이 있습니다.
현재 데이터베이스에 약 42개의 연결만 활성화되어 있음에도 불구하고, 새로운 연결 시도에서 아래와 같은 오류가 발생합니다.
Too many connections
아직 여유가 40개 가까이 있는 것 같은데 왜 오류가 발생했을까?
원인을 더 자세히 살펴본 결과, application.yml 파일에서 maximum-pool-size가 50으로 설정되어 있었습니다.
원인 정리
즉, 애플리케이션에서 한 인스턴스당 최대 50개의 커넥션을 DB에 유지하려고 시도한 것이고,
다른 연결들과 합쳐지면서 RDS 인스턴스가 허용하는 최대 연결 수(85개)를 초과하게 된 것입니다.
# MySQL
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
username: ${MYSQL_USERNAME}
password: ${MYSQL_PASSWORD}
url: ${MYSQL_URL}
hikari:
maximum-pool-size: 50
이 오류를 해결하려면, 파라미터 그룹을 새로 생성한 뒤, max_connections와 wait_timeout 값을 변경해주면 됩니다.
단, 여기서 중요한 포인트가 있습니다.
파라미터 그룹 생성 시 반드시 인스턴스에 설정된 엔진과 정확히 일치하는 엔진 타입과 버전을 선택해야 합니다.
그렇지 않으면, 생성한 파라미터 그룹이 데이터베이스 인스턴스의 선택 항목에 표시되지 않기 때문에 적용할 수 없습니다.
생성이 완료되었다면, 생성된 파라미터 그룹을 클릭한 후에 max_connection과, wait_timeout을 검색하여 값을 바꿔줍니다.
그 다음은 데이터베이스 => 수정을 클릭한 후에 파라미터 그룹을 변경해줍니다.
max_connections, wait_timeout과 같은 일부 파라미터는 인스턴스 재시작 시에만 적용됩니다.
재시작하지 않으면 변경값이 반영되지 않으니 반드시 확인하세요!
설정을 마치고, 인스턴스를 재시작한 뒤 다시 애플리케이션에서 연결을 시도해 보면?
이제 오류 없이 정상적으로 연결이 이루어지는 것을 확인할 수 있습니다!