Wahl des pool_mode in PgBouncer und grundlegende Dimensionierung
PostgreSQLPgBouncerBefehl
; /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 = 120Was es tut
Der Session-Modus bindet einen Client für die Dauer seiner Verbindung an eine Serververbindung; der Transaktionsmodus weist eine Serververbindung nur für die Dauer einer Transaktion zu und bedient Tausende Clients mit Dutzenden PostgreSQL-Verbindungen; der Statement-Modus gibt die Verbindung nach jeder Abfrage zurück und erlaubt keine Transaktionen mit mehreren Anweisungen. pool_mode lässt sich auch je Datenbank überschreiben.
Wann einsetzen
Transaktionsmodus für OLTP-/Microservice-Anwendungen, die viele kurzlebige Verbindungen öffnen; Session-Modus für Arbeiten, die vom Session-Zustand abhängen (Reporting, Migrationen, Dienste mit LISTEN).
Vorsicht
Im Transaktionsmodus bleibt der Session-Zustand zwischen Transaktionen nicht erhalten: SET (außer SET LOCAL), Advisory Locks auf Session-Ebene, LISTEN, WITH-HOLD-Cursors, temporäre Tabellen über Transaktionen hinweg und PREPARE auf SQL-Ebene sind unzuverlässig. Prepared Statements auf Protokollebene werden nur mit PgBouncer 1.21+ und max_prepared_statements > 0 unterstützt (Standard 200 seit 1.24, davor 0). default_pool_size mal Anzahl der Paare (Datenbank, Benutzer) darf PostgreSQL max_connections (abzüglich der Reserve superuser_reserved_connections) nicht übersteigen.