관리 메뉴

밤 늦게까지 여는 카페

PostgreSQL 에러 "too many connections ~" 대응 방법 본문

데이터베이스/PostgresQL

PostgreSQL 에러 "too many connections ~" 대응 방법

Jㅐ둥이 2022. 10. 14. 09:15

PostgreSQL을 사용하다 보면 종종 "too many connections ~" 에러를 접한 적이 있으신가요?

이 에러는 말 그대로 데이터베이스가 허용할 수 있는 최대치의 연결이 맺어져서 더 이상의 연결을 거절하는 것입니다.

그러면 어떤 상황에서 데이터베이스에 연결이 많이 맺어질까요?
제가 겪었던 상황은 크게 2가지였습니다.

  1. 서버에 데이터 조회 요청이 순간적으로 많이 몰릴 때
  2. 쿼리 실행 중 에러가 발생하여 연결이 Idle인채로 남아있을 때

각각의 상황을 살펴보도록 하겠습니다.

1. 서버에 데이터 조회 요청이 순간적으로 많이 몰릴 때

1. 데이터베이스의 스케일링
2. API 서버에서의 연결 수 제어
3. 캐시 레이어의 추가로 데이터베이스 부하 조절


이 문제를 해결할 수 있는 대표적인 방법으로는 데이터베이스의 스케일링이 있습니다.
수직, 수평 스케일링 둘다 가능합니다.
AWS RDS의 경우에는 메모리와 최대 연결 수가 비례하기 때문에 메모리가 큰 티어를 사용하는 것이 한가지 방법이 되겠습니다.

혹은 데이터 조회 요청을 받는 API 서버에서 연결 수를 제어하는 방법도 있을 수 있고, 캐시 레이어를 추가하는 것으로 데이터베이스의 부하를 줄이는 방법도 있을 수 있습니다.

2. 쿼리 실행 중 에러가 발생하여 연결이 Idle인채로 남아있을 때

근본적으로는 에러가 발생하는 잘못된 쿼리를 고쳐야 합니다. 하지만 이미 발생한 문제는 해결해야겠죠?

다음 쿼리를 통해서 지금 데이터베이스에서 실행 중인 쿼리들을 살펴볼 수 있습니다.

SELECT * FROM pg_stat_activity


그러면 다음과 같은 결과를 확인할 수 있습니다.

현재 데이터베이스에서 실행 중인 쿼리들의 상태

여기서 state 컬럼의 값이 Idle인 쿼리들을 다음 2가지 명령어로 종료시킬 수 있습니다.

SELECT pg_cancel_backend(pid); //SIGINT
SELECT pg_terminate_backend(pid); //SIGTERM

pg_cancel_backend의 경우 SIGINT를 보내고, pg_terminate_backend의 경우에는 SIGTERM을 보냅니다.
pg_terminate_backend를 사용하면 관련된 프로세스들이 전부 종료되기 때문에
급하지 않은 상황에는 pg_cancel_backend의 사용을 권장드립니다.


도움이 되셨을까요? PostgreSQL을 사용하면서 접할 수 있는 다른 문제들도 내용을 정맇

반응형