MariaDB의 max connection 에 따른 애플리케이션 connection pool 설정 주의 사항

개발툴|2015. 7. 21. 19:58

최근에 겪은 경험을 작성해 본다.


MariaDB에는 3개의 데이터베이스가 생성되어 있다.

MariaDB

 - A database

 - B database

 - C database


위와 같은 DB환경에 총 6대의 웹 서버가 다음과 같은 형태로 connection pool을 생성한다.

MariaDB

 - A database

  > 1, 2번 서버에서 각각 10개의 connection pool 생성 

 - B database

  > 3, 4번 서버에서 각각 10개의 connection pool 생성 

 - C database

  > 5, 6번 서버에서 각각 10개의 connection pool 생성

 

각각의 웹 서버의 DB connection initialPoolSize가 10으로 되어 있는 상태에서 모든 웹 서버가 기동되었다.

웹 서버가 구동되고 서비스 되기 까지는 아무런 문제가 발생되지 않았다. 헌데 MariaDB client툴을 이용하여 DB서버에 접속하려고 하면 "Too many connections" 라는 오류 메세지가 노출된다.



왜? "Too many connections" 오류가 발생되었는지를 확인해 보니 MariaDB의 max connection수가 30으로 셋팅이 되어 있기 때문이라고 한다. (예를 들어 max connection수를 30으로 표기 한 것이지 default 값이 30은 아니다.)

한 가지 중요하게 알아야 할 점은 하나의 MariaDB에 생성되어 있는 모든 데이터베이스가 max connection을 공통적으로 사용하고 있다는 것이다.


위의 상황을 종합해보면 다음과 같은 결론이 나온다.

MariaDB의 max connection 수 = 30

A database 접속 connection 수 = 20

B database 접속 connection 수 = 20

C database 접속 connection 수 = 20


if (30 < 60) {

alert("Too many connections")

}


connection pool 설정이 max connection 수를 넘어섰기에 MariaDB로의 커넥션을 더이상 할 수 없었던 것이다.


원인을 알았기에 애플리케이션의 connection pool의 설정을 변경하든 MariaDB의 max connection 수를 조정하면 될 것이고, 난 다음과 같은 상황이 발생했을 때 어떻게 동작하는지가 궁금했다.


테스트 환경은 한 개의 DB에서 하나의 애플리케이션을 연결해서 테스트를 진행했다.


Q : max 30인 상태에서 웹 서버에서 생성하는 initialPoolSize를 50으로 하여도 정상적으로 서버가 구동이 될까?

A : 오류 없이 정상적으로 웹 서버 구동. connection pool은 30개만 생성되어 있음

-- 테스트에서는 한 대의 웹 서버이기에 문제가 없었을 것이지만 만약 여러 대의 웹 서버가 구동이 되었을 경우 다른 웹 서버가 30개의 커넥션을 이미 점유해 버리면 특정 웹 서버에서는 오류가 떨어질 것으로 예상된다.


Q : MariaDB의 max connection 30인 상태에서 웹 서버의 initialPoolSize를 50으로 한 후 서버를 띄우고 max를 40으로 늘리면?

A : 최초 웹 서버가 기동되면 30개의 pool 이 생성된다. 이런 상태에서 MariaDB의 max connection 사이즈를 40으로 늘리게 되면 웹 서버에서 생성하지 못한 20개의 pool이 있기에 바로 10개의 유휴 커넥션을 점유해 버린다.


Q : MariaDB의 max connection 30인 상태에서 웹 서버의 initialPoolSize를 30으로 한 후 서버를 띄우고 max를 10으로 줄이면?

A : 30개의 connection이 유지된다. 이미 생성되어 있는 커넥션은 강제로 종료하지 않는 것 같다.




테스트를 진행하면서 사용했던 명령어 목록




-- Maria DB max connection 수 확인

SHOW VARIABLES LIKE '%max_connection%'



-- Maria DB에 접속되어 있는 client 정보 리스트

SHOW PROCESSLIST;



-- Maria DB max connection 수 조절

SET GLOBAL max_connections = 30;




참고 URL



https://dev.mysql.com/doc/refman/5.5/en/too-many-connections.html

댓글()