PgBouncer가 필요한 이유
PostgreSQL은 연결당 약 5~10MB 메모리를 사용합니다. 수백 개의 앱 연결이 동시에 열리면:
- 메모리 부족
- 컨텍스트 스위칭 오버헤드
- 연결 한도(max_connections) 초과
PgBouncer는 앱 ↔ DB 사이에서 연결을 재사용(풀링)합니다.
설치
# Ubuntu / Debian
sudo apt install -y pgbouncer
# 상태 확인
sudo systemctl status pgbouncer풀링 모드 선택
| 모드 | 설명 | 권장 상황 |
|---|---|---|
| session | 클라이언트 세션 동안 연결 유지 | SET 명령·임시 테이블 사용 시 |
| transaction | 트랜잭션 동안만 연결 할당 | 대부분의 웹 앱 (권장) |
| statement | 쿼리 하나에만 연결 할당 | 트랜잭션 없는 단순 쿼리 |
pgbouncer.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사용자 인증 설정
# 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 연결
# 기존 PostgreSQL 연결
postgresql://appuser:pass@localhost:5432/myapp
# PgBouncer 경유 연결 (포트만 변경)
postgresql://appuser:pass@localhost:6432/myapp모니터링
# 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;튜닝 가이드
; 웹 앱 (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 연결로 처리
이 가이드는 AI 도구를 활용해 초안을 구성하고 사람이 명령어·문맥을 검토해 발행했습니다. 운영체제와 도구 버전에 따라 결과가 달라질 수 있으므로 적용 전 공식 문서를 함께 확인하세요. 오류를 발견하시면 이메일로 제보해 주세요.
질문 & 답변 (Q&A)
이 가이드에 대해 궁금한 점을 질문해보세요. 확인 후 답변드립니다.