

# RDS 代理连接注意事项
<a name="rds-proxy-connections"></a>

## 配置连接设置
<a name="rds-proxy-connection-pooling-tuning"></a>

若要调整 RDS Proxy 的连接池，您可以修改以下设置：
+ [IdleClientTimeout](#rds-proxy-connection-pooling-tuning.idleclienttimeout)
+ [MaxConnectionsPercent](#rds-proxy-connection-pooling-tuning.maxconnectionspercent)
+ [MaxIdleConnectionsPercent](#rds-proxy-connection-pooling-tuning.maxidleconnectionspercent)
+ [ConnectionBorrowTimeout](#rds-proxy-connection-pooling-tuning.connectionborrowtimeout)

### IdleClientTimeout
<a name="rds-proxy-connection-pooling-tuning.idleclienttimeout"></a>

您可以指定在代理关闭客户端连接之前，客户端连接可以处于空闲状态的时长。默认值为 1800 秒（30 分钟）。

如果应用程序未在上一请求完成后的指定时间内提交新请求，则将客户端连接视为*空闲*。底层数据库连接保持打开状态并返回到连接池。因此，它可以重复用于新的客户端连接。如果希望代理主动删除过时的连接，则降低空闲客户端连接超时。如果工作负载与代理建立频繁的连接，则增加空闲客户端连接超时，以便节省建立连接的成本。

此设置由 RDS 控制台中的 **Idle client connection timeout**（空闲客户端连接超时）字段以及 AWS CLI 和 API 中的 `IdleClientTimeout` 设置表示。要了解如何在 RDS 控制台中更改 **Idle client connection timeout**（空闲客户端连接超时）字段的值，请参阅 [AWS 管理控制台](rds-proxy-modifying-proxy.md#rds-proxy-modifying-proxy.console)。要了解如何更改 `IdleClientTimeout` 设置的值，请参阅 CLI 命令 [modify-db-proxy](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-proxy.html) 或 API 操作 [ModifyDBProxy](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_ModifyDBProxy.html)。

### MaxConnectionsPercent
<a name="rds-proxy-connection-pooling-tuning.maxconnectionspercent"></a>

您可以限制 RDS 代理可与目标数据库建立的连接数。请将限制指定为数据库可用的最大连接数的百分比。此设置由 RDS 控制台中的 **Connection pool maximum connections**（连接池最大连接数）字段以及 AWS CLI 和 API 中的 `MaxConnectionsPercent` 设置表示。

对于目标组使用的 Aurora 数据库集群，`MaxConnectionsPercent` 值以 `max_connections` 设置的百分比表示。代理不会提前创建所有连接。此设置允许代理在工作负载需要时建立这些连接。

例如，对于 `max_connections` 设置为 1000 且 `MaxConnectionsPercent` 设置为 95 的注册数据库目标，RDS 代理将 950 个连接设置为与该数据库目标的并行连接的上限。

工作负载达到允许的最大数据库连接数的一个常见副作用是总体查询延迟增加，同时 `DatabaseConnectionsBorrowLatency` 指标也会增加。您可以通过比较 `DatabaseConnections` 和 `MaxDatabaseConnectionsAllowed` 指标来监控当前使用的数据库连接数和允许的数据库连接总数。

设置此参数时，请注意以下最佳实践：
+ 为工作负载模式的变化留出足够的连接余量。建议将该参数设置为比最近监控的最大使用量高出至少 30%。由于 RDS 代理在多个节点之间重新分配数据库连接限额，因此，内部容量更改可能需要至少 30% 的余量来增加连接，以避免增加借用延迟。
+ RDS 代理保留一定数量的连接用于主动监控，以支持快速失效转移、流量路由和内部操作。`MaxDatabaseConnectionsAllowed` 指标不包括这些预留连接。该指标表示可用于为工作负载提供服务的连接数，可以低于从 `MaxConnectionsPercent` 设置得出的值。

  建议的最小 `MaxConnectionsPercent` 值如下：
  + db.t3.small：100
  + db.t3.medium：55
  + db.t3.large：35
  + db.r3.large 或更大：20

  如果在 RDS 代理中注册了多个目标实例，例如带有读取器节点的 Aurora 集群，请根据最小的注册实例设置最小值。

要了解如何在 RDS 控制台中更改 **Connection pool maximum connections**（连接池最大连接数）字段的值，请参阅 [AWS 管理控制台](rds-proxy-modifying-proxy.md#rds-proxy-modifying-proxy.console)。要了解如何更改 `MaxConnectionsPercent` 设置的值，请参阅 CLI 命令 [modify-db-proxy-target-group](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-proxy-target-group.html) 或 API 操作 [ModifyDBProxyTargetGroup](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_ModifyDBProxyTargetGroup.html)。

**重要**  
如果数据库集群是开启写入转发的全局数据库的一部分，则按照分配给写入转发的限额来减小代理的 `MaxConnectionsPercent` 值。写入转发限额在数据库集群参数 `aurora_fwd_writer_max_connections_pct` 中设置。有关写入转发的信息，请参阅 [在 Amazon Aurora Global Database 中使用写入转发](aurora-global-database-write-forwarding.md)。

 有关数据库连接限制的更多信息，请参阅 [Aurora MySQL 数据库实例的最大连接数](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Managing.Performance.html#AuroraMySQL.Managing.MaxConnections)和 [Aurora PostgreSQL 数据库实例的最大连接数](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/AuroraPostgreSQL.Managing.html#AuroraPostgreSQL.Managing.MaxConnections)。

### MaxIdleConnectionsPercent
<a name="rds-proxy-connection-pooling-tuning.maxidleconnectionspercent"></a>

您可以控制 RDS Proxy 可在连接池中保留的空闲数据库连接数。默认情况下，如果连接五分钟内没有活动，RDS 代理会将其池中的数据库连接视为*空闲*。

对于 RDS 数据库实例目标组，`MaxIdleConnectionsPercent` 值以 `max_connections` 设置的百分比表示。原定设置值为 `MaxConnectionsPercent` 的 50%，上限为 `MaxConnectionsPercent` 的值。例如，如果 `MaxConnectionsPercent` 为 80，则 `MaxIdleConnectionsPercent` 的默认值为 40。

对于高值，代理会将较高百分比的空闲数据库连接保持在打开状态。对于低值，代理会关闭较高百分比的空闲数据库连接。如果您的工作负载不可预测，请考虑为 `MaxIdleConnectionsPercent` 设置较高的值。这样做意味着 RDS 代理可以在不打开大量新数据库连接的情况下适应活动的突增。

此设置由 AWS CLI 和 API 中 `DBProxyTargetGroup` 的 `MaxIdleConnectionsPercent` 设置表示。要了解如何更改 `MaxIdleConnectionsPercent` 设置的值，请参阅 CLI 命令 [modify-db-proxy-target-group](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-proxy-target-group.html) 或 API 操作 [ModifyDBProxyTargetGroup](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_ModifyDBProxyTargetGroup.html)。

 有关数据库连接限制的更多信息，请参阅 [Aurora MySQL 数据库实例的最大连接数](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Managing.Performance.html#AuroraMySQL.Managing.MaxConnections)和 [Aurora PostgreSQL 数据库实例的最大连接数](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/AuroraPostgreSQL.Managing.html#AuroraPostgreSQL.Managing.MaxConnections)。

### ConnectionBorrowTimeout
<a name="rds-proxy-connection-pooling-tuning.connectionborrowtimeout"></a>

您可以选择 RDS Proxy 在返回超时错误之前等待连接池中数据库连接可用的时间。默认值为 120 秒。此设置适用于连接数达到最大而导致连接池中没有可用连接的情况。当没有适当的数据库实例可用于处理请求时，例如当失效转移操作正在进行时，它也适用。通过使用此设置，您可以为应用程序设置最佳等待期，而无需更改应用程序代码中的查询超时。

此设置由 RDS Proxy 控制台中的 **Connection borrow timeout**（连接借用超时）字段、`ConnectionBorrowTimeout` 中 `DBProxyTargetGroup` 的 AWS CLI 设置或 API 表示。要了解如何在 RDS 控制台中更改 **Connection borrow timeout**（连接借用超时）字段的值，请参阅 [AWS 管理控制台](rds-proxy-modifying-proxy.md#rds-proxy-modifying-proxy.console)。要了解如何更改 `ConnectionBorrowTimeout` 设置的值，请参阅 CLI 命令 [modify-db-proxy-target-group](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-proxy-target-group.html) 或 API 操作 [ModifyDBProxyTargetGroup](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_ModifyDBProxyTargetGroup.html)。

## 客户端和数据库连接
<a name="rds-proxy-connection-life"></a>

从您的应用程序到 RDS 代理的连接称为客户端连接。从代理到数据库的连接则称为数据库连接。使用 RDS 代理时，客户端连接在代理处终止，而数据库连接则在 RDS 代理中进行管理。

应用程序端连接池可以减少在应用程序与 RDS 代理之间重复建立连接。

在实现应用程序端连接池之前，请考虑以下配置方面：
+ 客户端连接最长期限：RDS 代理强制规定客户端连接的最长期限为 24 小时。此值不可配置。将池配置为最长连接期限小于 24 小时，以免客户端连接意外中断。
+ 客户端连接空闲超时：RDS 代理强制规定客户端连接的最长空闲时间。为池配置的空闲连接超时值要小于 RDS 代理的客户端连接空闲超时设置，以免连接意外中断。

在应用程序端连接池中配置的最大客户端连接数不必限制为 RDS 代理的 **max\$1connections** 设置。

客户端连接池可延长客户端连接期限。如果您的连接遇到固定问题，则池化客户端连接可能会降低多路复用效率。已固定但在应用程序端连接池中处于空闲状态的客户端连接会继续保持数据库连接，并防止数据库连接被其它客户端连接重复使用。查看您的代理日志，以检查您的连接是否遇到固定问题。

**注意**  
当数据库连接不再使用时，RDS 代理会在 24 小时后的某个时间关闭数据库连接。无论最大空闲连接设置的值如何，代理都会执行此操作。