플래닛스케일에서 제공해주는 db를 쓰다가 AWS RDS로 넘어간 후의 이야기다.
console.log를 막 찍어보던 도중 too many connections 라는 에러문이 떳다.
그리고 AWS RDS랑 DB 접속이 안된다.
원인은 로컬에서 유지된 서버의 커넥션이 너무 많아서 발생했다.
mysql에 연결된 클라이언트의 수가 너무 많아서 발생한 에러이다.
Error: Too many connections
code: 'ER_CON_COUNT_ERROR',
errno: 1040,
sqlState: '08004',
page: '/api/certificate'
이러한 에러들이 떴다.
그럼 어떻게 해결을 해야하나?
세 가지 방법을 사용했다.
AWS RDS 파라미터 그룹에 들어가서 파라미터 설정을 변경해주었다.
기본적으로 설정되어 있는 파라미터 값이 있다. default 그룹은 편집, 수정, 변경이 불가능하다.
이곳에 들어가보면
이런식으로 파라미터 구성을 확인할 수 있다.
그치만 파라미터 값을 변경하려면 새로운 그룹을 생성해야한다.
생성 버튼을 누르면 조금 기다린 뒤
이렇게 나오면 파라미터 그룹 패밀리에 현재 쓰고있는 DB와 버전을 확인한 후 맞는 것을 찾아 지정해 준 후
이름, 설명을 적어준다.
그럼 그룹 생성이 되고 생성된 그룹에 들어가준다. 우상단에 있는 편집버튼을 눌러 파라미터 편집창으로 들어가면
이런식으로 뜬다.
여기서 세가지 파라미터를 변경해 줄 것이다.
허용되는 동시 파라미터 접속 수 이다. 필요에 의해 이 값을 크게 늘리거나 줄이거나 할 수 있다.
디폴트 값은 {DBInstanceClassMemory/12582880}이런식으로 설정이 되어있을 것이다.
디폴트 값은 DB 인스턴스 수에 따라 달라진다. DBInstanceClassMemory 는 DB 인스턴스에 사용할 수 있는 메모리 용량(바이트)를 나타낸다. 즉 인스턴스 클래스에 영향을 받는다.
다음은 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
값을 85로 지정해보았다.
그럼 이렇게 바꿔주면 해결 되냐?
아니다.
최대 connection을 늘려준다고 해서 처리 가능한 메모리 용량이 느는 것이 아니기 때문에 연결만 허용한다고 해도 과부하가 걸려 처리가 불가능할 수 있다. 또, 늘렸지만 더 필요한 경우도 있기 때문에 매번 늘려주는것도 능사가 아니기 때문이다.
일정시간 요청이 없는 커넥션을 끊는다.
기본 설정으로는 interactive_timeout= 28800 로 되어있을 것이다. 28800은 초를 의미한다. 8시간 말고
3분으로 바꿔줬다.
변경사항 저장을 해 주고 나서 끝난 것이 아니다. 해당 데이터베이스에 들어가 수정을 진행해주어야한다.
DB 파라미터 그룹을 위의 3개의 파라미터를 변경한 그룹으로 변경해줘야 한다. 그 후
즉시적용을 눌러 해당 변경사항을 저장해주자.
그리고 꼭 DB의 재부팅이 필요하다.
파라미터 그룹을 변경한 후에는 반드시 수동으로 DB 인스턴스를 재시작해야지 새로운 파라미터 그룹이 적용되기 때문이다.
Too Many Connections의 에러가 해결될 것이다.