你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

PgBouncer - Azure Database for PostgreSQL - 灵活服务器

适用于:Azure Database for PostgreSQL 灵活服务器

Azure Database for PostgreSQL 灵活服务器将 PgBouncer 作为内置连接池解决方案予以提供。 这是一项可选服务,可以在每个数据库服务器上启用,并支持公共和私有访问。 PgBouncer 在与 Azure Database for PostgreSQL 灵活服务器数据库服务器相同的虚拟机中运行。 Postgres 使用基于进程的连接模型,这使得维护许多空闲连接的成本非常昂贵。 因此,一旦服务器运行的连接数超过几千个,Postgres 本身就会遭遇资源限制问题。 PgBouncer 的主要好处在于,可以改进数据库服务器上的空闲连接和生存期较短的连接。

PgBouncer 使用更轻量的模型,该模型使用异步 I/O,并且仅在需要时(即在打开的事务中或查询处于活动状态时)使用实际的 Postgres 连接。 此模型可以更轻松地以低开销支持数千个连接,并允许以低开销扩展到最多 10,000 个连接。 启用后,PgBouncer 将在数据库服务器上的端口 6432 上运行。 你可以将应用程序的数据库连接配置更改为使用同一主机名,但将端口更改为 6432,便可开始使用 PgBouncer 并受益于改进的空闲连接缩放功能。

Azure Database for PostgreSQL 灵活服务器中的 PgBouncer 支持 Microsoft Entra 身份验证 (AAD) 身份验证。

注意

公共访问和专用访问网络中的常规用途和内存优化计算层均支持 PgBouncer。

启用和配置 PgBouncer

若要启用 PgBouncer,可以导航到 Azure 门户中的“服务器参数”边栏选项卡,然后搜索“PgBouncer”并将“pgbouncer.enabled”设为“true”,即可启用 PgBouncer。 无需重启服务器。 但是,若要设置其他 PgBouncer 参数,请参阅限制部分。

你可以配置 PgBouncer,并设置以下参数:

参数名称 说明 默认
pgbouncer.default_pool_size 将此参数值设置为每个用户/数据库对的连接数 50
pgBouncer.max_client_conn 将此参数值设置为要支持的最大 PgBouncer 客户端连接数量。 5000
pgBouncer.pool_mode 将此参数值设置为事务池的事务(此为大多数工作负载的建议设置)。 TRANSACTION
pgBouncer.min_pool_size 如果低于此数量,请将更多服务器连接添加到池。 0(禁用)
pgbouncer.ignore_startup_parameters PgBouncer 可以忽略的参数列表(以逗号分隔)。 例如,可以允许 PgBouncer 忽略 extra_float_digits 参数。 允许使用某些参数,其他所有参数将会引发错误。 该功能是容忍想要在启动数据包中无条件地设置“extra_float_digits=2”的过度热情的 JDBC 所必需的。 如果使用的库报告 pq: unsupported startup parameter: extra_float_digits 等错误,请使用此选项。
pgbouncer.query_wait_timeout 允许查询等待进行执行的最长时间(秒)。 如果在此时间段内未将查询分配给服务器,客户端将断开连接。 120s
pgBouncer.stats_users 可选。 将此参数值设置为现有用户的名称,以便能够登录到特殊的 PgBouncer 统计数据库(名为“PgBouncer”)。

有关 PgBouncer 配置的详细信息,请参见 pgbouncer.ini

重要

PgBouncer 的升级将由 Azure 管理。

内置 PGBouncer 功能的优点和限制

通过将内置 PgBouncer 与灵活服务器的优势相结合,用户可以享受简化配置的便利性、托管服务的可靠性、对各种连接类型的支持,以及在故障切换场景中的无缝高可用性。 使用内置的 PGBouncer 功能具有以下优势:

  • 由于它与 Azure Database for PostgreSQL 灵活服务器无缝集成,因此无需单独安装或复杂的安装。 该功能可以直接通过服务器参数轻松配置,确保使用简单。
  • 作为一项托管服务,可为用户提供其他 Azure 托管服务的优势。 这包括自动更新,这样便无需手动维护并可确保 PgBouncer 及时引入最新的功能和安全修补程序。
  • 灵活服务器中的内置 PgBouncer 支持公共和专用连接。 此功能允许用户根据其特定要求通过专用网络建立安全连接或连接到外部。
  • 如果发生故障转移,备用服务器将被提升为主要角色,PgBouncer 将在新提升的备用服务器上无缝重新启动,而不需要对应用程序连接字符串进行任何更改。 此功能可确保持续可用性,将对应用程序连接池的中断降到最低。

监视 PgBouncer

PgBouncer 指标

Azure Database for PostgreSQL 灵活服务器现在为监控 PgBouncer 连接池提供了六个新指标。

显示名称 指标 ID 计价单位 说明 维度 默认启用
活动客户端连接(预览版) client_connections_active 计数 来自客户端的连接,该客户端与 Azure Database for PostgreSQL 灵活服务器连接相关联 DatabaseName
正在等待的客户端连接(预览版) client_connections_waiting 计数 来自客户端的连接,该客户端正在等待 Azure Database for PostgreSQL 灵活服务器连接为其提供服务 DatabaseName
活动服务器连接(预览版) server_connections_active 计数 与 Azure Database for PostgresSQL 灵活服务器的连接,该连接正在由客户端连接使用 DatabaseName
空闲服务器连接(预览版) server_connections_idle 计数 与 Azure Database for PostgreSQL 灵活服务器的连接,该连接处于空闲状态,已准备好为新的客户端连接提供服务 DatabaseName
共用连接总数(预览版) total_pooled_connections 计数 当前共用连接数 DatabaseName
连接池数(预览版) num_pools 计数 连接池的总数 DatabaseName

若要了解更多信息,请参阅 pgbouncer 指标

管理控制台

PgBouncer 还提供可以连接到的内部数据库(称为 pgbouncer)。 连接到数据库后,可以执行 SHOW 命令,该命令提供有关 pgbouncer 当前状态的信息。

连接到 pgbouncer 数据库的步骤

  1. pgBouncer.stats_users 参数设置为现有用户的名称(例如“myUser”),然后应用更改。
  2. 以此用户身份连接到 pgbouncer 数据库,并以 6432 身份连接到端口。
psql "host=myPgServer.postgres.database.azure.com port=6432 dbname=pgbouncer user=myUser password=myPassword sslmode=require"

连接后,使用 SHOW 命令查看 pgbouncer 统计信息:

  • SHOW HELP - 列出所有可用的 show 命令
  • SHOW POOLS - 显示每个池处于每个状态的连接数
  • SHOW DATABASES - 显示每个数据库的当前应用连接限制
  • SHOW STATS - 显示每个数据库的请求和流量的统计信息

有关 PgBouncer show 命令的更多详细信息,请参阅管理员控制台

切换应用程序以使用 PgBouncer

若要开始使用 PgBouncer,请执行以下步骤:

  1. 连接到数据库服务器,但使用端口 6432,而不是常规端口 5432 -- 验证此连接是否有效。

    psql "host=myPgServer.postgres.database.azure.com port=6432 dbname=postgres user=myUser password=myPassword sslmode=require"
    
  2. 在 QA 环境中针对 PgBouncer 测试你的应用程序,以确保不存在任何兼容性问题。 PgBouncer 项目提供兼容性矩阵,因此我们建议对大多数用户使用“事务池”: https://www.PgBouncer.org/features.html#sql-feature-map-for-pooling-modes

  3. 更改生产应用程序以连接到端口 6432 而不是 5432,并监视所有可能指向任何兼容性问题的应用程序错误。

PgBouncer 的区域冗余高可用性

在区域冗余高可用性配置服务器中,主服务器将运行 PgBouncer。 你可以通过端口 6432 连接到主服务器的 PgBouncer。 故障转移后,PgBouncer 将在新升级的备用服务器(即新的主服务器)上重新启动。 因此,应用程序连接字符串将在故障转移后保持不变。

将 PgBouncer 与其他连接池一起使用

在某些情况下,你可能已经有一个应用程序端连接池,或者已经在应用程序端(例如 AKS side car)上设置了 PgBouncer。 在这些情况下,使用内置 PgBouncer 仍然有用,因其可以提供空闲连接缩放效益。

在数据库服务器上联合使用应用程序端池与 PgBouncer 是一件非常有益的事。 这种情况下,应用程序端池有利于减少初始连接延迟(因为初始化连接的初始往返速度要快得多),而数据库端 PgBouncer 则可提供空闲连接缩放。

限制

  • PgBouncer 功能目前不支持可突发服务器计算层。
  • 如果将计算层从常规用途或内存优化更改为可突发层,则你将无法使用内置 PgBouncer。
  • 每当在执行缩放操作、HA 故障转移或重新启动期间重启服务器时,PgBouncer 也会随服务器虚拟机一同重启。 因此,必须重新建立现有连接。
  • 由于已知问题,门户不会显示部分 PgBouncer 参数。 启用 PgBouncer 并保存参数后,必须退出参数屏幕(例如单击“概述”),然后返回到“参数”页。
  • 事务和语句池模式不能与准备好的语句一起使用。 请参阅 PgBouncer 文档,检查所选池模式的其他限制。
  • 如果将 PgBouncer 部署为一项功能,则它将成为潜在的单一故障点。 如果 PgBouncer 功能出现故障,可能会中断整个数据库连接池,从而导致应用程序停机。 若要缓解单一故障点,可以在负载均衡器后面设置多个 PgBouncer 实例,以在 Azure VM 上实现高可用性。
  • PgBouncer 是一个非常轻型的应用程序,它利用的是单线程体系结构。 尽管这非常适合大多数应用程序工作负荷,但在创建大量短生存期连接的应用程序中,这可能会影响 pgBouncer 性能,从而限制缩放应用程序的能力。 可能需要在 Azure VM 上的多个 PgBouncer 实例之间分配连接负载,或者考虑其他解决方案,例如多线程解决方案,例如 Azure VM 上的 PgCat

重要

内置 PgBouncer 功能的参数pgbouncer.client_tls_sslmode已在已启用内置 PgBouncer 功能的 Azure Database for PostgreSQL 灵活服务器中弃用。 通过将 require_secure_transport 服务器参数设置为 ON 来强制实施与 Azure Database for PostgreSQL 灵活服务器的连接的 TLS/SSL 时,会自动强制 TLS/SSL 连接到内置 PgBouncer。 默认情况下,在创建新的 Azure Database for PostgreSQL 灵活服务器实例并启用内置 PgBouncer 功能时,将启用此设置以强制实施 SSL/TLS。 有关 Azure Database for PostgreSQL 灵活服务器中的 SSL/TLS 的详细信息,请参阅此 文档。

对于寻求简化管理、内置高可用性、与容器化应用程序轻松进行连接并有兴趣使用 PGBouncer 的最常用配置参数的客户,内置 PGBouncer 功能是不错的选择。 对于寻求多线程可伸缩性、希望可以完全控制所有参数和调试体验的客户,则可以选择另一种替代方案,即在 Azure VM 上设置 PGBouncer。

后续步骤