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 也可以按数据库覆盖。
适用场景
transaction 模式适用于打开大量短连接的 OLTP/微服务应用;session 模式适用于依赖会话状态的工作(报表、迁移、使用 LISTEN 的服务)。
注意
在 transaction 模式下,事务之间不保留会话状态:SET(SET LOCAL 除外)、会话级 advisory 锁、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 余量)。