피드로 돌아가기
Dev.toDatabase
원문 읽기
PgBouncer가 트랜잭션 모드로 동작 시 300개 애플리케이션 연결을 20개 실제 PostgreSQL 연결로 압축하여 max_connections 제한 문제를 해결한다
PostgreSQL Connection Pooling with PgBouncer: A Complete Guide
AI 요약
Context
PostgreSQL은 클라이언트 연결마다 전용 OS 프로세스를 포크한다. 연결 1개당 5~10MB 메모리를 점유하며 1,000개 연결 환경에서는 max_connections 기본값 100을 쉽게 초과한다. 연결만으로 전체 RAM이 고갈되는 상황도 발생한다.
Technical Solution
- [애플리케이션] → [PgBouncer 포트 6432로 연결]하여 실제 PostgreSQL 연결을 프록시한다
- [pgbouncer.ini] → [pool_mode 설정]으로 세션/트랜잭션/문장 단위 연결 관리 방식을 선택한다
- [pgbouncer.ini] → [default_pool_size 설정]으로 실제 PostgreSQL 연결 개수를 제한한다
- [psycopg2] → [prepare_threshold=None 옵션]으로 트랜잭션 모드 호환성을 확보한다
- [reserve_pool_size] → [5 설정]으로 급격한 연결 증가에 대비한다
Impact
300개 애플리케이션 스레드가 20개 실제 PostgreSQL 연결로 서비스된다
Key Takeaway
무상태 웹 애플리케이션은 transaction 모드를 기본값으로 사용하며, prepared statements나 LISTEN/NOTIFY가 필요한 경우에만 session 모드를 선택한다
실천 포인트
Django/Prisma 기반 무상태 API 환경에서 PgBouncer를 transaction 모드로 구성 시 default_pool_size를 20~30으로 설정하여 연결 수를 획기적으로 줄이면서도 애플리케이션 코드는 변경하지 않는다