Azure Database for PostgreSQL 灵活服务器实例提供 PgBouncer 作为内置连接池解决方案。 PgBouncer 是一项可选功能,可在每个数据库服务器上启该功能g。 公共访问和专用访问网络中的常规用途和内存优化计算层支持它。
PgBouncer 在与 Azure Database for PostgreSQL 灵活服务器实例的数据库服务器相同的虚拟机(VM)上运行。 Postgres 使用基于进程的连接模型,这使得维护许多空闲连接的成本非常昂贵。 一旦服务器运行的连接数超过几千个,Postgres 就会遭遇资源限制问题。 PgBouncer 的主要好处在于,可以改进数据库服务器上的空闲连接和生存期较短的连接。
PgBouncer 使用轻型模型,该模型利用异步 I/O。 它仅在需要时才使用 Postgres 连接 ,即在打开的事务内或查询处于活动状态时。 此模型允许纵向扩展到 10,000 个连接,开销较低。
部署在 Azure Database for PostgreSQL 中所有受支持的主要版本的引擎上的 PgBouncer 版本为 1.23.1。 PgBouncer 在数据库服务器上的端口 6432 上运行。 你可以将应用程序的数据库连接配置更改为使用同一主机名,但将端口更改为 6432,便可开始使用 PgBouncer 并受益于改进的空闲连接缩放功能。
Azure Database for PostgreSQL 中的 PgBouncer 支持 Microsoft Entra 身份验证 (Azure AD)。
启用和配置 PgBouncer
PgBouncer 在频繁的连接变动可能会降低性能的事务应用程序中特别有用。 它默认在端口 6432 上启用,可以使用与 PostgreSQL 服务器相同的主机名连接到它,但端口 6432 而不是默认端口 5432。
若要启用 PgBouncer,请转到 Azure 门户中的“服务器参数”窗格,搜索“PgBouncer”,并将 pgbouncer.enabled 设置更改为“true”。 无需重启服务器。
你可以使用以下参数配置 PgBouncer 设置。
注释
仅当服务器参数“”设置为“pgbouncer.enabled”时,“true”窗格中才会显示以下 PgBouncer 服务器参数列表。 否则,它们会故意隐藏。
| 参数名称 | Description | 违约 |
|---|---|---|
pgbouncer.default_pool_size |
将此参数值设置为每个用户和数据库对的连接数。 | 50 |
pgbouncer.ignore_startup_parameters |
输入 PgBouncer 可忽略的以逗号分隔的参数列表。 例如,可以让 PgBouncer 忽略 extra_float_digits 参数。 允许使用某些参数,其他所有参数将会引发错误。 为了容忍过于热衷的 Java Database Connectivity (JDBC) 想要在启动数据包中无条件地设置 extra_float_digits=2 的情况,需要这种能力。 如果使用的库报告 pq: unsupported startup parameter: extra_float_digits 等错误,请使用此选项。 |
|
pgbouncer.max_client_conn |
将此参数值设置为要支持的 PgBouncer 的最大客户端连接数。 默认值为 5,000,允许范围为 1 到 50,000。 | 五千 |
pgbouncer.max_prepared_statements |
如果此值为非零,PgBouncer 将跟踪客户端在事务模式和语句池模式下发送的协议级别的命名预备语句相关命令。 | 0 |
pgbouncer.min_pool_size |
如果连接数低于此值,请向池添加更多服务器连接。 | 0 |
pgbouncer.pool_mode |
将此参数值设置为事务池的事务(这是对大多数工作负载的推荐设置)。 | 事务 |
pgbouncer.query_wait_timeout |
允许查询花费等待执行的最长时间(以秒为单位)。 如果在此时间段内未将查询分配给服务器,客户端将断开连接。 | 120 |
pgbouncer.server_idle_timeout |
如果服务器连接处于空闲状态超过此秒,则 PgBouncer 会删除连接。 如果为 0,则禁用超时。 | 600 |
pgbouncer.stats_users |
获允在 pgBouncer 控制台上连接和运行只读查询的数据库用户的逗号分隔列表。 |
有关 PgBouncer 配置的详细信息,请参阅 pgbouncer.ini 文档。
优点
通过将内置的 PgBouncer 功能与 Azure Database for PostgreSQL 灵活服务器实例结合使用,可以获得以下优势:
简化配置的便利性:由于 PgBouncer 与 Azure Database for PostgreSQL 灵活服务器实例集成,因此不需要单独的安装或复杂的设置。 你可以直接从服务器参数对其进行配置。
托管服务的可靠性:PgBouncer 提供 Azure 托管服务的优势。 例如,Azure 管理 PgBouncer 的更新。 有了自动更新,就无需手动维护并可确保 PgBouncer 及时引入最新的功能和安全修补程序。
支持各种连接类型:Azure Database for PostgreSQL 中的 PgBouncer 支持公共连接和专用连接。 你可以根据其特定要求通过专用网络建立安全连接或连接到外部。
故障转移方案中的高可用性:如果在故障转移期间将备用服务器提升为主角色,则 PgBouncer 将在新升级的备用服务器上无缝重启。 无需对应用程序连接字符串进行任何更改。 此功能可确保持续可用性,并将对应用程序的连接池的中断降到最低。
监视 PgBouncer
Metrics
可以使用 PgBouncer 指标监视 PgBouncer 进程的性能,包括活动连接、空闲连接、共用连接总数和连接池数的详细信息。 每项指标间隔 1 分钟发出一次,并具有长达 93 天的历史记录。 客户可以针对指标配置警报,还可以访问新的指标维度,以按数据库名称拆分和筛选指标数据。
如何启用 PgBouncer 指标
- 若要监视 PgBouncer 指标,请确保通过服务器参数启用
pgbouncer.enabled功能,并启用指标参数metrics.pgbouncer_diagnostics。 - 这些参数是动态的,不需要重启实例。
- PgBouncer 指标已默认禁用。
PgBouncer 指标列表
| 显示名称 | 指标 ID | 单位 | Description | 尺寸 | 默认启用 |
|---|---|---|---|---|---|
| 活动客户端连接数 | client_connections_active |
计数 | 来自与 Azure Database for PostgreSQL 灵活服务器连接关联的客户端的连接数。 | DatabaseName | 否 |
| 等待客户端连接 | client_connections_waiting |
计数 | 来自等待 Azure Database for PostgreSQL 灵活服务器连接为其提供服务的客户端的连接数。 | DatabaseName | 否 |
| 活动服务器连接 | server_connections_active |
计数 | 客户端连接正在使用的 Azure Database for PostgreSQL 灵活服务器连接数。 | DatabaseName | 否 |
| 空闲服务器连接 | server_connections_idle |
计数 | 连接到 Azure Database for PostgreSQL 灵活服务器的连接数,这些连接处于空闲状态且可为新客户端连接提供服务。 | DatabaseName | 否 |
| 共用连接总数 | total_pooled_connections |
计数 | 当前共用连接数。 | DatabaseName | 否 |
| 连接池数 | num_pools |
计数 | 连接池总数。 | DatabaseName | 否 |
有关使用 PgBouncer 指标的注意事项
- 使用 DatabaseName 维度的 PgBouncer 指标限制为 30 个数据库。
- 对于可突发的 SKU,使用 DatabaseName 维度的限制为 10 个数据库。
- DatabaseName 维度限制适用于 OID 列,这反映了数据库的创建顺序。
有关详细信息,请参阅 PgBouncer 指标。
日志
Azure Database for PostgreSQL 灵活服务器提供 PgBouncer 日志,可帮助你审核连接池活动,并排查连接断开、身份验证失败或池耗尽等问题。 PgBouncer 日志包括身份验证失败、连接生命周期事件、错误和服务器状态更改等详细信息。 这些详细信息可用于识别连接瓶颈和行为异常。
启用日志
启用日志诊断设置以自动发出 PgBouncer 日志。 Log Analytics 支持两种架构类型:Azure 诊断和资源特定模式。 有关详细信息,请参阅 Azure 资源日志的通用架构和特定于服务的架构。
Azure 诊断架构
- 日志显示在
AzureDiagnostics表中。 - 使用过滤器:
Category == "PostgreSQLFlexPGBouncer".
- 日志显示在
Resource-Specific 架构
- 日志显示在
PGSQLPgBouncer表中。 - 更易于查询、结构化格式。
- 日志显示在
示例 KQL 查询
Azure 诊断架构:
AzureDiagnostics
| where Category == "PostgreSQLFlexPGBouncer"
| where LogicalServerName_s =~ "your-server-name"
| order by TimeGenerated desc
Resource-Specific 架构:
PGSQLPgBouncer
| where _ResourceId =~ "your-server-name"
| order by TimeGenerated desc
注释
字段名称和架构格式可能因使用的架构(合并与 Resource-Specific)略有不同。
管理控制台
PgBouncer 还提供名为“”的pgbouncer数据库。 连接到数据库后,你还可以执行 SHOW 命令,该命令提供有关 pgbouncer 当前状态的信息。
若要连接到 pgbouncer 数据库,请执行以下操作:
将
pgBouncer.stats_users参数设置为现有用户的名称(例如“myUser”),然后应用更改。以此用户身份连接到
pgbouncer数据库,并将端口设置为“6432”:psql "host=myPgServer.postgres.database.chinacloudapi.cn port=6432 dbname=pgbouncer user=myUser password=<password> sslmode=require"
连接到数据库后,使用 SHOW 命令查看 PgBouncer 统计信息:
-
SHOW HELP:列出所有可用的SHOW命令。 -
SHOW POOLS:显示每个池在每个状态下的连接数。 -
SHOW DATABASES:显示每个数据库的当前应用连接限制。 -
SHOW STATS:显示每个数据库的请求和流量的统计信息。
有关 PgBouncer SHOW 命令的详细信息,请参阅“管理控制台”。
切换应用程序以使用 PgBouncer
若要开始使用 PgBouncer,请执行以下步骤:
连接到数据库服务器,但应使用端口 6432 而不是常规端口 5432。 验证此连接是否正常工作。
psql "host=myPgServer.postgres.database.chinacloudapi.cn port=6432 dbname=postgres user=myUser password=<password> sslmode=require"在 QA 环境中针对 PgBouncer 测试你的应用程序,以确保不存在任何兼容性问题。 PgBouncer 项目提供兼容性矩阵,因此我们建议对大多数用户使用“事务池”。
更改生产应用程序以连接到端口 6432 而不是 5432。 监视可能指向兼容性问题的任何应用程序端错误。
PgBouncer 的区域冗余高可用性
在区域冗余高可用性 (HA) 配置服务器中,主服务器将运行 PgBouncer。 你可以通过端口 6432 连接到主服务器的 PgBouncer。 故障转移后,系统会在新升级的备用服务器上重启 PgBouncer,该备用服务器现在是主服务器。 因此,应用程序连接字符串将在故障转移后保持不变。
具有弹性群集的 PgBouncer
PgBouncer 也可用于弹性群集。 弹性群集中的每个节点都有自己的 PgBouncer 实例。 启用后,端口 6432 将路由到弹性群集协调器节点上的 PgBouncer。 此外,端口 8432 路由到群集中工作节点上运行的 PgBouncer 实例。
局限性
- PgBouncer 功能当前不支持弹性性能服务器计算层级。 如果将计算层从常规用途或内存优化更改为可突发层,则你将无法使用内置的 PgBouncer。
- 每当服务器在扩展操作、高可用性故障转移或重启时重新启动,系统也会重新启动 PgBouncer 和 VM。 然后,需要重新建立现有连接。
- 门户不会显示所有 PgBouncer 参数。 启用 PgBouncer 并保存参数后,需要关闭 “服务器参数 ”窗格(例如,选择“ 概述”),然后返回到 “服务器参数 ”窗格以查看所有参数。
- 不能将语句池模式与已准备的语句一起使用。 当前版本的 PgBouncer 增加了对交易模式中准备语句的支持。 可以通过 max_prepared_statements 参数启用和配置此支持。 将此参数设置为高于默认值 0 可启用对预处理语句的支持。 此支持仅适用于协议级预编译语句。 对于大多数编程语言,这种支持意味着应用程序在客户端上使用 libpq 函数 PQprepare ,发送 PgBouncer 可以截获的协议级别命令,而不是发出类似于 PREPARE proc AS 的动态 SQL 命令,后者发送 PgBouncer 无法正确解释的文本。 请参阅 PgBouncer 文档,查看所选池模式的其他限制。
- 如果将 PgBouncer 部署为一项功能,则它将成为潜在的单一故障点。 如果 PgBouncer 功能出现故障,可能会中断整个数据库连接池,从而导致应用程序停机。 若要缓解单一故障点,可以在负载均衡器后面设置多个 PgBouncer 实例,以在 Azure VM 上实现高可用性。
- PgBouncer 是一个非常轻型的应用程序,它利用的是单线程体系结构。 此设计非常适合大多数应用程序工作负载。 但在创建大量生存期较短连接的应用程序中,此设计可能会影响 PgBouncer 性能,并限制缩放应用程序的能力。 可能需要尝试以下方法之一:
- 在 Azure VM 上的多个 PgBouncer 实例之间分配连接负载。
- 考虑替代解决方案,包括 Azure VM 上的 PgCat 等多线程解决方案。
重要
内置 PgBouncer 功能的参数 pgbouncer.client_tls_sslmode 在 Azure Database for PostgreSQL 中已弃用。
将 TLS/SSL 强制应用到 Azure Database for PostgreSQL 的灵活服务器实例时,只需将服务器参数require_secure_transport设置为 ON,内置的 PgBouncer 功能也会自动对其连接强制实施 TLS/SSL。 默认情况下,在创建新的 Azure Database for PostgreSQL 灵活服务器实例并启用内置 PgBouncer 功能时,将启用此设置。 有关详细信息,请参阅 Azure Database for PostgreSQL 中 TLS 的安全连接。
如果用户寻求简化管理、内置高可用性、与容器化应用程序轻松进行连接并有兴趣使用最常用配置参数,内置 PgBouncer 功能是不错的选择。 如果客户寻求多线程可伸缩性、希望可以完全控制所有参数和调试体验,则可以选择另一种替代方案,即在 Azure VM 上设置 PgBouncer。