피드로 돌아가기
Scaling Postgres Connections With PgBouncer
Dev.toDev.to
Database

Postgres 연결 병목 해결, PgBouncer로 수천 개의 커넥션 제어

Scaling Postgres Connections With PgBouncer

Meg5282026년 4월 6일10intermediate

Context

Postgres의 process-per-connection 아키텍처로 인한 성능 저하 발생. 연결마다 전용 OS 프로세스가 생성되어 RAM 소비와 컨텍스트 스위칭 오버헤드 증가. 현대적 애플리케이션의 대규모 동시 연결 요구사항을 충족하기 어려운 구조.

Technical Solution

  • 애플리케이션과 Postgres 사이에서 PostgreSQL wire protocol을 처리하는 경량 미들웨어 PgBouncer 도입
  • 수천 개의 클라이언트 연결을 수십 개의 실제 서버 연결로 다중화하는 Connection Pooling 전략 적용
  • COMMIT 또는 ROLLBACK 시점에 연결을 즉시 반환하여 효율을 극대화하는 Transaction pooling 모드 채택
  • 서비스 성격에 따라 Local, Dedicated Primary, Dedicated Replica로 PgBouncer 배포 위치를 분리하여 고가용성 및 읽기 성능 최적화
  • 워크로드별 독립적인 PgBouncer 풀을 구성하여 특정 트래픽 스파이크가 전체 시스템으로 전이되는 장애 전파 차단
  • LISTEN, session-level SET 등 풀링과 호환되지 않는 기능은 최소한의 Direct Connection으로 처리하는 이원화 설계

Impact

  • 연결당 최소 5MB 이상의 RAM 소비 절감
  • query_wait_timeout 기본값 120초 설정을 통한 클라이언트 요청 큐잉 제어

Key Takeaway

리소스 비용이 높은 DB 연결을 추상화하여 인프라 비용을 낮추고 동시성 처리 능력을 확장하는 아키텍처적 분리 전략.


대부분의 앱 트래픽은 Transaction pooling을 기본으로 사용하고, 세션 상태 유지가 필수적인 관리 작업에만 Direct Connection을 할당할 것

원문 읽기