您可以使用连接池来扩展 Timescale 连接并提高数据库性能。Timescale 使用 pgBouncer 进行连接池。

如果您的数据库需要大量短生命周期的连接,则连接池是提高性能的好方法。例如,Web、无服务器和 IoT 应用程序通常使用基于事件的架构,其中数据的读取或写入数据库的时间非常短。

您的应用程序快速打开和关闭连接,而连接池维护一组与数据库的长期运行连接。这提高了性能,因为连接池预先打开连接,允许应用程序打开许多短生命周期的连接,而数据库打开少量长期运行的连接。

默认情况下,池具有对数据库的身份验证,因此您可以使用已设置的任何自定义用户,而无需进一步配置。如果这是您的首选方法,您可以继续使用 tsdbadmin 用户。但是,您可能需要为某些情况添加自定义配置,例如池用户的 statement_timeout

  1. tsdbadmin 用户身份登录到您的数据库,并创建一个名为 <MY_APP> 的新角色,密码为 <PASSWORD>

    CREATE ROLE <MY_APP> LOGIN PASSWORD '<PASSWORD>';
  2. 将此用户的 statement_timeout 设置更改为 2 秒

    ALTER ROLE my_app SET statement_timeout TO '2s';
  3. 在一个新的终端窗口中,使用新用户 <MY_APP> 在池上连接

    ❯ PGPASSWORD=<NEW_PASSWORD> psql 'postgres://my_app@service.project.tsdb.cloud.timescale.com:30477/tsdb?sslmode=require'

    输出看起来像这样

    psql (15.3 (Homebrew), server 15.4 (Ubuntu 15.4-1.pgdg22.04+1))
    SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)
    Type "help" for help.
  4. 通过以 <MY_APP> 用户身份登录来检查设置是否正确

    SELECT current_user;
    ┌──────────────┐
    current_user
    ├──────────────┤
    │ my_app │
    └──────────────┘
    (1 row)

    检查 <MY_APP> 用户的 statement_timeout 设置是否正确

    tsdb=> show statement_timeout;
    ┌───────────────────┐
    │ statement_timeout │
    ├───────────────────┤
    │ 2s │
    └───────────────────┘
    (1 row)

当您创建连接池时,有两种池类型可供选择:会话或事务。每种池类型都使用不同的模式来处理连接。

会话池从池中分配连接,直到应用程序关闭它们为止,类似于常规 PostgreSQL 连接。当应用程序关闭连接时,它会被发送回池。

事务池连接仅在事务持续期间分配,并在事务结束时将连接释放回池。如果您的应用程序频繁打开和关闭连接,请选择事务池类型。

默认情况下,池同时支持这两种模式。但是,您用于连接应用程序的连接字符串是不同的,具体取决于您想要会话池类型还是事务池类型。当您在 Timescale 控制台中创建连接池时,系统会为您提供您选择的模式的正确连接字符串。

例如,直接连接到数据库的连接字符串看起来有点像这样

postgres://<USERNAME>:<PASSWORD>@service.example.cloud.timescale.com:30133/tsdb?sslmode=require

会话池连接字符串是相同的,但使用不同的端口号,如下所示

postgres://<USERNAME>:<PASSWORD>@service.example.cloud.timescale.com:29303/tsdb?sslmode=require

事务池连接字符串使用与会话池连接相同的端口号,但使用不同的数据库名称,如下所示

postgres://<USERNAME>:<PASSWORD>@service.example.cloud.timescale.com:29303/tsdb_transaction?sslmode=require

请务必检查 Timescale 控制台输出,以获取在您的应用程序中使用的正确连接字符串。

连接池管理器管理与数据库本身和客户端应用程序的连接。它保持与数据库打开的固定数量的连接,同时允许客户端打开和关闭连接。客户端可以从会话池或事务池请求连接。如果池中有空闲连接,则连接池管理器将分配连接。

允许连接到每个池的客户端连接数与为数据库设置的 max_connections 参数成正比。会话池最多可以有 max_connections - 17 个客户端连接,而事务池最多可以有 (max_connections - 17) * 20 个客户端连接。

在未分配给任一池的 17 个预留连接中,默认情况下 12 个预留给超级用户,另外 5 个预留给 Timescale 操作。

例如,如果 max_connections 设置为 500,则您的会话池的最大客户端连接数为 483 (500 - 17),事务池的最大客户端连接数为 9,660 (483 * 20)max_connections 的默认值因您的服务的计算大小而异。

当您创建新服务时,您还可以创建连接池。或者,您可以将连接池添加到 Timescale 门户中的现有服务。

  1. 登录到 Timescale 门户,然后单击您要添加连接池的服务。

  2. 连接信息 部分中,导航到 连接池 选项卡,然后单击 添加连接池

  3. 添加池后,您的池连接详细信息将显示在 连接池 选项卡中。使用此信息连接到您的池。

  4. 默认情况下,您会看到会话池的连接字符串。您可以通过从下拉菜单中选择事务池来更改此设置,以查看事务池的详细信息。有关不同池类型的更多信息,请参阅池类型部分。

    Timescale Service Connection Info section, the Connection Pooler tab, showing information for a transaction pool

如果您不再需要连接池,则可以在 Timescale 门户中将其移除。移除连接池后,请确保您还更新了应用程序以调整其用于连接到服务的端口。

  1. 在 [Timescale Cloud 控制台][tsc-portal] 中,选择您要从中移除连接池的服务。

  2. 选择 操作,然后选择 连接池

  3. 选择要移除的池,然后单击 移除连接池

    确认您要移除连接池。

移除池后,如果您将来重新添加它,它将使用之前使用的相同连接字符串和端口。

  1. 连接到您的数据库。
  2. 切换到 pgbouncer 数据库:\c pgbouncer
  3. 运行 pgBouncer cli 的任何只读命令(例如,SHOW STATS;)。
  4. 有关完整选项,请参阅 pgBouncer 文档

VPC 支持连接池。您添加池或连接到 VPC 的顺序无关紧要。您的连接字符串将自动更新为使用 VPC 连接字符串。

关键词

在此页面上发现问题?报告问题 或 在 GitHub 上编辑此页