PgBouncer 커넥션 풀
PostgreSQL난이도: 중급소요 시간: 30–45분PGDG repo에서 PgBouncer를 설치합니다: transaction 또는 session 풀 모드, auth_query(SECURITY DEFINER 함수) 또는 userlist.txt를 이용한 scram-sha-256 인증, 데이터베이스의 max_connections와 CPU 값으로 계산한 풀 크기, systemd와 선택 사항인 so_reuseport 다중 프로세스. 마지막으로 관리 콘솔(SHOW POOLS/STATS), 애플리케이션 연결 문자열, transaction 모드 호환성 체크리스트를 다룹니다.
언제 도입하나: 애플리케이션이 수백/수천 개의 연결을 열거나, sorry, too many clients already가 발생하거나, 연결을 여는 비용이 큰 경우입니다. PgBouncer는 HA나 백업 솔루션이 아닙니다. Failover에는 streaming replication 또는 Patroni, 백업에는 pgBackRest가 필요합니다.
구성: PgBouncer를 데이터베이스 서버 또는 별도 서버에 배치, Patroni에서는 HAProxy/VIP 앞에 배치
시작하기 전에
- PostgreSQL이 pg-install 가이드로 설치되어 실행 중이며, … 데이터베이스와 … 사용자(scram-sha-256 비밀번호)가 있습니다.
- …PostgreSQL Patroni cluster(pg-patroni)가 실행 중이고 …가 현재 Leader입니다…PostgreSQL primary(pg-streaming)가 실행 중입니다…PostgreSQL이 pg-install 가이드로 설치되어 실행 중입니다…. … 데이터베이스와 … 사용자(scram-sha-256 비밀번호)가 있습니다.
- Patroni cluster …가 정상입니다: Leader 하나, replica는 streaming. HAProxy 쓰기 포트(…:…)는 leader로만 갑니다.
- 애플리케이션 사용자의 비밀번호가 SCRAM-SHA-256 형식으로 저장되어 있습니다(예전 md5 hash 사용자는 password_encryption = scram-sha-256 상태에서 비밀번호를 다시 설정해야 합니다).
- 폼의 max_connections(…)와 CPU(…)가 데이터베이스 서버의 실제 값과 같습니다(풀 크기가 이 값으로 계산됩니다).
- PgBouncer 서버가 데이터베이스(…HAProxy/VIP ……:…)에 접근할 수 있고, 애플리케이션 서버가 PgBouncer(…:…)에 접근할 수 있습니다.
- 포트 …가 비어 있습니다.
- 애플리케이션 팀과 풀 모드를 협의했습니다. Transaction 모드에서 세션 상태에 의존하는 기능(아래 체크리스트)을 쓰지 않습니다.
- 비밀번호 hash를 데이터베이스 서버에서 PgBouncer 서버로 복사할 scp(root 또는 sudo 권한 사용자) 접근이 있거나, 다른 안전한 방법으로 파일을 옮길 예정입니다.
가이드 단계
- PgBouncer 설치 — PGDG repo 추가 · PGDG repo 추가 · PgBouncer 설치
- 데이터베이스 쪽 — 역할 확인: 이 서버가 …Leader…primary…인가? · 관리 및 인증용 사용자 생성 · 관리 및 인증용 사용자 생성 · 비밀번호 설정 · 비밀번호 설정 · pg_hba.conf에 PgBouncer 서버 추가 …
- PgBouncer 구성 — auth_user 비밀번호 추가 · pgbouncer.ini 작성 · File descriptor 한도 설정 · PgBouncer 시작
- 다중 프로세스 (so_reuseport) — 프로세스별 구성 파일 · systemd 템플릿 서비스 · 단일 프로세스 서비스 중지, 프로세스 시작
- 검증 — 애플리케이션 사용자로 접속 · Leader로 연결되는지 확인 · 관리 콘솔 확인 · Firewall에서 PgBouncer 포트 열기
- 애플리케이션 쪽 및 설치 후 작업 — 애플리케이션 연결 문자열 · Transaction 모드 호환성 체크리스트 · 풀 모니터링 · 설정 변경과 reload