0Pricing
SQL Academy · 课时

连接池:PgBouncer

以事务池模式运行 PgBouncer,正确设置连接池大小,并避免预处理语句陷阱

连接池:PgBouncer 是 CoddyKit 上的免费 SQL Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 SQL Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 SQL Academy 课程共包含 4 节课。

为什么要池化连接?

每个 PostgreSQL 连接都是一个独立的 OS 进程,消耗大量内存和 CPU。每次请求都打开和关闭连接的应用程序会迅速耗尽服务器资源。连接池会重复利用一小组长期存在的连接。

每个连接的成本

一个典型的 PostgreSQL 后端进程会使用 5–10 MB 的 RAM。500 个连接仅后端进程就需要约 5 GB RAM。PgBouncer 可以将数千个客户端复用到 50 个后端连接上。

三种池化模式

  • 会话 — 客户端在整个会话期间获得一个专用连接
  • 事务 — 客户端每个事务获得一个连接
  • 语句 — 每条语句使用一个连接(很少使用)

事务模式(推荐)

每个事务都会获得一个服务器连接。同一个客户端在不同事务中可能使用不同的连接。

# pgbouncer.ini
[databases]
mydb = host=primary port=5432 dbname=mydb

[pgbouncer]
pool_mode = transaction
listen_port = 6432
max_client_conn = 1000
default_pool_size = 50

事务模式的注意事项

需要会话状态的功能会失效:

  • 预处理语句(需要在多次调用之间使用同一个后端)
  • SET LOCAL ...(每个事务独立设置没有问题;但跨事务持久化的 SET ... 不行)
  • LISTEN / NOTIFY(需要持久连接)
  • 生命周期超过事务的游标

会话模式

当事务模式导致应用程序无法正常运行时使用,但这样可以并发的客户端会更少。

确定池大小

经验法则:default_pool_size ≈ vCPU count × 2 + spindles。过高会因上下文切换而降低吞吐量;过低则会让请求在池中等待。

HAProxy 前的 PgBouncer

典型的生产环境架构:

App → HAProxy (read/write routing) → PgBouncer (pooling) → Postgres

事务模式中的预处理语句

新版 PgBouncer(1.21+)支持事务模式下协议级别的预处理语句。旧版本请使用简单查询或会话模式。

监控 PgBouncer

连接到管理数据库(特殊数据库):

psql -p 6432 -U pgbouncer pgbouncer

-- Commands:
SHOW STATS;
SHOW POOLS;
SHOW CLIENTS;
SHOW SERVERS;

替代方案

  • pgpool-II — 连接池化 + 负载均衡 + 查询重写
  • Odyssey — Yandex 的连接池工具,支持多线程
  • 驱动程序端连接池 — 通常与 PgBouncer 结合使用,以实现整个集群范围的连接池化

应用程序连接池 + PgBouncer

应用程序通常会运行自己的连接池(HikariCP、pgxpool)AND 通过 PgBouncer 连接。两层连接池——应用程序连接池维护与连接代理的连接;连接代理再将这些连接复用到 PostgreSQL 上。

回顾

在任何具有一定规模的系统中,PgBouncer 都不可或缺。

  • 事务模式是标准选择
  • 注意预处理语句 / SET / LISTEN
  • 池大小约为 vCPU × 2
  • 使用 SHOW POOLS 进行监控

快速检查

哪种 PgBouncer 模式可以用最少的服务器连接复用最多的客户端?

常见问题解答

「连接池:PgBouncer」课时是免费的吗?

是的 — 「连接池:PgBouncer」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 SQL Academy 课程的其余内容,请升级到 CoddyKit PRO。 SQL Academy 课程共包含 4 节课。

「连接池:PgBouncer」这节课中我会学到什么?

以事务池模式运行 PgBouncer,正确设置连接池大小,并避免预处理语句陷阱 你通过在浏览器中直接运行的动手代码来练习 SQL Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 SQL Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 SQL Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「连接池:PgBouncer」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 SQL Academy 课中编写并运行代码吗?

能。每节 SQL Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. pg_stat_statements:重点查询
  2. 使用 pgBadger 分析日志
  3. 连接池:PgBouncer
  4. 容量规划与膨胀审计
← 返回 SQL Academy