홈/엔지니어/데이터베이스/PgBouncer 연결 풀링 — PostgreSQL…
데이터베이스중급UbuntuDebianCentOSpgbouncerpostgresql연결풀링

PgBouncer 연결 풀링 — PostgreSQL 성능 최적화

PgBouncer 설치·설정, 풀링 모드(session/transaction/statement) 선택, 사용자 인증, 모니터링 쿼리로 PostgreSQL 연결 수를 줄이고 성능을 높이는 방법을 설명합니다.

목차
  1. PgBouncer가 필요한 이유
  2. 설치
  3. 풀링 모드 선택
  4. pgbouncer.ini 설정
  5. 사용자 인증 설정
  6. 앱에서 PgBouncer 연결
  7. 모니터링
  8. 튜닝 가이드

PgBouncer가 필요한 이유

PostgreSQL은 연결당 약 5~10MB 메모리를 사용합니다. 수백 개의 앱 연결이 동시에 열리면:

  • 메모리 부족
  • 컨텍스트 스위칭 오버헤드
  • 연결 한도(max_connections) 초과

PgBouncer는 앱 ↔ DB 사이에서 연결을 재사용(풀링)합니다.


설치

Bash
# Ubuntu / Debian
sudo apt install -y pgbouncer

# 상태 확인
sudo systemctl status pgbouncer

풀링 모드 선택

모드설명권장 상황
session클라이언트 세션 동안 연결 유지SET 명령·임시 테이블 사용 시
transaction트랜잭션 동안만 연결 할당대부분의 웹 앱 (권장)
statement쿼리 하나에만 연결 할당트랜잭션 없는 단순 쿼리

pgbouncer.ini 설정

INI
# /etc/pgbouncer/pgbouncer.ini

[databases]
; 데이터베이스 별칭 = 연결 정보
myapp = host=127.0.0.1 port=5432 dbname=myapp
; 원격 서버 연결
myapp_prod = host=db.example.com port=5432 dbname=myapp

[pgbouncer]
listen_addr    = 127.0.0.1       ; 리슨 주소 (외부 노출 시 0.0.0.0)
listen_port    = 6432            ; PgBouncer 포트
auth_type      = md5             ; 인증 방식
auth_file      = /etc/pgbouncer/userlist.txt

pool_mode      = transaction     ; 풀링 모드
max_client_conn = 1000           ; 최대 클라이언트 연결 수
default_pool_size = 25           ; DB당 연결 풀 크기
min_pool_size   = 5
reserve_pool_size = 5

; 로그
logfile        = /var/log/postgresql/pgbouncer.log
pidfile        = /var/run/postgresql/pgbouncer.pid

; 타임아웃
server_idle_timeout = 600
client_idle_timeout = 0
query_timeout       = 0

; 관리자
admin_users    = postgres
stats_users    = monitor

사용자 인증 설정

Bash
# userlist.txt 형식: "사용자명" "패스워드 해시"

# PostgreSQL에서 해시 추출
sudo -u postgres psql -c "SELECT usename, passwd FROM pg_shadow WHERE usename = 'appuser';"

# /etc/pgbouncer/userlist.txt
echo '"appuser" "md5해시값"' | sudo tee /etc/pgbouncer/userlist.txt
echo '"postgres" "md5해시값"' | sudo tee -a /etc/pgbouncer/userlist.txt

# 권한 설정
sudo chmod 640 /etc/pgbouncer/userlist.txt
sudo chown postgres:postgres /etc/pgbouncer/userlist.txt

# 재시작
sudo systemctl restart pgbouncer

앱에서 PgBouncer 연결

CODE
# 기존 PostgreSQL 연결
postgresql://appuser:pass@localhost:5432/myapp

# PgBouncer 경유 연결 (포트만 변경)
postgresql://appuser:pass@localhost:6432/myapp

모니터링

Bash
# PgBouncer 관리 콘솔 접속
psql -h 127.0.0.1 -p 6432 -U postgres pgbouncer

# 풀 상태
SHOW POOLS;
# database | user | cl_active | cl_waiting | sv_active | sv_idle

# 통계
SHOW STATS;

# 클라이언트 목록
SHOW CLIENTS;

# 서버(DB) 연결 목록
SHOW SERVERS;

# 설정 재로드 (pgbouncer.ini 변경 후)
RELOAD;

# 연결 종료 없이 설정 갱신
RELOAD;

튜닝 가이드

INI
; 웹 앱 (100 동시 접속, DB max_connections=100)
pool_mode         = transaction
max_client_conn   = 500
default_pool_size = 20     ; PgBouncer → PostgreSQL 연결 수
min_pool_size     = 5
reserve_pool_size = 5

실제 PostgreSQL 연결 수 = default_pool_size × DB 수 클라이언트 수 = max_client_conn → 500개 앱 연결을 20개 DB 연결로 처리

#pgbouncer#postgresql#연결풀링#성능#postgres
편집 안내 · Editorial Note

AI 도구가 초안 작성에 사용될 수 있습니다. 명령어의 실행 여부와 검증 환경은 각 가이드에 기재된 근거를 확인하세요. 적용 전 사용 중인 버전의 공식 문서를 확인하고, 오류는 이메일로 알려주세요. 이메일로 제보

주제 관련 공식 문서(자동 연결 · 문장별 근거 아님)PostgreSQL 공식 문서 ↗web.dev Core Web Vitals ↗

질문 & 답변 (Q&A)

이 가이드에 대해 궁금한 점을 질문해보세요. 확인 후 답변드립니다.