PostgreSQL在单机部署时容易受限于CPU和磁盘IO,当读多写少的场景变多,引入Pgpool作为数据库中间件可以把查询压力分摊到多个节点。Pgpool位于应用程序与PostgreSQL实例之间,对上层屏蔽了后端拓扑,对下层统一管理连接与转发逻辑。

Pgpool是什么
Pgpool是一个开源的PostgreSQL中间件,支持连接池、复制、负载均衡和故障转移。应用不再直接连数据库,而是连接Pgpool监听的端口,由它决定请求去哪个后端节点。
负载均衡的工作机制
在流复制搭建好的主备环境中,Pgpool默认把写操作发往主库,把读操作按配置策略轮询或随机发往备库。它通过检查SQL语句类型判断是否可分发。
判断逻辑
- 以INSERT、UPDATE、DELETE开头的语句走主库
- 以SELECT开头且不在事务中的语句可走备库
- 显式事务内的查询统一绑定到同一节点
基础配置示例
下面给出pgpool.conf中负载均衡相关的核心片段,实际部署还需配置后端节点信息。
# 开启负载均衡 load_balance_mode = on # 忽略系统表查询的负载均衡 ignore_leading_white_space = on # 设置备库权重,数值越大被分配概率越高 backend_weight0 = 1 backend_weight1 = 1 # 连接池模式 connection_cache = on
请求转发流程
当应用发送一条SQL,Pgpool的处理流程可以归纳为:
| 步骤 | 动作 |
|---|---|
| 1 | 接收客户端连接并认证 |
| 2 | 解析SQL判断读写类型 |
| 3 | 按负载均衡策略选择后端 |
| 4 | 转发语句并取回结果 |
| 5 | 将结果返回给客户端 |
使用连接池减少开销
Pgpool的连接池避免了频繁建立TCP和认证消耗。应用使用短连接时,Pgpool复用已有后端连接,对PostgreSQL而言并发连接数更平稳。
简单测试代码
以下Python示例展示应用如何只连接Pgpool地址:
import psycopg2
# 连接Pgpool而不是具体数据库节点
conn = psycopg2.connect(
host='127.0.0.1',
port=9999,
dbname='testdb',
user='appuser',
password='apppass'
)
cur = conn.cursor()
cur.execute('SELECT count(*) FROM orders')
print(cur.fetchone())
cur.close()
conn.close()
注意事项
负载均衡不保证备库实时一致,若业务要求刚写入就能读到,应使用/*NO LOAD BALANCE*/注释强制走主库。另外Pgpool本身可能成为单点,生产环境建议配合健康检查与多实例VIP方案。
合理设置延迟阈值与权重,才能让Pgpool的负载均衡真正缓解PostgreSQL压力。
小结
Pgpool以中间件方式拦截并调度SQL,用轻量规则完成PostgreSQL读请求的负载均衡。掌握其配置与限制,能帮助我们在不改动业务代码的前提下扩展数据库处理能力。
PostgreSQLPgpool负载均衡数据库中间件连接池修改时间:2026-07-24 17:09:21