PgBouncer 1.26.1 介绍与选型指南
PgBouncer 1.26.1(2026-10-14 最新稳定版)认知与选型:单进程多路复用架构、三种池化模式、与 Pgpool-II/Odyssey/PostgreSQL 内置连接数的量化对比,全部数据联网溯源(查询日期 2026-10-20)。
PgBouncer 1.26.1 介绍与选型指南
目标:说清 PgBouncer 是什么、截至查询日官方最新稳定版本是哪个、单进程多路复用的连接池化架构如何工作、三种池化模式有什么差异,以及在 PgBouncer、Pgpool-II、Odyssey 与 PostgreSQL 内置连接数上限之间如何量化选型。本文为认知篇(A1):不做本地安装实测,全部版本号、特性与量化数据均来自官方来源联网查证,关键论断随文标注来源与查询日期(2026-10-20)。
一、信息基准
本篇是纯认知与选型文档,先交代"信息从哪来、以哪个版本为基准",便于读者判断时效并自行复核。
1.1 查询与版本基准
- 查询日期:2026-10-20。
- 基准版本:PgBouncer 1.26.1。依据:PgBouncer 官方 GitHub Releases 显示最新发布为 1.26.1(2026-10-14 发布,主题 "Only startup once",修复 CVE-2026-107350 / CVE-2026-107349 / CVE-2026-107348 三个安全问题);官方下载页 pgbouncer.org/downloads 已提供 pgbouncer-1.26.1.tar.gz 及其 sha256 校验文件。
- 版本节奏参照:1.26.0(2026-09-23)→ 1.26.1(2026-10-14);上一稳定系列 1.25.x 的最后版本为 1.25.2(2026-05-08)。官方 changelog 与 GitHub Releases 双向核对一致。
- 写作方式:不做本地安装实测;所有版本、特性、量化数据以官方来源为准,随文标注来源。
1.2 官方来源清单
| 信息项 | 官方来源 URL | 用途 |
|---|---|---|
| 官网首页(News) | https://www.pgbouncer.org/ | 发布动态、文档入口 |
| 官方 changelog | https://www.pgbouncer.org/changelog.html | 1.25.x/1.26.x 全部变更明细 |
| GitHub Releases | https://github.com/pgbouncer/pgbouncer/releases | 1.26.1 发布日期与 CVE 明细 |
| GitHub 仓库 | https://github.com/pgbouncer/pgbouncer | 构建依赖、许可、社区活跃度 |
| 下载页 | https://pgbouncer.org/downloads/ | 源码包与 sha256 校验 |
| 配置文档 | https://www.pgbouncer.org/config.html | 参数体系([databases]/[pgbouncer]) |
| 使用文档 | https://www.pgbouncer.org/usage.html | 管理控制台命令、池化模式说明 |
| FAQ | https://www.pgbouncer.org/faq.html | 池化模式限制的官方口径 |
| 安装文档 | https://www.pgbouncer.org/install.html | 编译依赖与安装步骤 |
| 星数取证 | https://img.shields.io/github/stars/pgbouncer/pgbouncer.json | GitHub Stars(shields.io,2026-10-20 实取 4.4k) |
💡 说明:PgBouncer 官网 News 首页在查询日仍以 1.25.2(2026-05-08)为第一条展示,而 GitHub Releases 已发布 1.26.1(2026-10-14)且官方下载页已提供 1.26.1 源码包,PostgreSQL 官方 PGDG apt 源也已上架 1.26.1-1.pgdg22.04+1。按"最新稳定版"口径,本文以 1.26.1 为基准(来源:GitHub Releases + pgbouncer.org/downloads + apt.postgresql.org,查询日期 2026-10-20)。
二、软件概述
2.1 PgBouncer 是什么
PgBouncer 是 PostgreSQL 的轻量级连接池(lightweight connection pooler)——它作为一个中间层服务进程,站在应用与 PostgreSQL 之间:应用像连 PostgreSQL 一样连接 PgBouncer,PgBouncer 持有少量到 PostgreSQL 的真实连接,在多个客户端连接之间多路复用这些后端连接(来源:pgbouncer.org 官网首页副标题 "Lightweight connection pooler for PostgreSQL" 与 GitHub README,查询日期 2026-10-20)。
它要解决的是 PostgreSQL 一个著名的架构约束:PostgreSQL 的每个客户端连接由一个独立的操作系统进程(backend process)承载。进程模型带来了天然的隔离性与稳定性,但每个连接都有不可忽略的内存与调度开销,连接的建立(fork + 认证 + 初始化)也远比无进程模型的数据库昂贵。当应用侧连接数暴涨(微服务实例数 × 连接池大小 × 环境数)时,PostgreSQL 会先被"大量空闲连接"压垮内存与上下文切换,而不是被真实查询压垮。PgBouncer 把"应用看到的连接数"与"PostgreSQL 实际承担的连接数"解耦:前者可以成千上万,后者维持在一个小而高效的规模。
💡 技术拓展:PG 生态里的连接池不止 PgBouncer 一种实现形态。同类主要选项对比——
方案 形态 特点 适用场景 PgBouncer 独立单进程代理 单线程异步事件、极轻量、专注连接复用 绝大多数需要连接池的场景 Odyssey(Yandex) 独立多线程代理 多 worker 线程并行处理认证与转发,支持路由规则 超高并发、需要多核扩展与高级路由 Pgpool-II 独立多功能中间件 连接池之外还做读写分离、负载均衡、并行查询、看门狗高可用 需要在同一层解决复制拓扑路由的场景 应用内连接池 库(如 HikariCP) 进程内池化,不减少总连接数,仅减少单实例内建连开销 单体应用、实例数很少 pgbouncer 集群前置 LB PgBouncer ×N + TCP 负载均衡 多实例横向扩展,规避单进程单核瓶颈 单实例吞吐已到瓶颈的超大规模 本文主角是 PgBouncer:它以最小的部署与运维成本解决"连接数过多"这一个问题,是 PostgreSQL 官方生态事实上的默认连接池方案。
2.2 版本格局:1.26.1 为当前稳定版
PgBouncer 采用"x.y.z"三段版本号:y 递增代表功能版本,z 递增代表缺陷与安全修复。截至查询日的版本格局(来源:pgbouncer.org/changelog.html 与 GitHub Releases,查询日期 2026-10-20):
| 版本 | 发布日期 | 定位与要点 |
|---|---|---|
| 1.26.1 | 2026-10-14 | 当前最新稳定版:修复 CVE-2026-107350(SCRAM 认证期间第二个 StartupMessage 导致可冒充其他用户登录)、CVE-2026-107349(startup options 空参数名导致单核空转 DoS)、CVE-2026-107348(包缓冲整数溢出死循环,仅在 max_packet_size≥2147483649 时可利用);并修复 ignore_startup_parameters 与被跟踪参数的优先级问题 |
| 1.26.0 | 2026-09-23 | 功能版本:默认跟踪服务端上报的全部连接参数(PG 18+ 的 search_path、PG 14+ 的 default_transaction_read_only),事务池模式下客户端 SET 不再污染其他客户端;新增 pool_idle_timeout(清理闲置池)、login_notify_message、SHOW STATS 新增 client_login_count 统计、支持 Meson 构建;移除 -R 在线重启(takeover)及仅为其存在的 SUSPEND 命令与 SHOW FDS;修复 CVE-2026-19888 / CVE-2026-6668 / CVE-2026-6669 |
| 1.25.2 | 2026-05-08 | 1.25 系列维护版:修复 CVE-2026-6664/6665/6666/6667(含 KILL_CLIENT 授权检查收紧) |
| 1.25.1 | 2025-12-03 | 修复 CVE-2025-12819(认证期恶意 search_path 参数注入 SQL) |
| 1.25.0 | 2025-11-09 | 功能版本:新增 LDAP 认证、客户端 direct TLS(PG 17 快速 TLS 握手)、transaction_timeout、scram_iterations、query_wait_notify、SCRAM 认证性能大幅提升 |
关键差异解读:1.26 系列最重要的两个行为变化是「参数全量跟踪默认开启」与「takeover 机制移除」。前者修复了事务池模式下 SET search_path 污染复用连接的历史痛点(老版本需要手动把参数加进 track_extra_parameters);后者意味着平滑发布应改用 so_reuseport 多实例滚动重启方案(官方 usage 文档给出的推荐做法),从 1.24.x 升级时需检查是否有脚本依赖 -R、SUSPEND、SHOW FDS。
2.3 许可、维护方与治理
- 许可:ISC License(类 BSD 宽松许可,允许商用与闭源集成)。源码 COPYRIGHT 头标注 "ISC License,Copyright (c) 2007-2009 Marko Kreen, Skype Technologies OÜ"——项目由 Skype 起源,现为 PostgreSQL 社区项目。
- 维护方:GitHub 上 pgbouncer 组织托管(github.com/pgbouncer/pgbouncer),核心维护者包括 JelteF 等活跃开发者,发布说明经由 PostgreSQL 官方公告渠道同步。
- 社区活跃度(2026-10-20 实查):GitHub Stars 4.4k(来源:shields.io 徽章 API 实取
{"label":"stars","message":"4.4k"},查询日期 2026-10-20);发布节奏近一年 5 个版本(1.25.0 ~ 1.26.1),安全事件响应迅速(1.26.0 发布 21 天内跟进 1.26.1 修复新 CVE)。
三、核心架构
3.1 单进程异步事件模型
PgBouncer 的核心设计是单进程 + 事件驱动(libevent):一个进程同时管理成千上万个客户端连接与后端连接,所有 I/O 都是异步非阻塞的,没有线程、没有锁、没有每连接的栈内存(来源:pgbouncer.org 官网定位与 GitHub README 构建依赖 Libevent 2.0+,查询日期 2026-10-20)。
这带来三个直接推论:
- 资源占用极低:PgBouncer 进程本身常驻内存通常只有几 MB 到几十 MB(内存主要用于连接缓冲与内部缓存),与它管理的连接数量关系不大。
- 单核天花板:所有连接复用一个事件循环,TLS 加解密与协议解析共享单核。一般场景下单实例足以支撑数千客户端连接;当 TLS 流量或包处理达到单核瓶颈时,官方推荐用 so_reuseport 起多个 PgBouncer 实例做内核级负载均衡。
- 无多实例状态同步:多个 PgBouncer 实例之间互不感知,各自独立维护连接池,部署与扩缩容都是无状态的。
3.2 连接的生命周期与池化位置
一次经由 PgBouncer 的数据库操作,链路是「客户端 → PgBouncer(逻辑连接)→ PostgreSQL(物理连接)」。PgBouncer 为每个「数据库 × 用户」组合维护一个池(pool),池内物理连接在以下状态间流转(状态名与 SHOW POOLS 的 sv_* 列一致,来源:pgbouncer.org/usage.html,查询日期 2026-10-20):
| 物理连接状态 | 含义 |
|---|---|
| sv_login | 正在与 PostgreSQL 握手建立连接 |
| sv_active | 正在服务某个客户端的事务/会话 |
| sv_idle | 空闲,可立即分配给下一个客户端 |
| sv_used | 刚被某客户端用过,等待 server_idle_timeout 后回收到 idle |
| sv_tested | 正在执行 server_reset_query / server_check_query 清理或探活 |
客户端连接状态则由 cl_active(已分配连接或在等查询结果)与 cl_waiting(在池中排队等物理连接)刻画。池的容量由 default_pool_size(默认 20)、reserve_pool_size(默认 0,突发时启用)等参数控制;客户端侧总量由 max_client_conn(默认 100)兜底。
3.3 三种池化模式(pool_mode)
pool_mode 是 PgBouncer 最重要的选型参数,决定"物理连接何时归还到池中"(来源:pgbouncer.org/config.html 与 usage.html,查询日期 2026-10-20):
| 模式 | 物理连接归还时机 | 客户端数 : 物理连接数 | 主要限制 |
|---|---|---|---|
| session(默认) | 客户端断开连接时 | 接近 1:1,池化收益最低 | 无功能限制,兼容一切会话状态 |
| transaction | 每个事务(COMMIT/ROLLBACK)结束 | 可达数百:1,最常用 | 会话级状态(SET、LISTEN、游标、prepared statement 生命周期)不能跨事务依赖 |
| statement | 每条语句执行完 | 复用度最高 | 不允许多语句事务(BEGIN/COMMIT 直接报错),强制 autocommit 语义 |
💡 技术拓展:池化模式的选择本质是「连接复用粒度」与「会话状态保真度」的权衡。三种模式对比之外,业界还有一种补充手段——会话状态迁移(session state migration),即物理连接归还时把会话变量序列化、分配时再恢复,PgBouncer 1.26.0 起默认跟踪服务端上报的全部连接参数(PG 18+ 的 search_path、PG 14+ 的 default_transaction_read_only)正是这一思路的官方实现:事务池模式下客户端 SET 的参数在连接复用时会被正确还原或重放,而不再需要人工往 track_extra_parameters 里加参数(来源:GitHub Releases PgBouncer 1.26.0 Features,查询日期 2026-10-20)。本文结论:生产环境优先选 transaction 模式以获得复用收益,依赖会话状态的老应用再退回 session 模式。
3.4 认证体系
PgBouncer 在代理层完成客户端认证,支持多种 auth_type(来源:pgbouncer.org/config.html 认证参数一节,查询日期 2026-10-20):
- scram-sha-256 / md5:与 PostgreSQL 密码体系对接,凭据来自 auth_file(userlist.txt)或 auth_query(向 auth_user 指定账号查询 pg_authid);SCRAM 透传(客户端与后端均 SCRAM)在 1.25.0 大幅优化了性能。
- cert:基于客户端 TLS 证书的认证。
- hba:1.17 起支持与 PostgreSQL 语法兼容的 pg_hba.conf 规则文件(auth_hba_file),可按地址/库/用户组合选择认证方式。
- pam / ldap:编译期启用对应库后可用;LDAP 认证自 1.25.0 引入,可通过 HBA 文件或 auth_ldap_options 配置。
- trust / any:不做密码校验(any 还会把任意用户名透传给后端),仅适合封闭内网测试。
四、功能特性
以下特性清单均可在官方文档中溯源(来源:pgbouncer.org config/usage 文档与 GitHub Releases,查询日期 2026-10-20):
- 多数据库映射:[databases] 段把逻辑库名映射到任意「host:port/dbname」,支持按库覆盖 pool_mode、pool_size、connect_query 等;1.25 起还支持多主机地址与 server_round_robin 实现 DNS 级负载分发。
- 协议级 prepared statement 跟踪:max_prepared_statements(默认 200)启用后,事务池模式下扩展协议的 Parse/Bind 自动在池内重放,JDBC 等驱动无需关闭 prepared statement 即可安全使用。
- 完整 TLS:客户端侧与后端侧各自独立的 sslmode/证书/协议套件配置,1.25.0 起支持 PG 17 引入的客户端 direct TLS 快速握手。
- 在线管理控制台:连接到虚拟库 pgbouncer 即可执行 SHOW/RELOAD/PAUSE/RESUME/DISABLE/ENABLE/KILL/RECONNECT 等命令(详见本专栏《常用 CLI 命令与工具详解》篇),1.26.0 起移除了 SUSPEND/SHOW FDS。
- 平滑发布能力:so_reuseport 支持多实例监听同一端口滚动重启;SHUTDOWN WAIT_FOR_CLIENTS/WAIT_FOR_SERVERS 支持优雅停机。
- 统计与可观测:SHOW STATS/STATS_TOTALS/STATS_AVERAGES 提供事务数、查询数、字节数、等待时间等周期统计(stats_period 默认 60 秒),1.26.0 新增 client_login_count 识别频繁重建连接的客户端。
- DNS 异步解析:内置多种异步 DNS 后端(c-ares / evdns / getaddrinfo_a),支持 EDNS0、SOA 区检查与 dns_max_ttl 控制,适合后端拓扑动态变化的云环境。
- systemd 集成:编译期检测 libsystemd 后支持 Type=notify/notify-reload 与 socket activation(官方源码 etc/pgbouncer.service 提供单元模板)。
五、快速开始(官方最小可用示例)
A1 为认知篇,不附本地实测;以下为官方文档给出的最小可用形态,读者可对照本专栏《Ubuntu 22.04 安装 PgBouncer 1.26.1 指南》逐命令实测。
最小 pgbouncer.ini(来源:pgbouncer.org/config.html 官方示例结构,查询日期 2026-10-20):
[databases]
postgres = host=127.0.0.1 port=5432 dbname=postgres
[pgbouncer]
listen_addr = 127.0.0.1
listen_port = 6432
auth_type = md5
auth_file = /etc/pgbouncer/userlist.txt
pool_mode = transaction
max_client_conn = 100
default_pool_size = 20
最小 userlist.txt(两列:用户名 + 密码或 SCRAM secret):
"appuser" "q1w2e3r4"
启动与验证(命令形态来自 pgbouncer -h 官方用法):
pgbouncer -d /etc/pgbouncer/pgbouncer.ini # 后台启动
psql -h 127.0.0.1 -p 6432 -U appuser postgres # 像连 PostgreSQL 一样连接
进入管理控制台:以 admin_users 中的用户连接到虚拟库 pgbouncer,执行 SHOW DATABASES;、SHOW POOLS; 等命令即可观察池化状态(来源:pgbouncer.org/usage.html 管理控制台一节,查询日期 2026-10-20)。
六、适用场景与限制
6.1 适用场景
- 高连接数应用直连:微服务/Serverless/短连接脚本场景,应用侧连接数远超 PG 可承受后端数,用 transaction 模式压缩物理连接。
- 连接风暴缓冲:应用发布或故障恢复时瞬时建连洪峰,由 cl_waiting 排队 + reserve_pool 突发容量吸收,保护 PostgreSQL 不被 fork 风暴打垮。
- 多套环境共享少量后端连接:测试/预发/夜间任务共用一组后端连接,max_db_connections 从数据库维度限流。
- 作为云 RDS/托管 PG 的标配前置:托管数据库通常有严格连接数配额,PgBouncer 是最常见的扩容手段(Supabase、Heroku 等均内置 PgBouncer)。
6.2 限制与不适用
(来源:pgbouncer.org/faq.html 官方 FAQ,查询日期 2026-10-20)
- statement 模式禁止多语句事务;transaction 模式下依赖会话状态的功能受限:SET(1.26.0 起常用参数已自动跟踪,仍不建议跨事务依赖)、LISTEN/NOTIFY、跨事务游标(WITH HOLD 除外,但效率低)。
- 不支持逻辑复制/物理复制协议的池化,walsender 类连接不应经 PgBouncer。
- 单进程单核:极端 TLS 吞吐下需要多实例 + so_reuseport 扩展,而非调大单实例参数。
- 不是防火墙/安全边界:认证与审计仍应结合 PostgreSQL 侧完成;1.26.1 正是修复认证链路 CVE 的版本,务必保持最新小版本。
七、同类选型对比(含社区活跃度/版本节奏/兼容矩阵量化维度)
7.1 与 PostgreSQL 内置连接数模型的量化对比
PostgreSQL 官方文档对连接成本的量化口径:每个连接是一个进程,postgres.conf 默认 max_connections=100(来源:postgresql.org/docs PostgreSQL 18 运行时配置一节,查询日期 2026-10-20)。进程模型的成本构成:
| 维度 | 直接调大 max_connections(如 5000) | 经 PgBouncer(transaction,池 50) |
|---|---|---|
| PG 侧进程数 | 5000 个常驻 backend 进程 | 最多约 50 个 |
| PG 侧内存 | 每连接数 MB 起的私有内存,空连接即可耗尽数十 GB | 池内存恒定,与客户端数无关 |
| 建连成本 | 每连接 fork + 认证 + 目录初始化,高并发下秒级抖动 | 前端建连与 PG 无关,物理连接复用 |
| 上下文切换 | 进程数超过核数后调度开销显著 | 后端进程少而忙,CPU 花在查询上 |
| 锁与 MVCC 压力 | 大量 idle in transaction 连接阻碍 vacuum(需手动防呆) | 事务结束连接即归还,idle 事务可由 idle_transaction_timeout 兜底 |
| 应用侧改造 | 无 | 连接串指向 PgBouncer 端口,几乎无改造 |
选型结论:连接数在几十以内的单体应用无需连接池;一旦客户端规模超过后端合理容量(常见经验值为"核数 × 2~4"量级的活跃后端),PgBouncer 是比调大 max_connections 正确得多的第一选择。PostgreSQL 侧的配置与连接模型详见本站 《PostgreSQL 18.6 介绍与选型指南》。
7.2 PgBouncer vs Pgpool-II vs Odyssey 量化对比
| 维度 | PgBouncer 1.26.1 | Pgpool-II 4.7.3 | Odyssey 1.5.1 |
|---|---|---|---|
| 定位 | 纯连接池 | 连接池 + 读写分离/负载均衡/并行查询/看门狗高可用 | 连接池 + 请求路由 |
| 并发模型 | 单进程单线程(libevent 事件驱动) | 多进程 | 多线程(worker 线程数可配) |
| GitHub Stars(2026-10-20,shields.io/官方仓库页) | 4.4k | 约 1.4k(pgpool/pgpool2 仓库) | 3.6k |
| 最新版本与日期 | 1.26.1(2026-10-14) | 4.7.3(2026-09-29,官方 News:4.7.3/4.6.8/4.5.13/4.4.18/4.3.21 同日发布) | 1.5.1(2026-07-14,来源 postgresql.org 官方公告) |
| 发布节奏(近一年) | 5 个版本(1.25.0→1.26.1),安全修复响应 3 周内 | 大版本约一年一升,多系列并行维护 | 中等节奏,近年随扩展协议重构持续演进 |
| 事务池模式 | 成熟,1.26.0 起自动跟踪全部服务端参数 | 支持 | 支持,扩展协议(pipelining)处理是近期优化重点 |
| 读写分离/复制拓扑感知 | 无(需外部组件) | 内置(负载均衡权重、主备分离、看门狗 VIP) | 支持基于规则的存储路由 |
| 内存/协议级 prepared statement | 内置跟踪重放(max_prepared_statements) | 有限支持 | 支持 |
| 部署与运维复杂度 | 极低(单二进制 + 单 ini) | 中高(hba/pool_passwd/pcp 多配置面 + 看门狗组件) | 中(YAML 配置 + 存储路由规则) |
| 典型场景 | 通用连接池默认解 | 需要"连接池 + 复制路由"二合一 | 超大并发多核扩展、高级认证路由 |
解读与选择建议:
- 只要连接池 → PgBouncer:功能面最聚焦、行为最可预期、运维面最小,且是各托管平台内置的事实标准。
- 要连接池又要读写分离 → 先评估 Pgpool-II:把两件事放进一个组件有集成收益,但复杂度与排障面同步上升;也可以 PgBouncer + PostgreSQL 侧 libpq 负载均衡/代理层组合替代。
- 单实例吞吐或协议级路由有瓶颈 → Odyssey:多线程模型可吃满多核,Yandex 生产规模验证(官方公告称支撑 1000+ QPS 级别生产部署,来源 postgresql.org Odyssey 1.0 公告)。
⚠️ 注意:Stars 数据为 2026-10-20 经 shields.io 与仓库页实取的快照,会随时间变化;Pgpool-II 星数取自其 GitHub 镜像仓库,该项目实际主仓库在 pgpool.net(评活跃度时以官方 News 发布频率为准)。
八、参考链接
- 官网:https://www.pgbouncer.org/
- GitHub 仓库:https://github.com/pgbouncer/pgbouncer
- 官方 changelog:https://www.pgbouncer.org/changelog.html
- 1.26.1 Release:https://github.com/pgbouncer/pgbouncer/releases/tag/pgbouncer_1_26_1
- 下载页(含 sha256):https://www.pgbouncer.org/downloads/
- 配置参数文档:https://www.pgbouncer.org/config.html
- 使用/管理控制台文档:https://www.pgbouncer.org/usage.html
- FAQ:https://www.pgbouncer.org/faq.html
- 安装文档:https://www.pgbouncer.org/install.html
- 本站延伸阅读:《PostgreSQL 18.6 介绍与选型指南》、《Ubuntu 22.04 安装 PostgreSQL 18 指南》
- 本专栏后续篇目:《Ubuntu 22.04 安装 PgBouncer 1.26.1 指南》《PgBouncer 1.26.1 配置参数详解》《PgBouncer 1.26.1 常用 CLI 命令与工具详解》(发布后可从 PgBouncer 专栏进入)