피드로 돌아가기
Dev.toDatabase
원문 읽기
Postgres 연결 병목 해결, PgBouncer로 수천 개의 커넥션 제어
Scaling Postgres Connections With PgBouncer
AI 요약
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을 할당할 것