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

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

Azure Database for PostgreSQL 灵活服务器将 PgBouncer 作为内置连接池解决方案予以提供。 PgBouncer 是一项可选功能,可在每个数据库服务器上启该功能g。 公共访问网络和专用访问网络中的常规用途和内存优化计算层都支持 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 身份验证 (Azure AD)。

启用和配置 PgBouncer

若要启用 PgBouncer,请转到 Azure 门户中的“服务器参数”窗格,搜索“PgBouncer”,并将 pgbouncer.enabled 设置更改为“true”。 无需重启服务器。

你可以使用以下参数配置 PgBouncer 设置。

注意

仅当服务器参数“pgbouncer.enabled”设置为“true”时,“服务器参数”窗格中才会显示以下 PgBouncer 服务器参数列表。 否则,它们会故意隐藏。

参数名称 说明 默认
pgbouncer.default_pool_size 将此参数值设置为每个用户/数据库对的连接数。 50
pgbouncer.ignore_startup_parameters 输入 PgBouncer 可忽略的以逗号分隔的参数列表。 例如,可以让 PgBouncer 忽略 extra_float_digits 参数。 允许使用某些参数,其他所有参数将会引发错误。 该功能是容忍想要在启动数据包中无条件地设置“extra_float_digits=2”的过度热情的 Java Database Connectivity (JDBC) 所必需的。 如果使用的库报告 pq: unsupported startup parameter: extra_float_digits 等错误,请使用此选项。
pgbouncer.max_client_conn 将此参数值设置为要支持的最大 PgBouncer 客户端连接数量。 5000
pgbouncer.max_prepared_statements 当它设置为非零值时,PgBouncer 会跟踪客户端在事务和语句池模式下发送的、协议级命名的、已准备好的语句相关命令。 0
pgbouncer.min_pool_size 如果低于此数量,请将更多服务器连接添加到池。 0
pgbouncer.pool_mode 将此参数值设置为事务池的事务(此为大多数工作负载的建议设置)。 事务
pgbouncer.query_wait_timeout 允许查询等待进行执行的最长时间(秒)。 如果在此期间未将查询分配给服务器,则客户端将断开连接。 120
pgbouncer.server_idle_timeout 如果服务器连接空闲时间超过此秒数,则会将其断开。 如果为 0,则禁用超时。 600
pgbouncer.stats_users 获允在 pgBouncer 控制台上连接和运行只读查询的数据库用户的逗号分隔列表。

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

PgBouncer 的版本

目前,Azure Database for PostgreSQL 灵活服务器中所有受支持的主要版本的引擎(16、15、14、13、12、11)上部署的 PgBouncer 版本为 1.22.1

好处

通过将内置 PgBouncer 功能与 Azure Database for PostgreSQL 灵活服务器配合使用,可以获得以下优势:

  • 简化配置带来的便利:由于 PgBouncer 与 Azure Database for PostgreSQL 灵活服务器集成,无需单独安装或复杂的设置。 你可以直接从服务器参数对其进行配置。

  • 托管服务的可靠性:PgBouncer 提供 Azure 托管服务的优势。 例如,Azure 管理 PgBouncer 的更新。 有了自动更新,就无需手动维护并可确保 PgBouncer 及时引入最新的功能和安全修补程序。

  • 支持各种连接类型:Azure Database for PostgreSQL 灵活服务器中的 PgBouncer 提供对公共和专用连接的支持。 你可以根据其特定要求通过专用网络建立安全连接或连接到外部。

  • 故障转移方案中的高可用性:如果在故障转移期间将备用服务器提升为主角色,则 PgBouncer 将在新升级的备用服务器上无缝重启。 无需对应用程序连接字符串进行任何更改。 此功能可确保持续可用性,并将对应用程序的连接池的中断降到最低。

监视 PgBouncer

指标

Azure Database for PostgreSQL 灵活服务器现在为监控 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 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.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,请执行以下步骤:

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

    psql "host=myPgServer.postgres.database.chinacloudapi.cn port=6432 dbname=postgres user=myUser password=<password> sslmode=require"
    
  2. 在 QA 环境中针对 PgBouncer 测试你的应用程序,以确保不存在任何兼容性问题。 PgBouncer 项目提供兼容性矩阵,因此我们建议对大多数用户使用“事务池”。

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

PgBouncer 的区域冗余高可用性

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

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

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

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

限制

  • PgBouncer 功能目前不支持可突发服务器计算层。 如果将计算层从常规用途或内存优化层更改为可突发层,则你将无法使用内置 PgBouncer 功能。

  • 每当在执行缩放操作、HA 故障转移或重新启动期间重启服务器时,PgBouncer 也会随虚拟机一同重启。 因此,必须重新建立现有连接。

  • 门户不会显示所有 PgBouncer 参数。 启用 PgBouncer 并保存参数后,必须关闭“服务器参数”窗格(例如,选择“概述”),然后返回“服务器参数”窗格。

  • 不能将语句池模式与已准备的语句一起使用。 当前版本的 PgBouncer 在事务模式内添加了对已准备语句的支持。 可以通过 max_prepared_statements 参数启用和配置此支持。 如果将此参数设置为高于默认值 0 的值,将会启用对已准备语句的支持。 此支持仅适用于协议级已准备语句。 对于大多数编程语言,这意味着我们在客户端上使用 libpq 函数“PQprepare”,从而发送 PgBouncer 可以截获的协议级别命令,而不是发出类似于“PREPARE proc AS”的动态 SQL 命令(该命令将会发送 PgBouncer 无法正确解释的文本)。 请参阅 PgBouncer 文档,查看所选池模式的其他限制。

  • 如果将 PgBouncer 部署为一项功能,则它将成为潜在的单一故障点。 如果 PgBouncer 功能出现故障,可能会中断整个数据库连接池,从而导致应用程序停机。 若要缓解单一故障点,可以在负载均衡器后面设置多个 PgBouncer 实例,以在 Azure VM 上实现高可用性。

  • 使用 AAD 身份验证的令牌大小限制 - 由于令牌大小限制,具有大量组成员身份的用户将无法通过 PgBouncer 进行连接。 应用程序、服务和用户的小组数量较少时可以正常工作。

  • PgBouncer 是一个非常轻型的应用程序,它利用的是单线程体系结构。 此设计非常适合大多数应用程序工作负载。 但在创建大量生存期较短的连接的应用程序中,此设计可能会影响 pgBouncer 性能,并限制缩放应用程序的能力。 你可能需要尝试以下任一方法:

    • 在 Azure VM 上的多个 PgBouncer 实例之间分配连接负载。
    • 考虑替代解决方案,包括 Azure VM 上的 PgCat 等多线程解决方案。

重要

内置 PgBouncer 功能的参数 pgbouncer.client_tls_sslmode 在 Azure Database for PostgreSQL 灵活服务器中已弃用。

当通过将“require_secure_transport”服务器参数设置为“ON”来强制使用 TLS\SSL 连接到 Azure Database for PostgreSQL 灵活服务器时,将自动强制使用 TLS/SSL 连接到内置 PgBouncer 功能。 默认情况下,在创建新的 Azure Database for PostgreSQL 灵活服务器实例并启用内置 PgBouncer 功能时,将启用此设置。 有关详细信息,请参阅使用专用连接的 Azure Database for PostgreSQL - 灵活服务器的网络概述

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

后续步骤