[Error] Too many connections

danbi lee·2024년 12월 12일

문제

요구사항에 맞춰 데이터를 넣어줘야 하는 작업이 있었는데 insert 도중 too many connections 를 만났다.

시스템 구성

datasource의 구조는 master - slave로 각각 maximum-pool-size가 70으로 설정되어 있었다. 따라서 애플리케이션 인스턴스에서 총 140개(70*70)의 연결을 유지할 수 있었다.

일반적인 운영 환경에서는:
1. 로드밸런서가 들어오는 트래픽을 여러 애플리케이션 인스턴스로 분배한다.
2. 각 인스턴스는 독립적으로 실행되며, 자신만의 DB connection pool을 관리한다.
3. 각 인스턴스는 설정된 maximun-pool-size만큼의 DB 연결을 유지할 수 있다.

전체 DB 연결 수를 계산할 때 인스턴스 수 * (master pool size + slave pool size)를 고려해야 한다.

애플리케이션 인스턴스?
실제로 실행되고 있는 애플리케이션 프로그램의 실행 단위.
트래픽이 많으면 애플리케이션을 여러 개 실행해 부하를 분산시킨다. 이때 각각 실행되는 애플리케이션 프로그램을 '인스턴스'라고 한다.

원인

Pod가 1개에서 2개로 증설되었다.
애플리케이션 인스턴스가 2배로 늘어났다는 의미로 더 많은 사용자 요청을 처리할 수 있게 된다.

사용자 요청을 많이 처리하면 좋은거 아닌가? 싶었는데 애플리케이션이 2개 실행되는 상황은 같은 insert 쿼리가 1과 2 양쪽에서 실행 될 수 있게 된다는 것이다. 즉 전체 시스템에서는 최대 280개(140*2)의 DB 연결이 발생할 수 있는건데 DB의 max_connections가 151이면 Too many connections 오류가 발생하게 된다.

[Pod 1]
- Master DB 연결: 최대 70개
- Slave DB 연결: 최대 70개
=> 총 140개 연결 가능

[Pod 2]
- Master DB 연결: 최대 70개
- Slave DB 연결: 최대 70개
=> 총 140개 연결 가능

Pod?
쿠버네티스에서 사용되는 가장 기본적인 배포 단위

  • 하나 이상의 컨테이너를 포함하는 그룹이다.
  • 보통 하나의 Pod는 하나의 애플리케이션 인스턴스를 실행한다.

해결 방법

급하게 문제를 해결하기 위해 관리자 권한을 가진 계정으로 최대 커넥션 수를 변경했던거 같다. 그리고 maximum-pool-size를 70 -> 20으로 변경했다.

Connection Pool 크기 최적화

각 Poddml maximum-pool-size를 적절히 조정해야 한다. pool 크기는 인스턴스 수 * (master pool size + slave pool size) 로 잡는다.

최대 커넥션 수 변경

max_connection값은 Pod 수 × (Master pool size + Slave pool size) < max_connections 조건을 확인해야 한다. 살짝 여유있게 잡는게 좋다.

set global max_connections = [적절한 값];

기타 확인

동시에 허용되는 최대 커넥션 수

현재 연결 가능한 최대 커넥션 수를 확인한다. 보통 아무런 설정을 하지 않으면 151이 기본값이다.

show variables like 'max_connections';
Variable_nameValueDescription
max_connect_errors100지정된 횟수 이상 연결 실패 시 해당 IP 차단
max_connections1000MySQL 서버에서 허용하는 최대 동시 연결 수

DB 운영중 최대 사용 커넥션 수

DB 운영중 최대 사용 커넥션 수를 확인한다. 지난 오류때 최대 사용 커넥션 수가 613개로 초과 발생을 확인할 수 있다.

show status like '%used_connection%';
Variable_nameValue
Max_used_connections613
Max_used_connections_time2024-12-12 00:00:00

비정상적으로 종료된 연결 수

초과된 커넥션으로 인해 클라이언트 차단이 240회, 커넥션 차단은 80938회 발생한 것을 알 수 있다... 😨

show status like 'Aborted%';
Variable_nameValue
Aborted_clients240
Aborted_connects80938

MySQL Max Connection 설정
Pod란?
[MySQL] Too many connections 에러 - Connection 수 확인

profile
계속해서 보완중

0개의 댓글