的 Amazon RDS 代理
通过使用 Amazon RDS 代理,您可以允许您的应用程序池化和共享数据库连接,以提高其扩展能力。RDS 代理通过在保留应用程序连接的同时自动连接到备用数据库实例,使应用程序能够更好地抵御数据库故障。使用 RDS 代理还使您能够为数据库强制执行 AWS Identity and Access Management (IAM) 身份验证,并将凭证安全地存储在 AWS Secrets Manager。
使用 RDS 代理,您可以处理不可预测的数据库流量突增。否则,这些突增情况可能会由于超额订阅连接或快速创建新连接而导致问题。RDS 代理建立数据库连接池,并重用该池中的连接。这种方法可避免每次打开新数据库连接所产生的内存和 CPU 开销。要防止数据库超额订阅,您可以控制创建的数据库连接数。
RDS 代理对无法立即从连接池提供服务的应用程序连接进行排队或限制。尽管延迟可能会增加,但您的应用程序可以继续扩展,而不会导致数据库突然出现故障或不堪重负。如果连接请求超出您指定的限制,则 RDS 代理会拒绝应用程序连接(即,减轻负载)。与此同时,它为 RDS 可通过可用容量提供服务的负载维护可预测的性能。
您可以减少处理凭证的开销,并为每个新连接建立安全连接。RDS 代理可以代表数据库处理其中的一些工作。
RDS 代理与它支持的引擎版本完全兼容。您可以在不更改代码的情况下为大多数应用程序启用 RDS 代理。
主题
区域和版本可用性
功能可用性和支持因每个数据库引擎的特定版本以及 AWS 区域而异。有关使用 RDS 代理的 Amazon RDS 的版本和区域可用性的更多信息,请参阅 支持 Amazon RDS 代理的区域和数据库引擎。
RDS 代理的配额和限制
以下配额和限制适用于 RDS 代理:
-
每个 AWS 账户 ID 限制为 20 个代理。如果您的应用程序需要更多代理,请通过 AWS Management Console中的服务配额页面申请增加代理。在服务配额页面中,选择 Amazon Relational Database Service(Amazon RDS),然后找到代理以申请增加配额。AWS 可以自动增加您的配额,或者等待 支持 审核您的申请。
-
每个代理最多可拥有 200 个关联的 Secrets Manager 密钥。因此,每个代理可以在任何给定时间连接多达 200 个不同的用户账户。
-
每个代理都具有一个默认端点。您还可以为每个代理添加最多 20 个代理端点。您可以创建、查看、修改和删除这些端点。
-
对于复制配置中的 RDS 数据库实例,您只能将代理与写入器数据库实例关联,而不能与只读副本关联。
-
您的 RDS 代理必须与数据库位于同一 Virtual Private Cloud (VPC) 中。代理无法公开访问,但数据库可以。例如,如果在本地主机上进行数据库原型设计,则无法连接到代理,除非设置必要的网络要求来允许连接到代理。这是因为您的本地主机不在代理的 VPC 范围内。
-
您不能将 RDS 代理用于其租户设置为
dedicated
的 VPC。 -
如果您将 RDS 代理与启用了 IAM 身份验证的 RDS 数据库实例结合使用,请检查用户身份验证。通过代理连接的用户必须通过登录凭证进行身份验证。有关 RDS 代理中 Secrets Manager 和 IAM 支持的详细信息,请参阅在 AWS Secrets Manager 中设置 RDS 代理的数据库凭证和为 RDS 代理配置 IAM 身份验证。
-
使用 SSL 主机名验证时,不能将 RDS 代理与自定义 DNS 一起使用。
-
每个代理都可以与单个目标数据库实例相关联。不过,您可以将多个代理与同一个数据库实例关联。
文本大小大于 16 KB 的任何语句都会导致代理将会话固定到当前连接。
-
某些区域在创建代理时需要考虑可用区(AZ)限制。美国东部(弗吉尼亚州北部)区域在
use1-az3
可用区中不支持 RDS 代理。美国西部(加利福尼亚北部)区域在usw1-az2
可用区中不支持 RDS 代理。如果在创建代理时选择子网,请确保不要在上述可用区中选择子网。 -
目前,RDS 代理不支持任何全局条件上下文键。
有关全局条件上下文键的更多信息,请参阅《IAM 用户指南》中的 AWS 全局条件上下文键。
-
不能将 RDS 代理与 RDS Custom for SQL Server 一起使用。
-
要将任何数据库参数组修改反映到您的代理,需要重启实例,即使您选择立即应用更改也不例外。对于集群级参数,需要在集群范围内重启。
-
当注册代理目标时,您的代理会自动创建
rdsproxyadmin
数据库用户。删除或修改rdsproxyadmin
用户或其权限可能会影响代理对应用程序的可用性。
有关每个数据库引擎的更多信息,请参阅下面几节:
RDS for MariaDB S 的额外限制
以下附加限制应用于适用于 RDS for MariaDB 数据库的 RDS 代理:
-
目前,所有代理均在端口 3306 上侦听 MariaDB。代理仍使用您在数据库设置中指定的端口连接到您的数据库。
-
不能将 RDS 代理与 Amazon EC2 实例中自行管理的 MariaDB 数据库结合使用。
-
您不能将 RDS 代理与已将数据库参数组中的
read_only
参数设置为1
的 RDS for MariaDB 数据库实例一起使用。 -
RDS 代理不支持 MariaDB 压缩模式。例如,它不支持
mysql
命令的--compress
或-C
选项使用的压缩。 -
某些 SQL 语句和函数可以更改连接状态而不会引起固定。有关最新的固定行为,请参阅 避免固定 RDS 代理。
RDS 代理不支持 MariaDB
auth_ed25519
插件。RDS 代理对于 MariaDB 数据库不支持传输层安全性协议(TLS)版本 1.3。
-
当 RDS 代理重用相同的数据库连接运行其他查询时,处理
GET DIAGNOSTIC
命令的数据库连接可能会返回不准确的信息。当 RDS 代理多路复用数据库连接时,可能会发生这种情况。有关更多信息,请参阅 RDS 代理概念概述。 -
对于 MariaDB,RDS 代理目前不支持
ClientPasswordAuthType
的caching_sha2_password
选项。
重要
对于与 MariaDB 数据库关联的代理,请勿在初始化查询中将配置参数 sql_auto_is_null
设置为 true
或非零值。否则,可能会导致不正确的应用程序行为。
RDS for Microsoft SQL Server 的额外限制
以下附加限制应用于适用于 RDS for Microsoft SQL Server 数据库的 RDS 代理:
您需要为代理创建的 Secrets Manager 密钥数量取决于您的数据库实例使用的排序规则。例如,假设您的数据库实例使用区分大小写的排序规则。如果您的应用程序同时接受“Admin”和“admin”,则代理需要两个单独的密钥。有关 SQL Server 中的排序规则的更多信息,请参阅 Microsoft SQL Server
文档。 RDS 代理不支持使用 Active Directory 的连接。
您不能对不支持令牌属性的客户端使用 IAM 身份验证。有关更多信息,请参阅使用 Microsoft SQL Server 连接到代理的注意事项。
@@IDENTITY
、@@ROWCOUNT
和SCOPE_IDENTITY
的结果并非始终准确。作为一种解决方法,可在同一会话语句中检索它们的值,以确保它们返回正确的信息。如果连接使用多个活动结果集(MARS),则 RDS 代理不会运行初始化查询。有关 MARS 的更多信息,请参阅 Microsoft SQL Server
文档。 -
目前,RDS 代理不支持在主要版本 SQL Server 2022 上运行的 RDS for SQL Server 数据库实例。
-
RDS 代理不支持在 SQL Server 2014 主版本上运行的 RDS for SQL Server 数据库实例。
-
RDS 代理不支持无法在一个 TLS 记录中处理多条响应消息的客户端应用程序。
RDS for MySQL 的额外限制
以下附加限制应用于适用于 RDS for MySQL 数据库的 RDS 代理:
-
RDS 代理对
caching_sha2_password
身份验证的支持需要安全(TLS)连接。 -
对
caching_sha2_password
的 RDS 代理支持已知与某些 go-sql 驱动程序版本存在兼容性问题。 -
使用 MySQL 8.4 C 驱动程序时,如果预编译语句中的参数计数超过占位符计数,
mysql_stmt_bind_named_param
API 可能会形成格式错误的数据包。这会导致错误的响应。有关更多信息,请参阅 MySQL 错误报告。 -
目前,所有代理均在端口 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 代理。 -
不支持在多语句查询中使用
ROW_COUNT()
函数。 -
RDS 代理不支持无法在一个 TLS 记录中处理多条响应消息的客户端应用程序。
重要
对于与 MySQL 数据库关联的代理,请勿在初始化查询中将配置参数 sql_auto_is_null
设置为 true
或非零值。否则,可能会导致不正确的应用程序行为。
RDS for PostgreSQL 的额外限制
以下附加限制应用于适用于 RDS for PostgreSQL 数据库的 RDS 代理:
RDS 代理不支持 PostgreSQL 的会话固定筛选条件。
-
目前,所有代理均在端口 5432 上侦听 PostgreSQL。
-
对于 PostgreSQL,RDS 代理目前不支持通过发出
CancelRequest
来取消来自客户端的查询。例如,使用 Ctrl+C 取消交互式 psql 会话中长时间运行的查询时,就会出现这种情况。 -
PostgreSQL 函数 lastval
的结果并不总是准确的。作为解决方法,请将 INSERT 语句与 RETURNING
子句一起使用。 RDS 代理目前不支持流式复制模式。
-
在 RDS for PostgreSQL 16 中,对
scram_iterations
值的修改只会影响代理和数据库之间的身份验证过程。具体而言,如果您将ClientPasswordAuthType
配置为scram-sha-256
,则对scram_iterations
值所做的任何自定义都不会影响客户端到代理密码身份验证。相反,客户端到代理密码身份验证的迭代值固定为 4096。 -
default
数据库必须存在。 -
如果您使用
ALTER ROLE
通过SET ROLE
更改用户角色,但后续以该用户身份连接到代理时若遇到固定问题,则这些后续连接可能不会使用此角色设置。为防止出现这种情况,在使用代理时,请在代理的初始化查询中使用SET ROLE
。有关更多信息,请参阅 为 Amazon RDS 创建代理中的初始化查询。
重要
对于适用于 PostgreSQL 数据库的现有代理,如果您将数据库身份验证修改为仅使用 SCRAM
,代理将在长达 60 秒的时间内不可用。要避免此问题,请执行以下操作之一:
确保数据库同时允许
SCRAM
和MD5
身份验证。要仅使用
SCRAM
身份验证,请创建一个新代理,将应用程序流量迁移到新代理,然后删除先前与数据库关联的代理。