Important
Lakebase Autoscaling 是 Lakebase 的最新版本更新,具有自动缩放计算、缩放到零、分支和即时还原功能。 有关支持的区域,请参阅 区域可用性。 如果你是 Lakebase 预配的用户,请参阅 Lakebase 预配。
Lakebase 包括一个内置的 PgBouncer 连接池,用于维护服务器连接池,并在多个客户端连接之间共享它们。 连接池支持多达 10,000 个并发连接,非常适用于无服务器函数、Web API 和其他需要打开大量短期连接的应用程序。
连接池需要本地 Postgres 密码身份验证。 它不适用于 OAuth 或 Azure Databricks 标识角色。
连接池的工作原理
每个 Postgres 连接都会消耗服务器资源,因为 Postgres 为每个客户端创建单独的进程。 打开许多生存期较短的连接的应用程序(如 Web API 和无服务器函数)可以快速耗尽服务器的连接限制。
连接池器位于应用程序和 Postgres 之间。 客户端连接到池器,池器将查询转发到实际服务器连接的较小池。 事务完成后,连接池管理器会将服务器连接返回给连接池,使其可以供下一个客户端使用。
Lakebase 在事务模式下运行 PgBouncer。 在事务模式下,服务器连接将在单个事务的持续时间内维持,然后返回到连接池。 这允许许多客户端共享一组有限的服务器连接。
事务模式可提高连接效率,但会限制需要持久服务器连接的某些 Postgres 功能。 请参阅 事务模式限制。
连接池
PgBouncer 为每个数据库和用户组合创建单独的池。 连接到同一数据库的两个用户将获得各自独立的连接池。 每个池的大小约为计算直接连接限制的 90%。
当池中的所有连接都正在使用时,新的客户端请求在队列中等待。 如果服务器连接在 2 分钟内不可用,则客户端会收到超时错误。
连接限制
三个限制管理连接池:
| 限制 | 价值 | 它控制的内容 |
|---|---|---|
客户端连接 (max_client_conn) |
10,000 | 从应用程序到 PgBouncer 的最大连接数 |
池大小 (default_pool_size) |
约 90% max_connections |
每个(用户、数据库)对的活动服务器连接数 |
直接连接 (max_connections) |
因计算大小而异 | 最大直接 Postgres 连接数 |
直接连接限制取决于计算大小。 例如,8 CU 计算支持 1,678 个直接连接,16 CU 计算支持 3,357。 有关完整列表,请参阅 计算规范。
连接池功能使您的应用程序能够支持的并发用户数量远远超过直接连接限制所允许的。
先决条件
- 您的 Lakebase Autoscaling 项目必须处于活动状态。
- 项目中必须具有 PostgreSQL 的原生密码角色。 有关说明,请参阅 创建原生 Postgres 密码角色。
- 若要使用只读池器,必须具有允许 访问已启用只读计算实例的 高可用性终结点。 请参阅 高可用性。
启用连接池
- 在 Lakebase 应用中,转到项目并单击“ 连接”。
- 选择要连接的分支和计算资源。
- 从“角色”下拉列表中,选择本地 Postgres 密码角色。 仅当选择密码角色时,“连接池”切换才可见。 它对于 OAuth 和 Azure Databricks 标识角色隐藏。
- 打开 连接池。
- 复制连接字符串,并将其用于您的应用程序中。
连接字符串格式
池器连接字符串使用与直接数据库连接不同的主机名:
| 类型 | 主机名格式 | 何时使用 |
|---|---|---|
| 读写池器 | <endpoint-id>-pooler.<region>.<cloud>.databricks.com |
通过池器路由的所有写入和读取流量 |
| 只读池器 | <endpoint-id>-ro-pooler.<region>.<cloud>.databricks.com |
仅读取流量。 需要启用读取访问权限的高可用性终结点。 |
这两种池器类型都使用端口 5432。
注释
直接从 Lakebase App 中的 Connect 对话框中复制连接池连接字符串,以获取端点、区域和云的正确主机名。
事务模式限制
使用连接池器时,以下 Postgres 功能不可用:
SQL 级准备语句:在事务模式下,不支持
PREPARE和DEALLOCATE语句。 驱动级准备语句(由 psycopg2、node-postgres、JDBC 和类似库内部使用)在 PgBouncer 的协议级支持下正常工作。 对于 JDBC,如果看到与已准备语句相关的错误,则设置为prepareThreshold=0禁用命名服务器端准备语句缓存。会话级别设置:
SET命令不会跨事务保留,因为每个事务都可能使用不同的服务器连接。 例如:BEGIN; SET search_path TO myschema; SELECT * FROM mytable; -- works in this transaction COMMIT; -- connection returns to pool after COMMIT SELECT * FROM mytable; -- ERROR: relation "mytable" does not exist若要永久应用设置,请改用
ALTER ROLE:ALTER ROLE myrole SET search_path TO myschema, public;会话保留的临时表:跨事务保留的临时表不可用。 连接返回到池中后,可能会在下一个事务中被分配给不同的客户端。
WITH HOLD游标:使用WITH HOLD声明的游标需要持久连接,因此不被支持。公告锁:PgBouncer 不支持咨询锁。 建议锁需要持久的服务器连接,而在事务模式下,这种连接不可用。
LISTEN/NOTIFY:不支持。 对需要发布/子消息传送的应用程序使用直接(非共用)连接。pg_dump和架构迁移:请对依赖于会话级别状态的架构迁移、pg_dump和其他工具使用直接连接。
注释
对于需要会话级 Postgres 功能的应用程序,请使用从 Connect 对话框获取的直接连接字符串,而不需要启用 连接池选项。
后续步骤
- 连接字符串:直接连接的连接字符串格式参考。 请参阅 连接字符串。
- 创建 Postgres 角色:如何创建连接池所需的 Postgres 本机密码角色。 请参阅 “创建 Postgres 角色”。
- 关于身份验证:OAuth 和密码身份验证方法的比较。 请参阅 “关于身份验证”。