TL;DR
- 안정적인 운영을 위해 대부분의 DBMS는 최대 커넥션 수를 제한합니다.
- 한 Application은 하나의 커넥션만 사용하는 것이 아닙니다.
- 서버의 스펙을 조정하거나
max_connection
환경 변수를 적당히 조정하면 오류를 해결할 수 있습니다.
Connection은 유한하다.
MariaDB는 안정적인 운영을 위해 최대 커넥션 수를 제한합니다.
만약 이 접속 수를 초과하여 접속을 시도한다면 아래와 같이 Error: 1040-08004: Too many connections
오류를 반환합니다.
최대 커넥션 수는 MariaDB의 max_connection
환경 변수로 지정할 수 있습니다.
기본값은 인스턴스의 메모리를 특정 값으로 나눈 정수와 12000 중 더 낮은 수를 사용합니다.
db.t3.micro
에 경우 1GB이기 때문에 약 40여개의 커넥션이 최대입니다.
이 공식에 따르면 만약 더 큰 인스턴스 유형으로 변경하여 메모리가 늘어난다면 자연스럽게 최대 커넥션 제한도 늘어납니다.
그런데 우린 그렇게 운영할 자금이 없습니다.
난 40개의 Application을 운영하지 않는데?
이런 의문을 품는 분도 있을 수 있습니다.
"40개의 Application을 운영하지 않음에도 왜 커넥션 제한을 초과하였을까."
이는 커넥션풀을 이해한다면 빠르게 이해할 수 있습니다.
먼저 application.yml
파일에 아래와 같이 로깅 설정을 추가해서 실행해봅니다.
.
.
.
logging:
level:
com.zaxxer.hikari.HikariConfig: DEBUG
com.zaxxer.hikari: TRACE
.
.
.
이후 서버를 실행해보면 아래와 같이 maximumPoolSize
과 minimumIdle
설정을 확인할 수 있습니다.
각각의 의미와 기본값은 다음과 같습니다.
maximumPoolSize
: 커넥션풀에서 운영할 최대 커넥션수. 기본값은 10.minimumIdle
: Application이 바쁘지 않을 때 운영할 최소 커넥션 수. 기본값은maximumPoolSize
를 따른다.
커넥션풀은 미리 DB와 연결을 맺어두고, 필요할 때 해당 커넥션을 사용하도록 관리하는 일종의 연결 캐시입니다.
수강신청이나 티켓팅을 할 때 여러 장치에서 미리 로그인 해 두고 시간이 되면 신청하는걸 생각해 보면 이해가 쉬울 수 있습니다. (완전히 맞는 비유는 아닙니다.)
아무튼, 기본값으로 Spring Application을 실행한다면 기본적으로 10개의 커넥션이 사용됩니다.
즉, 5번째 Application이 실행될 때에는 남은 커넥션이 없어서 DB와 연결할 수 없게 되죠.
설정을 변경하자.
가용성과 관련된 설정은 가급적 보수적으로 안전하게 운영하는 것이 좋습니다.
하지만 여러가지 판단을 한 끝에 설정을 변경해도 된다고 생각된다면, 간단하게 변경할 수 있습니다.
이 글에서는 AWS를 기준으로 기록합니다.
먼저 RDS의 파라미터 그룹으로 이동하고, 파라미터 그룹 생성
버튼을 클릭합니다.
알맞는 값을 입력하고 생성
버튼을 클릭합니다.
표시된 파라미터 그룹 목록에서 방금 생성한 파라미터 그룹을 선택합니다.
우측 상단의 편집 버튼을 클릭합니다.
검색란에 max_connections
를 입력하면 아래에 검색된 파라미터가 표시됩니다.
원하는 값을 입력하고, 변경 사항 저장
버튼을 클릭합니다.
잠시 후 설정이 저장된 것을 확인할 수 있습니다.
설정을 적용하자.
방금 생성한 파라미터를 MariaDB에 실제로 적용하여야 합니다.
파라미터 그룹을 변경한 후 반드시 인스턴스를 재시작 해주어야 새로운 파라미터 그룹이 적용됩니다.
RDS의 데이터베이스로 이동하고, 파라미터를 적용할 DB를 선택합니다.
우측 상단의 수정 버튼을 클릭합니다.
하단으로 이동하여, DB 파라미터 그룹을 변경하고 저장합니다.
잠시 후 변경 사항이 저장되면 반드시 재부팅을 수행합니다.
재부팅 중 DB에 연결할 수 없기 때문에 서비스 다운타임이 발생한다는 점에 유의해야 합니다.
결론
MariaDB를 비롯하여 많은 DBMS는 안정적인 운영을 위해 최대 커넥션 제한을 두고 있습니다.
서비스 운영 상황 등을 판단하여 변경이 필요하다면 간단하게 커넥션 제한을 변경할 수 있습니다.
참고 문서
- [AWS] RDS "Too many connections" - 오늘의 기록 (https://gksdudrb922.tistory.com/227)
- HikariCP 옵션값 확인하기 - /var/log/dongdorrong (https://velog.io/@dongdorrong/HikariCP-옵션의-기본값-확인하기)
- Spring - hikariCP 옵션 정리 및 권장 설정 - Backtony Dev (https://backtony.tistory.com/58)