

# 使用池管理 Aurora PostgreSQL 连接流失
<a name="AuroraPostgreSQL.BestPractices.connection_pooling"></a>

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

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

如果特定 Aurora PostgreSQL 版本不支持 RDS 代理，则可以使用另一个 PostgreSQL 兼容的连接池程序，例如 PgBouncer。要了解更多信息，请参阅 [PGBouncer](https://www.pgbouncer.org/) 网站。

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

## 记录连接和断开连接
<a name="AuroraPostgreSQL.BestPractices.connection_pooling.log_connections"></a>

PostgreSQL `log_connections` 和 `log_disconnections` 参数可以捕获与 Aurora PostgreSQL 数据库集群的写入器实例的连接和断开连接。原定设置情况下，这些参数处于关闭状态。要开启这些参数，请使用自定义参数组并通过将值更改为 1 来开启。有关自定义数据库参数组的更多信息，请参阅[Amazon Aurora 数据库集群的数据库集群参数组](USER_WorkingWithDBClusterParamGroups.md)。要检查设置，请使用 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**（日志和事件）选项卡。有关更多信息，请参阅 [查看和列出数据库日志文件](USER_LogAccess.Procedural.Viewing.md)。

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

```
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:
```

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

## 使用性能详情检测连接流失
<a name="AuroraPostgreSQL.BestPractices.connection_pooling.detect-churn"></a>

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

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

![\[从 RDS 控制台和选定的 Aurora PostgreSQL 数据库集群中访问性能详情的图像。\]](http://docs.amazonaws.cn/AmazonRDS/latest/AuroraUserGuide/images/postgres_connection_pooling_PI_1.png)


在性能详情控制台中，选择 **Manage metrics**（管理指标）。要分析您的 Aurora PostgreSQL 数据库集群的连接和断开连接活动，请选择以下指标。这些都是来自 PostgreSQL 的指标。
+ `xact_commit` – 已提交事务的数量。
+ `total_auth_attempts` – 每分钟尝试进行身份验证的用户连接的数量。
+ `numbackends` – 当前连接到数据库的后端数量。

![\[从 RDS 控制台和选定的 Aurora PostgreSQL 数据库集群中访问性能详情的图像。\]](http://docs.amazonaws.cn/AmazonRDS/latest/AuroraUserGuide/images/postgres_connection_churn_PI_4.png)


要保存设置并显示连接活动，请选择 **Update graph**（更新图表）。

在下图中，您可以看到对 100 个用户运行 pgbench 所产生的影响。显示连接的线条呈现一致的向上坡度。要了解有关 pgbench 和如何使用它的更多信息，请参阅 PostgreSQL 文档中的 [pgbench](https://www.postgresql.org/docs/current/pgbench.html)。

![\[显示需要连接池的性能详情的图像。\]](http://docs.amazonaws.cn/AmazonRDS/latest/AuroraUserGuide/images/postgres_connection_pooling_PI_2.png)


该图显示，在没有连接池程序的情况下运行少至 100 个用户的工作负载，可能会导致 `total_auth_attempts` 数量在整个工作负载处理过程中显著增加。请注意，最好让 `total_auth_attempts` 保持尽可能接近零。

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

![\[显示 RDS 代理在连接池方面的优势的性能详情图像。\]](http://docs.amazonaws.cn/AmazonRDS/latest/AuroraUserGuide/images/postgres_connection_pooling_PI_3.png)


有关对您的 Aurora PostgreSQL 数据库集群使用性能详情的更多信息，请参阅[在 Amazon Aurora 上使用性能详情监控数据库负载](USER_PerfInsights.md)。要分析指标，请参阅[使用 Performance Insights 控制面板分析指标](USER_PerfInsights.UsingDashboard.md)。

## 演示连接池的优势
<a name="AuroraPostgreSQL.BestPractices.connection_pooling.demo-benefit-pooling"></a>

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

与 psql 一样，pgbench 是一个 PostgreSQL 客户端应用程序，您可以从本地客户端计算机上安装和运行该应用程序。也可以从用于管理 Aurora PostgreSQL 数据库集群的 Amazon EC2 实例中安装和运行该应用程序。有关更多信息，请参阅 PostgreSQL 文档中的 [pgbench](https://www.postgresql.org/docs/current/pgbench.html)。

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

**注意**  
pgbench 初始化过程删除并重新创建名为 `pgbench_accounts`、`pgbench_branches`\$1`pgbench_history` 和 `pgbench_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 代理的信息，请参阅[适用于 Aurora 的Amazon RDS 代理](rds-proxy.md)。