Escolha do pool_mode do PgBouncer e dimensionamento básico
PostgreSQLPgBouncerComando
; /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 = 120O que faz
O modo session vincula um cliente a uma conexão de servidor durante toda a vida da conexão; o modo transaction atribui uma conexão de servidor apenas durante uma transação e atende milhares de clientes com dezenas de conexões PostgreSQL; o modo statement devolve a conexão após cada consulta e não permite transações com vários comandos. O pool_mode também pode ser sobreposto por banco.
Quando usar
Modo transaction para aplicações OLTP/microsserviços que abrem muitas conexões de vida curta; modo session para trabalhos que dependem do estado da sessão (relatórios, migrações, serviços que usam LISTEN).
Atenção
No modo transaction o estado da sessão não é preservado entre transações: SET (exceto SET LOCAL), advisory locks em nível de sessão, LISTEN, cursores WITH HOLD, tabelas temporárias entre transações e PREPARE em nível de SQL não são confiáveis. Prepared statements em nível de protocolo só são suportados com PgBouncer 1.21+ e max_prepared_statements > 0 (padrão 200 desde o 1.24, 0 antes). default_pool_size vezes o número de pares (banco, usuário) não deve exceder o max_connections do PostgreSQL (menos a margem de superuser_reserved_connections).