Errors

[AWS/RDS] Too many connections 발생 시 Max_connections값 변경하기

yoonddo 2023. 8. 3. 15:46

같은 코드로 문제 없이 잘 돌아가던 프로젝트가 어느날 NullPointerException이 뜨길래  콘솔창을 확인해보니 Too many connections라는 문구가 떴다. 이리저리 서치하던 중 AWS RDS 파라미터그룹의 max_connections 기본값보다 특정이벤트 또는 사용자의 수가 증가하면 Too many connections 오류가 뜰 수 있다는걸 발견했다.

이 문제를 해결하기 위해 RDS 파라미터그룹 중 max_connections 파라미터 값을 수정해야 한다.


RDS Max_connections ?

Max_connection 파라미터는 허용되는 동시 클라이언트 연결 수 를 의미한다. 그래서 DB 인스턴스에 대해 허용되는 최대 연결 수는 DB 인스턴스 -> 인스턴스 수준 파라미터 그룹 -> max_connections 파라미터로 결정되는 것이다.

기본적으로 {DBInstanceClassMemory/12582880} 값으로 세팅되어 있으며, DB 인스턴스 클래스에 따라 기본값이 달라진다. 큰 이벤트를 앞두고 이 값을 늘려주는 경우가 많다.


Max_connections 기본 값

max_connection 값은 수동으로 값을 지정 할 순 있지만 보통 성능 이상의 요청이 발생하면 DB 자체의 문제가 생길 수 있으므로 aws에서는 각 인스턴스에 설정된 기본값을 사용 하고 여유있게 설정하는 것을 권장한다.

너무 많은 요청을 처리해야 하는 경우엔 Max_connection 값을 증가시키기 보단, 인스턴스 스펙을 조정(인스턴스 타입 변경)해서 기본 값으로 사용하는 것을 추천한다.

디폴트로 설정된 max_connections 값은 {DBInstanceClassMemory/12582880} 값으로 기본적으로 정의 되어 있는데
DBInstanceClassMemory 값은 DB 인스턴스에 사용할 수 있는 메모리 용량(바이트)을 나타내다보니 인스턴스 클래스에 영향을 받는다. 또한 Aurora MySQL과 RDS for MySQL DB 인스턴스의 메모리 오버헤드는 서로 다르기 때문에 max_connections 값은 다를 수 있다.

RDS 인스턴스 타입에 따른 기본 max_connections
t2.micro: 66
t2.small: 150
m3.medium: 296
t2.medium: 312
M3.large: 609
t2.large: 648
M4.large: 648
M3.xlarge: 1237
R3.large: 1258
M4.xlarge: 1320
M2.xlarge: 1412
M3.2xlarge: 2492
R3.xlarge: 2540
Aurora 인스턴스 타입에 따른 기본 max_connections
db.t2.small: 45
db.t2.medium: 90
db.r3.large: 1000
db.r3.xlarge: 2000
db.r3.2xlarge: 3000
db.r3.4xlarge: 4000
db.r3.8xlarge: 5000
db.r4.large: 1000
db.r4.xlarge: 2000
db.r4.2xlarge: 3000
db.r4.4xlarge: 4000
db.r4.8xlarge: 5000
db.r4.16xlarge: 6000

 


 

Max_connection 파라미터 변경 방법

Max_connection 값을 변경하기 위해서는 DB 인스턴스에 연결 된 파라미터 그룹을 수정해야 한다.

처음 RDS를 생성하면 기본 파라미터 그룹이 생성된다.

 

1. 기본 파라미터 그룹 확인

RDS가 생성되면, Mysql 엔진에 맞는 기본 파라미터 그룹이 자동으로 생성되어 적용된다.

기본 파라미터 그룹의 max_connections 값을 보면 {DBInstanceClassMemory/12582880} 으로 설정되어 있는 것을 확인할 수 있다.

 

그리고 db 인스턴스에 접속하여 max_connection 값을 확인하면, 앞서 말한 것 처럼 db.t2.micro 인스턴스의 기본값인 66으로 설정 되어 있는 것을 확인 가능하다.

나의 경우 putty에 접속해 mysql에서 max_connections 값을 확인해보니 60으로 설정되어 있는걸 확인할 수 있었다.

$ mysql -h database-1.cxujakzvpvip.ap-southeast-2.rds.amazonaws.com -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 42305
Server version: 5.7.38-log Source distribution

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show variables like 'max_connections';
 +-----------------+-------+
 | Variable_name   | Value |
 +-----------------+-------+
 | max_connections | 60    |
 +-----------------+-------+
 1 row in set (0.00 sec)
실제 db.t2.micro 인스턴스의 사양으로 계산을 해보면, 1024 x 1024 x 1024 / 12582880 = 85.3으로 최대 연결 수는 85로 설정되어야 하나, 66으로 표시된다. 이처럼 최대 DB 연결 수보다 적은 수가 표시될 수 있는데, 이는 잠재적인 메모리 부족 문제를 방지하기 위한 것이다.

2. 기본 파라미터 그룹 수정

기본 파라미터 그룹은 수정할 수 없으며 사용자 지정 파라미터 그룹을 생성하고 파라미터를 변경한 다음 새 파라미터 그룹을 사용하도록 인스턴스를 수정해야 한다.


3. 새로운 파라미터 그룹 생성

파라미터 그룹 수정이 되지 않으면 [RDS] -> [파라미터] 에서 새로운 파라미터 그룹을 생성하여 max_connection 값에 원하는 설정값을 넣어주면 된다. (파라미터 그룹 패밀리는 해당하는 db엔진으로 맞춰준다.)

나의 경우 RDS 설정 과정에서 새로운 파라미터 그룹을 생성하고 기본 파라미터 그룹을 삭제했기 때문에 값을 수정할 수 있었지만 수정이 되지 않는 사람은 새로운 파라미터 그룹을 생성한다.

 

생성이 완료되면 파라미터 편집을 클릭 후 max_connections를 검색해 값을 변경하고 저장한다.


4. 새로운 파라미터 그룹 적용

해당하는 RDS의 [수정]을 선택하여 방금 생성한 변경된 값이 있는 새로운 DB 파라미터 그룹으로 변경한다.

 

[계속]을 선택하고 즉시적용을 선택한 뒤 수정완료 해준다.


5. DB 인스턴스 재 시작

파라미터 그룹을 변경한 뒤 반드시 수동으로 DB인스턴스를 재시작해야 새로운 파라미터 그룹이 적용된다.

재시작 후 DB에 접속해 max_connections 값이 바뀌었는지 확인해보면

~$ mysql -h database-1.cxujakzvpvip.ap-southeast-2.rds.amazonaws.com -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 42305
Server version: 5.7.38-log Source distribution

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show variables like 'max_connections';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_connections | 500   |
+-----------------+-------+
1 row in set (0.00 sec)

설정한 500으로 변경된 것을 확인할 수 있고 Too many connections 오류도 사라진 것을 확인할 수 있었다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

참고 블로그 : https://velog.io/@rhgkssk1114/RDS-maxconnections-%ED%8C%8C%EB%9D%BC%EB%AF%B8%ED%84%B0-%EB%B3%80%EA%B2%BD-%EB%B0%A9%EB%B2%95

'Errors' 카테고리의 다른 글

[java] NoSuchMethodError  (0) 2023.07.27