Choix du pool_mode PgBouncer et dimensionnement de base
PostgreSQLPgBouncerCommande
; /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 = 120Ce que fait la commande
Le mode session lie un client à une connexion serveur pour toute la durée de sa connexion ; le mode transaction n'attribue une connexion serveur que pour la durée d'une transaction et sert des milliers de clients avec quelques dizaines de connexions PostgreSQL ; le mode statement rend la connexion après chaque requête et interdit les transactions multi-instructions. pool_mode peut aussi être redéfini par base.
Quand l'utiliser
Mode transaction pour les applications OLTP/microservices qui ouvrent de nombreuses connexions de courte durée ; mode session pour les travaux qui dépendent de l'état de session (reporting, migrations, services utilisant LISTEN).
Attention
En mode transaction, l'état de session n'est pas préservé entre les transactions : SET (sauf SET LOCAL), les advisory locks de niveau session, LISTEN, les curseurs WITH HOLD, les tables temporaires entre transactions et PREPARE au niveau SQL ne sont pas fiables. Les prepared statements au niveau protocole ne sont pris en charge qu'avec PgBouncer 1.21+ et max_prepared_statements > 0 (200 par défaut depuis 1.24, 0 avant). default_pool_size multiplié par le nombre de paires (base, utilisateur) ne doit pas dépasser max_connections de PostgreSQL (moins la marge superuser_reserved_connections).