

# 适用于 Aurora 的Amazon RDS 代理
<a name="rds-proxy"></a>

通过使用 Amazon RDS 代理，您可以允许您的应用程序池化和共享数据库连接，以提高其扩展能力。RDS 代理通过在保留应用程序连接的同时自动连接到备用数据库实例，使应用程序能够更好地抵御数据库故障。通过使用 RDS 代理，您可以对连接到代理的客户端强制执行 AWS Identity and Access Management（IAM）身份验证，代理可以使用 IAM 数据库身份验证或存储在 AWS Secrets Manager 中的凭证连接到数据库。

![\[关于应用程序如何连接到 RDS 代理的概述\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/AuroraUserGuide/images/Proxy-Overview.png)


 使用 RDS 代理，您可以处理不可预测的数据库流量突增。否则，这些突增情况可能会由于超额订阅连接或快速创建新连接而导致问题。RDS 代理建立数据库连接池，并重用该池中的连接。这种方法可避免每次打开新数据库连接所产生的内存和 CPU 开销。要防止数据库超额订阅，您可以控制创建的数据库连接数。

 RDS 代理对无法立即从连接池提供服务的应用程序连接进行排队或限制。尽管延迟可能会增加，但您的应用程序可以继续扩展，而不会导致数据库突然出现故障或不堪重负。如果连接请求超出您指定的限制，则 RDS 代理会拒绝应用程序连接（即，减轻负载）。与此同时，它为 RDS 可通过可用容量提供服务的负载维护可预测的性能。

![\[关于应用程序如何连接到 RDS 代理以及所涉及的连接类型的详细概述。\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/AuroraUserGuide/images/Proxy-detail.png)


 您可以减少处理凭证的开销，并为每个新连接建立安全连接。RDS 代理可以代表数据库处理其中的一些工作。

 RDS 代理与它支持的引擎版本完全兼容。您可以在不更改代码的情况下为大多数应用程序启用 RDS 代理。有关支持的引擎版本列表，请参阅[支持 Amazon RDS 代理的区域和 Aurora 数据库引擎](Concepts.Aurora_Fea_Regions_DB-eng.Feature.RDS_Proxy.md)。

**Topics**
+ [区域和版本可用性](#rds-proxy.RegionVersionAvailability)
+ [RDS 代理的配额和限制](#rds-proxy.limitations)
+ [规划在哪里使用 RDS Proxy](rds-proxy-planning.md)
+ [RDS 代理概念和术语](rds-proxy.howitworks.md)
+ [开始使用 RDS 代理](rds-proxy-setup.md)
+ [管理 RDS 代理](rds-proxy-managing.md)
+ [使用 Amazon RDS Proxy 终端节点](rds-proxy-endpoints.md)
+ [使用 Amazon CloudWatch 监控 RDS Proxy 指标](rds-proxy.monitoring.md)
+ [使用 RDS 代理事件](rds-proxy.events.md)
+ [RDS Proxy 命令行示例](rds-proxy.examples.md)
+ [RDS 代理故障排除](rds-proxy.troubleshooting.md)
+ [将 RDS Proxy 与 AWS CloudFormation 一起使用](rds-proxy-cfn.md)
+ [在 Aurora Global Database 中使用 RDS 代理](rds-proxy-gdb.md)

## 区域和版本可用性
<a name="rds-proxy.RegionVersionAvailability"></a>

 有关给定 AWS 区域中的 RDS 代理的数据库引擎版本支持和可用性的信息，请参阅 [支持 Amazon RDS 代理的区域和 Aurora 数据库引擎](Concepts.Aurora_Fea_Regions_DB-eng.Feature.RDS_Proxy.md)。

## RDS 代理的配额和限制
<a name="rds-proxy.limitations"></a>

 以下配额和限制适用于 RDS 代理：
+  每个 AWS 账户 ID 限制为 20 个代理。如果您的应用程序需要更多代理，请通过 AWS 管理控制台中的**服务配额**页面申请增加代理。在**服务配额**页面中，选择 **Amazon Relational Database Service（Amazon RDS）**，然后找到**代理**以申请增加配额。AWS 可以自动增加您的配额，或者等待 支持 审核您的申请。
+ 每个代理最多可以关联 200 个 Secrets Manager 密钥，因此在使用密钥时，连接数量最多限制为 200 个不同的用户账户。
+  每个代理都有一个默认端点，该端点仅在从代理的已配置子网中选择的两个可用区中进行预调配。如果配置了两个以上可用区中的子网，则将选择任意两个可用区。
+  可以为每个代理添加最多 20 个额外的代理端点。这些额外的端点将在其创建期间指定的所有可用区中进行预调配。您可以创建、查看、修改和删除这些端点。
+  在 Aurora 集群中，使用默认代理端点的所有连接都由 Aurora 写入器实例处理。要对读取密集型工作负载执行负载均衡，您可以为代理创建只读端点。该端点会将连接传递到集群的读取器端点。这样，您的代理连接就可以利用 Aurora 读取可扩展性。有关更多信息，请参阅“[代理终端节点概述](rds-proxy-endpoints.md#rds-proxy-endpoints-overview)”。
+ 您可以将 RDS 代理用于 Aurora Serverless v2 集群，但不能用于 Aurora Serverless v1 集群。
+ 您的 RDS 代理必须与数据库位于同一 Virtual Private Cloud (VPC) 中。代理无法公开访问，但数据库可以。例如，如果在本地主机上进行数据库原型设计，则无法连接到代理，除非设置必要的网络要求来允许连接到代理。这是因为您的本地主机不在代理的 VPC 范围内。
**注意**  
对于 Aurora 数据库集群，您可以启用跨 VPC 访问。为此，请为代理创建额外的端点，并为该端点指定其他 VPC、子网和安全组。有关更多信息，请参阅 [访问 VPC 中的 Aurora 数据库](rds-proxy-endpoints.md#rds-proxy-cross-vpc)。
+  您不能将 RDS 代理用于其租户设置为 `dedicated` 的 VPC。
+  如果 VPC 具有启用了 `Enforce Mode` 的加密控制，则您不能在其中使用 RDS 代理。
+ 对于 IPv6 端点网络类型，请将您的 VPC 和子网配置为仅支持 IPv6。对于 IPv4 和 IPv6 目标连接网络类型，请将您的 VPC 和子网配置为支持双栈模式。
+ 如果您将 RDS 代理与启用了 IAM 身份验证的 Aurora 数据库集群结合使用，则代理可使用 IAM 身份验证或存储在 Secrets Manager 中的凭证连接到数据库。连接到代理的客户端必须使用 IAM 凭证进行身份验证。有关详细的配置说明，请参阅[设置 RDS 代理的数据库凭证](rds-proxy-secrets-arns.md)和[为 RDS 代理配置 IAM 身份验证](rds-proxy-iam-setup.md)
+  使用 SSL 主机名验证时，不能将 RDS 代理与自定义 DNS 一起使用。
+  每个代理都可以与单个目标数据库集群相关联。不过，您可以将多个代理与同一个数据库集群关联。
+ 文本大小大于 16 KB 的任何语句都会导致代理将会话固定到当前连接。
+ 某些区域在创建代理时需要考虑可用区（AZ）限制。美国东部（弗吉尼亚州北部）区域在 `use1-az3` 可用区中不支持 RDS 代理。美国西部（加利福尼亚北部）区域在 `usw1-az2` 可用区中不支持 RDS 代理。如果在创建代理时选择子网，请确保不要在上述可用区中选择子网。
+ 目前，RDS 代理不支持任何全局条件上下文键。

  有关全局条件上下文键的更多信息，请参阅《IAM 用户指南**》中的 [AWS 全局条件上下文键](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html)。
+ 不能将 RDS 代理与 RDS Custom for SQL Server 一起使用。
+ 要将任何数据库参数组修改反映到您的代理，需要重启实例，即使您选择立即应用更改也不例外。对于集群级参数，需要在集群范围内重启。
+ 当注册代理目标时，您的代理会自动创建 `rdsproxyadmin` 数据库用户。这是受保护的用户，对于代理功能至关重要。您应该避免以任何身份篡改 `rdsproxyadmin` 用户。删除或修改 `rdsproxyadmin` 用户或其权限可能导致应用程序完全无法使用代理。

有关每个数据库引擎的更多信息，请参阅下面几节：
+ [Aurora MySQL 的额外限制](#rds-proxy.limitations-my)
+ [Aurora PostgreSQL 的额外限制](#rds-proxy.limitations-pg)

### Aurora MySQL 的额外限制
<a name="rds-proxy.limitations-my"></a>

 以下附加限制应用于适用于 Aurora MySQL 数据库的 RDS 代理：
+ RDS 代理对 `caching_sha2_password` 身份验证的支持需要安全（TLS）连接。
+ 对 `caching_sha2_password` 的 RDS 代理支持已知与某些 go-sql 驱动程序版本存在兼容性问题。
+ 使用 MySQL 8.4 C 驱动程序时，如果预编译语句中的参数计数超过占位符计数，`mysql_stmt_bind_named_param` API 可能会形成格式错误的数据包。这会导致错误的响应。有关更多信息，请参阅 [MySQL 错误报告](https://bugs.mysql.com/bug.php?id=116860&thanks=4)。
+ 目前，所有代理均在端口 3306 上侦听 MySQL。代理仍使用您在数据库设置中指定的端口连接到您的数据库。
+  不能将 RDS 代理与 EC2 实例中自管理的 MySQL 数据库一起使用。
+  您不能将 RDS 代理与数据库参数组中的 `read_only` 参数设置为 `1` 的 RDS for MySQL 数据库实例一起使用。
+ RDS 代理不支持 MySQL 压缩模式。例如，它不支持 `mysql` 命令的 `--compress` 或 `-C` 选项使用的压缩。
+ 当 RDS 代理重用相同的数据库连接运行其他查询时，处理 `GET DIAGNOSTIC` 命令的数据库连接可能会返回不准确的信息。当 RDS 代理多路复用数据库连接时，可能会发生这种情况。
+ 某些 SQL 语句和函数（如 `SET LOCAL`）可以更改连接状态而不会引起固定。有关最新的固定行为，请参阅 [避免固定 RDS 代理](rds-proxy-pinning.md)。
+ 不支持在多语句查询中使用 `ROW_COUNT()` 函数。
+ RDS 代理不支持无法在一个 TLS 记录中处理多条响应消息的客户端应用程序。
+ RDS 代理不支持 MySQL 双密码。
+ 当您在 RDS 数据库参数组中配置 `init_connect` 参数来设置会话状态变量时，RDS 代理可能无法按预期工作。相反，请将代理的初始化查询设置为在使用代理连接到数据库时运行会话初始化语句。

**重要**  
 对于与 MySQL 数据库关联的代理，请勿在初始化查询中将配置参数 `sql_auto_is_null` 设置为 `true` 或非零值。否则，可能会导致不正确的应用程序行为。

### Aurora PostgreSQL 的额外限制
<a name="rds-proxy.limitations-pg"></a>

 以下附加限制应用于适用于 Aurora PostgreSQL 数据库的 RDS 代理：
+ RDS 代理不支持 PostgreSQL 的会话固定筛选条件。
+  目前，所有代理均在端口 5432 上侦听 PostgreSQL。
+ 对于 PostgreSQL，RDS 代理目前不支持通过发出 `CancelRequest` 来取消来自客户端的查询。例如，使用 Ctrl\$1C 取消交互式 psql 会话中长时间运行的查询时，就会出现这种情况。
+  PostgreSQL 函数 [lastval](https://www.postgresql.org/docs/current/functions-sequence.html) 的结果并不总是准确的。作为解决方法，请将 [INSERT](https://www.postgresql.org/docs/current/sql-insert.html) 语句与 `RETURNING` 子句一起使用。
+ RDS 代理目前不支持流式复制模式。
+ 默认 `postgres` 数据库必须存在于 RDS for PostgreSQL 实例上，RDS 代理才能正常运行。即使您的应用程序使用不同的数据库，也不要删除此数据库。
+ 如果您使用 `ALTER ROLE` 通过 `SET ROLE` 更改用户角色，但后续以该用户身份连接到代理时若遇到固定问题，则这些后续连接可能不会使用此角色设置。为防止出现这种情况，在使用代理时，请在代理的初始化查询中使用 `SET ROLE`。有关更多信息，请参阅 [为 Amazon Aurora 创建代理](rds-proxy-creating.md)中的**初始化查询**。

**重要**  
对于适用于 PostgreSQL 数据库的现有代理，如果您将数据库身份验证修改为仅使用 `SCRAM`，代理将在长达 60 秒的时间内不可用。要避免此问题，请执行以下操作之一：  
确保数据库同时允许 `SCRAM` 和 `MD5` 身份验证。
要仅使用 `SCRAM` 身份验证，请创建一个新代理，将应用程序流量迁移到新代理，然后删除先前与数据库关联的代理。