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

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

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

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 도구를 활용해 초안을 구성하고 사람이 명령어·문맥을 검토해 발행했습니다. 운영체제와 도구 버전에 따라 결과가 달라질 수 있으므로 적용 전 공식 문서를 함께 확인하세요. 오류를 발견하시면 이메일로 제보해 주세요.

질문 & 답변 (Q&A)

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