Snowflake Postgres 连接池

连接池是可重复使用的数据库连接缓存。当客户端发出请求时,系统会从池中为该请求或事务分配可用连接。

反之,若未启用连接池,客户端需反复向数据库建立连接。频繁创建新连接会影响可用性和性能;在 PostgreSQL 中,服务器会“分叉”或创建新进程,不仅消耗可用资源,还会阻塞新连接建立。连接池能有效缓解这些问题,确保应用程序可扩展性。

我需要连接池吗?

当您的应用程序有大量连接时(通常是在客户端池中或通过 Web 服务器的多个线程/进程),连接池特别有用。

您可以在 Snowflake Postgres 实例上运行以下查询,以确定您是否会从连接池中受益:

SELECT count(*),
       state
FROM pg_stat_activity
GROUP BY 2;
Copy
 count |             state
-------+-------------------------------
     7 | active
    69 | idle
    26 | idle in transaction
    11 | idle in transaction (aborted)
(4 rows)

如果您发现空闲连接数远高于活动连接数,则强烈建议启用连接池功能。

使用 PgBouncer 实现连接池

Snowflake Postgres 采用 pgBouncer (http://www.pgbouncer.org/) 进行连接池管理。PgBouncer 默认部署于所有 Snowflake Postgres 实例,通过将原生 Postgres 连接复用至其“虚拟”连接来简化连接管理。默认情况下,Snowflake Postgres 上的 PgBouncer 实例运行于事务池模式。

但要使用 PgBouncer 服务,您需在每个目标数据库中额外安装 snowflake_pooler 扩展。

通过 snowflake_pooler 扩展激活 PgBouncer

snowflake_admin Postgres 用户身份在数据库中执行以下命令安装 snowflake_pooler 扩展:

CREATE EXTENSION snowflake_pooler;
Copy

什么是 snowflake_pooler

snowflake_pooler 是一个简单的扩展,用于创建名为 snowflake_pooler 的用户。该用户拥有访问名为 user_lookup 的单一函数的权限,该函数允许 PgBouncer 对传入连接进行身份验证。这样,当客户端连接到 PgBouncer 时,它可以通过查询 Postgres 的规范用户存储来检查客户端凭据是否有效。

备注

需在每个需要通过 PgBouncer 连接的数据库中单独安装 snowflake_pooler 扩展。若未安装 snowflake_pooler,可能收到如下错误:

failed: FATAL: bouncer config error

要解决该错误,请连接数据库并运行:CREATE EXTENSION snowflake_pooler;

连接 PgBouncer

客户端将使用与连接主 Postgres 数据库相同的连接字符串连接到 PgBouncer,但端口号为 5431 而非常规的 5432:

psql postgres://my_application_user:my_application_password@p.43lmodgbqvdmlpbjirv22dfciu.db.postgresbridge.com:5431/mydb
Copy

只有 没有 超级用户或复制权限的角色可通过 PgBouncer 连接。您可选择使用 application 角色、为团队成员创建的个人用户角色,或自定义用户角色(例如通过 CREATE ROLE (https://www.postgresql.org/docs/current/sql-createrole.html) Postgres命令创建)连接至 PgBouncer。但 snowflake_pooler 创建的 user_lookup 函数将拒绝查询超级用户和复制角色。有关 Snowflake Postgres 中的 Postgres 用户和角色的更多信息,请参阅 Snowflake Postgres 角色

小技巧

在 Postgres 中,“用户”和“角色”这两个术语基本同义。一个细微的区别在于 CREATE USER(相对于 CREATE ROLE)默认包含 LOGIN 属性,例如 CREATE ROLE myuser LOGIN;

连接池模式

PgBouncer 支持三种不同的连接池模式:事务、会话和语句。 每种模式的简要说明如下,更多细节请参阅 PgBouncer 文档 (https://www.pgbouncer.org/features.html)。

事务

Snowflake Postgres 实例默认以事务池模式运行 PgBouncer,这是我们推荐大多数用户采用的模式。

备注

当 PgBouncer 处于事务池模式时,通过 PREPARE 创建并在不同事务中使用 EXECUTE 执行的 SQL 级预编译语句将无法正常工作,因为它们可能运行在不同的服务器连接上。但如果应用程序的 Postgres 驱动程序支持协议级预编译事务,PgBouncer 则支持此功能。 有关 PgBouncer 如何处理此情况的更多详细信息,请参阅其 max_prepared_statements (https://www.pgbouncer.org/config.html) 文档。

要使用 PgBouncer 对协议级预编译语句的支持,必须将 PgBouncer max_prepared_statements 设置 设为大于 0 的值。Snowflake Postgres 的默认值为 250,但您可根据需要设置其他值。

会话

如果您有需要,Snowflake Postgres 支持会话池模式。要使用此池模式,请将 pool_mode 设置 设为 session

语句

语句池模式同样可用。但请注意,多语句事务将引发错误。要使用此池模式,请将 pool_mode 设置 设为 statement

禁用 PgBouncer

从数据库中删除 snowflake_pooler 扩展将实现禁用 PgBouncer 的功能,因为它将无法再进行身份验证:

DROP EXTENSION snowflake_pooler;
Copy
语言: 中文