概述
- 目标:通过PgBouncer复用数据库连接,降低连接创建开销,并选择`transaction/session`模式保证功能与性能平衡。
- 适用:高并发短事务场景、微服务与函数式查询负载。
核心与实战
- 配置示例(`pgbouncer.ini`):
```
[databases]
app = host=db port=5432 dbname=app user=app_rw password=secret
[pgbouncer]
listen_port = 6432
listen_addr = 0.0.0.0
auth_type = md5
auth_file = /etc/pgbouncer/userlist.txt
pool_mode = transaction
max_client_conn = 2000
default_pool_size = 100
reserve_pool_size = 20
server_reset_query = DISCARD ALL
ignore_startup_parameters = extra_float_digits
server_tls_sslmode = disable
```
- 用户文件:
```
"app_rw" "md5xxxxxxxxxxxxxxxx"
```
- 启动与检查:
```
pgbouncer -d /etc/pgbouncer/pgbouncer.ini
psql 'host=127.0.0.1 port=6432 dbname=app user=app_rw password=secret' -c 'SHOW VERSION;'
```
示例
- 切换为`session`模式(需要会话级特性):
```
pool_mode = session
```
- 观测池与等待:
```
psql -h 127.0.0.1 -p 6432 -U app_rw -d pgbouncer -c 'SHOW POOLS;'
psql -h 127.0.0.1 -p 6432 -U app_rw -d pgbouncer -c 'SHOW STATS;'
```
验证与监控
- 并发效果:
- 观察后端连接数是否被池化;客户端连接与等待比例。
- 事务隔离:
- `transaction`模式适合短事务;`session`模式保留会话特性(例如临时表)。
- 安全与重置:
- 使用`server_reset_query=DISCARD ALL`清理会话状态;避免状态泄露。
常见误区
- 使用`transaction`模式但依赖会话功能(临时表/SET变量);需改为`session`或调整逻辑。
- 池大小过大导致后端连接饱和;需根据数据库资源设定。
- 未配置`ignore_startup_parameters`导致兼容性问题;需忽略不必要参数。
结语
- PgBouncer通过连接池化提升并发与稳定性;合理选择pool_mode与重置策略,可在生产中安全高效地服务多客户端。

发表评论 取消回复