使用池管理 Aurora PostgreSQL 连接流失 - Amazon Aurora
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

使用池管理 Aurora PostgreSQL 连接流失

当客户端应用程序经常连接和断开连接,以至于 Aurora PostgreSQL 数据库集群响应时间变慢时,则称集群经历连接流失。与 Aurora PostgreSQL 数据库集群端点的每个新连接都会消耗资源,从而减少可用于处理实际工作负载的资源。我们建议您按照以下讨论的一些最佳实践来管理连接流失问题。

对于初学者来说,您可以缩短连接流失率较高的 Aurora PostgreSQL 数据库集群的响应时间。为此,您可以使用 RDS 代理之类的连接池程序。连接池程序 为客户端提供了一个随时可用连接的缓存。几乎 Aurora PostgreSQL 的所有版本均支持 RDS 代理。有关更多信息,请参阅Amazon RDS Proxy with Aurora PostgreSQL

如果特定 Aurora PostgreSQL 版本不支持 RDS 代理,则可以使用另一个 PostgreSQL 兼容的连接池程序,例如 PgBouncer。要了解更多信息,请参阅 PGBouncer 网站。

要查看您的 Aurora PostgreSQL 数据库集群能否从连接池中受益,您可以查看 postgresql.log 文件以了解连接与断开连接。您还可以使用性能详情来了解您的 Aurora PostgreSQL 数据库集群正在经历的连接流失量。接下来,您将了解有关这两个主题的信息。

记录连接和断开连接

PostgreSQL log_connectionslog_disconnections 参数可以捕获与 Aurora PostgreSQL 数据库集群的写入器实例的连接和断开连接。原定设置情况下,这些参数处于关闭状态。要开启这些参数,请使用自定义参数组并通过将值更改为 1 来开启。有关自定义数据库参数组的更多信息,请参阅使用数据库集群参数组。要检查设置,请使用 psql 和查询连接到 Aurora PostgreSQL 的数据库集群端点,如下所示。

labdb=> SELECT setting FROM pg_settings WHERE name = 'log_connections'; setting --------- on (1 row) labdb=> SELECT setting FROM pg_settings WHERE name = 'log_disconnections'; setting --------- on (1 row)

开启这两个参数后,日志会捕获所有新的连接和断开连接。您将看到每个新的授权连接的用户和数据库。在断开连接时,还记录会话持续时间,如以下示例中所示。

2022-03-07 21:44:53.978 UTC [16641] LOG: connection authorized: user=labtek database=labdb application_name=psql 2022-03-07 21:44:55.718 UTC [16641] LOG: disconnection: session time: 0:00:01.740 user=labtek database=labdb host=[local]

要检查您的应用程序是否存在连接流失,请开启这些参数(如果尚未开启)。然后,通过在实际工作负载和时间段内运行应用程序,在 PostgreSQL 日志中收集数据以进行分析。您可以在 RDS 控制台中查看日志文件。选择您的 Aurora PostgreSQL 数据库集群的写入器实例,然后选择 Logs & events(日志和事件)选项卡。有关更多信息,请参阅查看和列出数据库日志文件

也可以从控制台下载日志文件并使用以下命令序列。此序列查找每分钟授权和断开的连接总数。

grep "connection authorized\|disconnection: session time:" postgresql.log.2022-03-21-16|\ awk {'print $1,$2}' |\ sort |\ uniq -c |\ sort -n -k1

在示例输出中,您可以看到授权连接出现峰值,随后从 16:12:10 开始出现断开连接。

..... ,...... ......... 5 2022-03-21 16:11:55 connection authorized: 9 2022-03-21 16:11:55 disconnection: session 5 2022-03-21 16:11:56 connection authorized: 5 2022-03-21 16:11:57 connection authorized: 5 2022-03-21 16:11:57 disconnection: session 32 2022-03-21 16:12:10 connection authorized: 30 2022-03-21 16:12:10 disconnection: session 31 2022-03-21 16:12:11 connection authorized: 27 2022-03-21 16:12:11 disconnection: session 27 2022-03-21 16:12:12 connection authorized: 27 2022-03-21 16:12:12 disconnection: session 41 2022-03-21 16:12:13 connection authorized: 47 2022-03-21 16:12:13 disconnection: session 46 2022-03-21 16:12:14 connection authorized: 41 2022-03-21 16:12:14 disconnection: session 24 2022-03-21 16:12:15 connection authorized: 29 2022-03-21 16:12:15 disconnection: session 28 2022-03-21 16:12:16 connection authorized: 24 2022-03-21 16:12:16 disconnection: session 40 2022-03-21 16:12:17 connection authorized: 42 2022-03-21 16:12:17 disconnection: session 40 2022-03-21 16:12:18 connection authorized: 40 2022-03-21 16:12:18 disconnection: session ..... ,...... ......... 1 2022-03-21 16:14:10 connection authorized: 1 2022-03-21 16:14:10 disconnection: session 1 2022-03-21 16:15:00 connection authorized: 1 2022-03-21 16:16:00 connection authorized:

有了这些信息,您可以决定您的工作负载是否可以从连接池程序中受益。要进行更详细的分析,您可以使用性能详情。

使用性能详情检测连接流失

您可以使用性能详情评估 Aurora PostgreSQL 兼容版数据库集群 上的连接流失量。在创建 Aurora PostgreSQL 数据库集群时,性能详情的设置在原定设置情况下处于开启状态。如果您在创建数据库集群时清除了此选项,请修改集群以开启该功能。有关更多信息,请参阅修改 Amazon Aurora 数据库集群

在 Aurora PostgreSQL 数据库集群上运行性能详情后,您可以选择要监控的指标。您可以通过控制台中的导航窗格访问性能详情。还可以从 Aurora PostgreSQL 数据库集群的写入器实例的 Monitoring(监控)选项卡访问性能详情,如下图所示。


        从 RDS 控制台和选定的 Aurora PostgreSQL 数据库集群中访问性能详情的图像。

在性能详情控制台中,选择 Manage metrics(管理指标)。要分析您的 Aurora PostgreSQL 数据库集群的连接和断开连接活动,请选择以下指标。这些都是来自 PostgreSQL 的指标。

  • xact_commit – 已提交事务的数量。

  • total_auth_attempts – 每分钟尝试进行身份验证的用户连接的数量。

  • numbackends – 当前连接到数据库的后端数量。


        从 RDS 控制台和选定的 Aurora PostgreSQL 数据库集群中访问性能详情的图像。

要保存设置并显示连接活动,请选择 Update graph(更新图表)。

在下图中,您可以看到对 100 个用户运行 pgbench 所产生的影响。显示连接的线条呈现一致的向上坡度。要了解有关 pgbench 和如何使用它的更多信息,请参阅 PostgreSQL 文档中的 pgbench


              显示需要连接池的性能详情的图像。

该图显示,在没有连接池程序的情况下运行少至 100 个用户的工作负载,可能会导致 total_auth_attempts 数量在整个工作负载处理过程中显著增加。

使用 RDS 代理连接池时,连接尝试次数会在工作负载开始时增加。设置连接池后,平均值下降。事务和后端使用的资源在整个工作负载处理过程中保持一致。


            显示 RDS 代理在连接池方面的优势的性能详情图像。

有关对您的 Aurora PostgreSQL 数据库集群使用性能详情的更多信息,请参阅在 Amazon Aurora 上使用性能详情监控数据库负载。要分析指标,请参阅使用性能详情控制面板分析指标

演示连接池的优势

如前所述,如果您确定您的 Aurora PostgreSQL 数据库集群存在连接流失问题,则可以使用 RDS 代理来提高性能。接下来,您可以了解一个示例,该示例显示了使用和未使用连接池时处理工作负载的差异。该示例使用 pgbench 对事务工作负载进行建模。

与 psql 一样,pgbench 是一个 PostgreSQL 客户端应用程序,您可以从本地客户端计算机上安装和运行该应用程序。也可以从用于管理 Aurora PostgreSQL 数据库集群的 Amazon EC2 实例中安装和运行该应用程序。有关更多信息,请参阅 PostgreSQL 文档中的 pgbench

要逐步完成此示例,您首先要在数据库中创建 pgbench 环境。以下命令是在指定的数据库中初始化 pgbench 表的基本模板。此示例使用原定设置的主用户账户 postgres 进行登录。根据需要,为您的 Aurora PostgreSQL 数据库集群更改此账户。您在集群的写入器实例上的数据库中创建 pgbench 环境。

注意

pgbench 初始化过程删除并重新创建名为 pgbench_accountspgbench_branches|pgbench_historypgbench_tellers 的表。请确保在初始化 pgbench 时为 dbname 选择的数据库不使用这些名称。

pgbench -U postgres -h db-cluster-instance-1.111122223333.aws-region.rds.amazonaws.com -p 5432 -d -i -s 50 dbname

对于 pgbench,请指定以下参数。

-d

在 pgbench 运行时输出调试报告。

-h

指定 Aurora PostgreSQL 数据库集群的写入器实例的端点。

-i

初始化数据库中的 pgbench 环境以进行基准测试。

-p

标识用于数据库连接的端口。Aurora PostgreSQL 的原定设置值通常为 5432 或 5433。

-s

指定用于在表中填充行的缩放因子。原定设置的缩放因子为 1,它在 pgbench_branches 表中生成 1 行、在 pgbench_tellers 表中生成 10 行,而在 pgbench_accounts 表中生成 100000 行。

-U

为 Aurora PostgreSQL 数据库集群的写入器实例指定用户账户。

设置 pgbench 环境后,可以在有或没有连接池的情况下运行基准测试。原定设置测试由每个事务的一系列五个 SELECT、UPDATE 和 INSERT 命令组成,这些命令在指定时间内重复运行。您可以指定缩放因子、客户端数量和其他详细信息来对自己的使用案例建模。

例如,以下命令使用 20 个并发连接(-c 选项)运行基准测试 60 秒(-T 选项,表示时间)。-C 选项使测试每次都使用新连接运行,而不是每个客户端会话运行一次。此设置可以为您指示连接开销。

pgbench -h docs-lab-apg-133-test-instance-1.c3zr2auzukpa.us-west-1.rds.amazonaws.com -U postgres -p 5432 -T 60 -c 20 -C labdb Password:********** pgbench (14.3, server 13.3) starting vacuum...end. transaction type: <builtin: TPC-B (sort of)> scaling factor: 50 query mode: simple number of clients: 20 number of threads: 1 duration: 60 s number of transactions actually processed: 495 latency average = 2430.798 ms average connection time = 120.330 ms tps = 8.227750 (including reconnection times)

在不重复使用连接的情况下,在 Aurora PostgreSQL 数据库集群的写入器实例上运行 pgbench 表明每秒只处理大约 8 个事务。在 1 分钟的测试中,总共有 495 个事务。

如果您重复使用连接,Aurora PostgreSQL 数据库集群对用户数量的响应速度快了将近 20 倍。通过重复使用,总共处理了 9,042 个事务。相比之下,在相同的时间和相同数量的用户连接下处理了 495 个事务。区别在于,在后一种情况中重复使用每个连接。

pgbench -h docs-lab-apg-133-test-instance-1.c3zr2auzukpa.us-west-1.rds.amazonaws.com -U postgres -p 5432 -T 60 -c 20 labdb Password:********* pgbench (14.3, server 13.3) starting vacuum...end. transaction type: <builtin: TPC-B (sort of)> scaling factor: 50 query mode: simple number of clients: 20 number of threads: 1 duration: 60 s number of transactions actually processed: 9042 latency average = 127.880 ms initial connection time = 2311.188 ms tps = 156.396765 (without initial connection time)

此示例向您表明,池连接可以显著缩短响应时间。有关为您的 Aurora PostgreSQL 数据库集群设置 RDS 代理的信息,请参阅将 Amazon RDS 代理用于 Aurora