DBAtlas · 데이터베이스 운영 아틀라스

PgBouncer pool_mode 선택 및 기본 크기 산정

PostgreSQLPgBouncer

명령어

; /etc/pgbouncer/pgbouncer.ini
[databases]
appdb = host=<primary_host> port=5432 dbname=appdb pool_mode=transaction
reportdb = host=<primary_host> port=5432 dbname=appdb pool_mode=session

[pgbouncer]
listen_addr = 0.0.0.0
listen_port = 6432
auth_type = scram-sha-256
auth_file = /etc/pgbouncer/userlist.txt
pool_mode = transaction
max_client_conn = 5000
default_pool_size = 20
reserve_pool_size = 5
max_prepared_statements = 200
query_wait_timeout = 120

하는 일

session 모드는 연결이 유지되는 동안 클라이언트를 하나의 서버 연결에 묶는다. transaction 모드는 트랜잭션 동안에만 서버 연결을 할당하여 수십 개의 PostgreSQL 연결로 수천 개의 클라이언트를 처리한다. statement 모드는 쿼리마다 연결을 반환하며 다중 문장 트랜잭션을 허용하지 않는다. pool_mode는 데이터베이스별로도 재정의할 수 있다.

사용 시점

수명이 짧은 연결을 많이 여는 OLTP/마이크로서비스 애플리케이션에는 transaction 모드, 세션 상태에 의존하는 작업(보고, 마이그레이션, LISTEN을 사용하는 서비스)에는 session 모드.

주의

transaction 모드에서는 트랜잭션 간 세션 상태가 유지되지 않는다. SET(SET LOCAL 제외), 세션 수준 advisory lock, LISTEN, WITH HOLD 커서, 트랜잭션을 넘는 임시 테이블, SQL 수준 PREPARE는 신뢰할 수 없다. 프로토콜 수준 prepared statement는 PgBouncer 1.21+와 max_prepared_statements > 0에서만 지원된다(1.24부터 기본값 200, 이전에는 0). default_pool_size에 (데이터베이스, 사용자) 쌍의 수를 곱한 값이 PostgreSQL max_connections(superuser_reserved_connections 여유분 제외)를 넘어서는 안 된다.

DBAtlas에서 열기 →

관련 항목