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

使用 Amazon RDS Proxy 管理连接

使用 Amazon RDS Proxy,您可以允许应用程序对数据库连接进行池化和共享以提高其扩展能力。RDS Proxy 通过自动连接到备用数据库实例,同时保留应用程序连接,使应用程序能够更灵活地应对数据库故障。RDS Proxy 还允许您对数据库强制执行 Amazon Identity and Access Management (IAM) 身份验证,以及在 Amazon Secrets Manager 中安全存储凭证。

注意

RDS Proxy 与 MySQL 和 PostgreSQL 完全兼容。您可以在不更改代码的情况下为大多数应用程序启用 RDS Proxy。

使用 RDS Proxy,您可以处理不可预测的数据库流量激增,这种情况可能由于超额预订连接或快速创建新连接而导致问题。RDS Proxy 建立数据库连接池,并重复使用该池中的连接,而不会因为每次打开新数据库连接而产生内存和 CPU 开销。要防止数据库超额订阅,您可以控制创建的数据库连接数。

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

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

RDS Proxy 概念和术语

您可以通过使用 RDS Proxy 来简化 Amazon RDS 数据库实例和 Amazon Aurora 数据库集群的连接管理。

RDS Proxy 处理客户端应用程序和数据库之间的网络流量。为实现这一点,它首先了解数据库协议。然后,它会根据应用程序中的 SQL 操作和数据库中的结果集来调整其行为。

RDS Proxy 减少了数据库上的连接管理的内存和 CPU 开销。当应用程序打开多个同时连接时,数据库所需的内存和 CPU 资源较少。而且也不需要应用程序中的逻辑来关闭和重新打开长时间处于空闲状态的连接。同样,在出现数据库问题时,需要较少的应用程序逻辑来重新建立连接。

RDS Proxy 的基础设施高度可用,部署在多个可用区 (AZ) 上。RDS Proxy 的计算、内存和存储独立于您的 RDS 数据库实例和 Aurora 数据库集群。这种分离有助于减少数据库服务器的开销,使它们能够将资源用于处理数据库工作负载。RDS Proxy 计算资源是无服务器的,根据您的数据库工作负载自动进行扩展。

RDS Proxy 概念概述

RDS Proxy 处理基础设施以执行连接池和下面描述的其他功能。您可以在代理页面上看到 RDS 控制台中表示的代理。

每个代理处理与单个 RDS 数据库实例或 Aurora 数据库集群的连接。对于 RDS 多可用区数据库实例和 Aurora 预配置集群,代理自动确定当前的写入器实例。对于 Aurora 多主集群,代理连接到其中一个写入器实例,并将其他写入器实例用作热备用目标。

代理保持打开状态且可供数据库应用程序用于形成连接池的连接。

默认情况下,RDS Proxy 可在会话中的每个事务之后重用连接。这种事务级别的重用称为多路复用。当 RDS Proxy 临时从连接池中删除某个连接以重用该连接时,该操作称为借用 连接。如果这样做是安全的,RDS Proxy 会将该连接返回到连接池。

在某些情况下,RDS Proxy 不能确定在当前会话之外重用数据库连接是否安全。在这些情况下,它将会话保持在同一个连接上,直到会话结束。此回退行为称为固定

代理具有默认终端节点。使用 RDS 数据库实例或 Aurora 数据库集群时,您将连接到该终端节点,而不是连接到直接连至实例或集群的读/写终端节点。Aurora 集群的专用终端节点仍可供您使用。对于 Aurora 数据库集群,您还可以创建其他读/写和只读终端节点。有关更多信息,请参阅 代理终端节点概述

例如,您仍可连接到集群终端节点以实现读/写连接,而无需连接池。您仍可连接到读取器终端节点以实现负载均衡的只读连接。您仍可连接到实例终端节点,以便对 Aurora 集群中的特定数据库实例进行诊断和故障排除。如果您要使用其他 Amazon 服务(例如 Amazon Lambda)连接到 RDS 数据库,则需要将其连接设置更改为使用代理终端节点。例如,指定代理终端节点,以允许 Lambda 函数在利用 RDS Proxy 功能的同时访问数据库。

每个代理都包含一个目标组。该目标组包含代理可连接到的 RDS 数据库实例或 Aurora 数据库集群。对于 Aurora 集群,默认情况下,目标组与该集群中的所有数据库实例相关联。这样,代理就可以连接到被提升为集群中的写入器实例的任何 Aurora 数据库实例。与代理关联的 RDS 数据库实例或 Aurora 数据库集群及其实例称为该代理的目标。为方便起见,当您通过控制台创建代理时,RDS Proxy 也会创建相应的目标组并自动注册关联的目标。

引擎系列是使用相同数据库协议的相关数据库引擎集。您可以为创建的每个代理选择引擎系列。

连接池

每个代理都为其关联的 RDS 或 Aurora 数据库的写入器实例执行连接池。连接池 是一项优化,可减少与打开和关闭连接相关的开销,并可保持许多连接同时打开。该开销包括处理每个新连接所需的内存。此外还包括关闭每个连接和打开新连接所产生的 CPU 开销,例如传输层安全性/安全套接字层 (TLS/SSL) 握手、身份验证、协商功能等。连接池可简化应用程序逻辑。无需编写应用程序代码,即可最大限度地减少同时打开的连接数量。

每个代理还执行连接多路复用,也称为连接重用。对于多路复用,RDS Proxy 使用一个底层数据库连接对事务执行所有操作,然后可以对下一个事务使用不同的连接。您可以同时打开许多到代理的连接,而代理可确保打开的到数据库实例或集群的连接数量较少。这样做可进一步减少数据库服务器上连接的内存开销。这项技术还降低了出现“连接过多”错误的可能性。

RDS Proxy 安全性

RDS Proxy 使用现有的 RDS 安全机制,如 TLS/SSL 和 Amazon Identity and Access Management (IAM)。有关这些安全功能的一般信息,请参阅 Amazon Aurora 中的安全性。如果您不熟悉 RDS 和 Aurora 如何处理身份验证、授权和其他安全领域,请务必先熟悉 RDS 和 Aurora 如何处理这些领域。

RDS Proxy 可作为客户端应用程序和底层数据库之间的附加安全层。例如,即使底层数据库实例仅支持 TLS 1.0 或 1.1,您也可以使用 TLS 1.2 连接到代理。即使代理使用本机用户和密码身份验证方法连接到数据库,您也可以使用 IAM 角色连接到代理。通过采用这项技术,您可以对数据库应用程序强制执行强身份验证要求,而无需对数据库实例本身进行成本高昂的迁移。

您将 RDS Proxy 使用的数据库凭证存储在 Amazon Secrets Manager 中。代理访问的 RDS 数据库实例或 Aurora 数据库集群的每个数据库用户都必须在 Secrets Manager 中拥有相应的密钥。您还可为 RDS Proxy 的用户设置 IAM 身份验证。这样一来,即使数据库使用本机密码身份验证,您也可以对数据库访问强制执行 IAM 身份验证。我们建议使用这些安全功能,而不是在应用程序代码中嵌入数据库凭证。

将 TLS/SSL 与 RDS Proxy 结合使用

您可以使用 TLS/SSL 协议连接到 RDS Proxy。

注意

RDS Proxy 使用来自 Amazon Certificate Manager (ACM) 的证书。如果您使用 RDS Proxy,当您轮换 TLS/SSL 证书时,您不需要更新使用 RDS Proxy 连接的应用程序。

要对代理与数据库之间的所有连接强制执行 TLS,您可以在创建或修改代理时,指定需要传输层安全性设置。

RDS Proxy 还可以确保您的会话在客户端与 RDS Proxy 终端节点之间使用 TLS/SSL。要让 RDS Proxy 这样做,请在客户端上指定此要求。没有为使用 RDS Proxy 的数据库 SSL 连接设置 SSL 会话变量。

  • 对于 RDS for MySQL 和 Aurora MySQL,在运行 mysql 命令时使用 --ssl-mode 参数在客户端上指定此要求。

  • 对于 Amazon RDS PostgreSQL 和 Aurora PostgreSQL,在运行 psql 命令时将 sslmode=require 指定为 conninfo 字符串的一部分。

RDS Proxy 支持 TLS 协议版本 1.0、1.1 和 1.2。您可以使用比底层数据库中使用的更高版本的 TLS 连接到代理。

默认情况下,客户端程序会与 RDS Proxy 建立加密连接,并通过 --ssl-mode 选项进行进一步控制。从服务器端,RDS Proxy 支持所有 SSL 模式。

对于客户端,SSL 模式如下:

PREFERRED

SSL 是首选项,但不是必需项。

DISABLED

不允许使用 SSL。

REQUIRED

强制 SSL。

VERIFY_CA

强制 SSL 并验证证书颁发机构 (CA)。

VERIFY_IDENTITY

强制 SSL 并验证 CA 和 CA 主机名。

注意

连接到默认代理终端节点时,您可以使用 SSL 模式 VERIFY_IDENTITY。连接到创建的代理终端节点时,不能使用该 SSL 模式。

将客户端与 --ssl-modeVERIFY_CAVERIFY_IDENTITY 结合使用时,以 .pem 格式指定指向 CA 的 --ssl-ca 选项。对于可使用的 .pem 文件,您可以从 Amazon Trust Services 下载 Amazon Root CA 1 信任存储

RDS Proxy 使用通配符证书,这些证书应用到域及其子域。如果您使用 mysql 客户端以 SSL 模式 VERIFY_IDENTITY 进行连接,则您当前必须使用与 MySQL 8.0 兼容的 mysql 命令。

故障转移

故障转移 是一项高可用性功能,可在原始实例变得不可用时将数据库实例替换为另一个数据库实例。可能会因为数据库实例出现问题而发生故障转移。故障转移也可能是正常维护程序的一部分,例如在数据库升级期间。故障转移适用于多可用区配置中的 RDS 数据库实例,以及除写入器实例外还具有一个或多个读取器实例的 Aurora 数据库集群。

通过代理进行连接可使您的应用程序对数据库故障转移更具弹性。当原始数据库实例变得不可用时,RDS Proxy 将连接到备用数据库,而不删除空闲应用程序连接。这样做有助于加快和简化故障转移过程。结果,故障转移速度更快,与典型的重启或数据库问题相比,对应用程序造成的干扰更小。

如果没有 RDS Proxy,故障转移会导致短暂中断。在中断期间,您无法对该数据库执行写入操作。任何现有数据库连接都会中断,您的应用程序必须重新打开这些连接。当一个只读数据库实例被提升为取代不可用的数据库实例时,数据库将可用于新连接和写入操作。

在数据库故障转移期间,RDS Proxy 将继续接受相同 IP 地址的连接,并自动将连接定向到新的主数据库实例。通过 RDS Proxy 连接的客户端不会受到以下情况的影响:

  • 故障转移时的域名系统 (DNS) 传播延迟。

  • 本地 DNS 缓存。

  • 连接超时。

  • 不确定哪个数据库实例是当前的写入器。

  • 等待来自以前写入器的查询响应,该写入器在未关闭连接的情况下变得不可用。

对于维护自身连接池的应用程序,完成 RDS Proxy 意味着大多数连接在故障转移或其他中断期间保持活动状态。只有处于事务或 SQL 语句中间的连接才会被取消。RDS Proxy 会立即接受新连接。当数据库写入器不可用时,RDS Proxy 将对传入的请求进行排队。

对于不维护自身连接池的应用程序,RDS Proxy 提供更快的连接速度和更多的打开连接。它减轻了频繁从数据库重新连接而产生的昂贵开销。这是通过重用 RDS Proxy 连接池中维护的数据库连接来实现。此方法对于 TLS 连接尤其重要,因为这些连接的设置成本很高。

事务

单个事务中的所有语句始终使用相同的底层数据库连接。当事务结束时,连接可供另一会话使用。使用事务作为粒度单位会产生以下后果:

  • 启用 RDS for MySQL 或 Aurora MySQL autocommit 设置后,每个单独的语句之后都会发生连接重用。

  • 相反,禁用 autocommit 设置后,您在会话中发出的第一个语句会启动新的事务。因此,如果您输入 SELECTINSERTUPDATE 和其他数据操作语言 (DML) 语句的序列,则在您发出 COMMITROLLBACK 或以其他方式结束事务之前不会发生连接重用。

  • 输入数据定义语言 (DDL) 语句会导致事务在该语句完成后结束。

RDS Proxy 通过数据库客户端应用程序使用的网络协议检测事务何时结束。事务检测不依赖于关键字,例如 SQL 语句文本中显示的 COMMITROLLBACK

在某些情况下,RDS Proxy 可能会检测到使得无法将会话移动到其他连接的数据库请求。在这些情况下,它会在会话的剩余时间关闭该连接的多路复用。当 RDS Proxy 不能确定多路复用是否适用于会话时,这一规则也适用。该操作称为固定。有关检测和最小化固定的方法,请参阅 避免固定

规划和设置 RDS Proxy

在以下部分中,您可以了解如何设置 RDS Proxy。您还可以了解如何设置相关的安全性选项,以控制哪些人可以访问各个代理,以及各个代理如何连接到数据库实例。

RDS Proxy 的限制

以下限制适用于 RDS Proxy:

  • RDS Proxy 仅在某些 Amazon 区域提供。有关更多信息,请参阅 Amazon RDS Proxy

    每个 Amazon 账户 ID 最多可拥有 20 个代理。如果您的应用程序需要更多代理,您可以通过向 Amazon Support 组织开立票证来请求其他代理。

  • 每个代理最多可拥有 200 个关联的 Secrets Manager 密钥。因此,每个代理可以在任何给定时间连接多达 200 个不同的用户账户。

  • 对于每个代理,您最多可以创建、查看、修改和删除 20 个终端节点。这些终端节点是对自动为每个代理创建的默认终端节点的补充。

  • 在 Aurora 集群中,使用默认代理终端节点的所有连接都由 Aurora 写入器实例处理。要对读取密集型工作负载执行负载均衡,您可以为代理创建只读终端节点。该终端节点会将连接传递到集群的读取器终端节点。这样,您的代理连接就可以利用 Aurora 读取可扩展性。有关更多信息,请参阅 代理终端节点概述

    对于复制配置中的 RDS 数据库实例,您只能将代理与写入器数据库实例关联,而不能与只读副本关联。

  • 不能将 RDS Proxy 与 Aurora Serverless 集群一起使用。

  • 不能将 RDS Proxy 与属于 Aurora 全局数据库一部分的 Aurora 集群一起使用。

  • 您的 RDS Proxy 必须与数据库位于同一 VPC 中。代理无法公开访问,但数据库可以。

    注意

    对于 Aurora 数据库集群,您可以通过为代理创建额外的终端节点并为该终端节点指定其他 VPC、子网和安全组来启用跨 VPC 访问。有关更多信息,请参阅 访问 VPC 中的 Aurora和 RDS 数据库

  • 不能将 RDS Proxy 与具有专用租赁的 VPC 一起使用。

  • 如果您将RDS Proxy与启用了 IAM 身份验证的 RDS 数据库实例或 Aurora 数据库集群一起使用,请确保通过代理连接的所有用户都通过用户名和密码进行身份验证。有关RDS Proxy中的 IAM 支持的详细信息,请参阅 设置 Amazon Identity and Access Management (IAM) 策略

  • 不能将 RDS Proxy 与自定义 DNS 一起使用。

  • RDS Proxy 可用于 MySQL 和 PostgreSQL 引擎系列。

  • 每个代理都可以与单个目标数据库实例或集群相关联。不过,您可以将多个代理与同一个数据库实例或集群关联。

以下 RDS Proxy 先决条件和限制适用于 MySQL:

  • 对于 RDS for MySQL,RDS Proxy 支持 MySQL 5.6 和 5.7。对于 Aurora MySQL,RDS Proxy 支持版本 1(与 MySQL 5.6 兼容)和版本 2(与 MySQL 5.7 兼容)。

  • 目前,所有代理均在端口 3306 上侦听 MySQL。代理仍使用您在数据库设置中指定的端口连接到您的数据库。

  • 不能将 RDS Proxy 与 RDS for MySQL 8.0 一起使用。

  • 不能将 RDS Proxy 与 EC2 实例中自行管理的 MySQL 数据库一起使用。

  • 代理不支持 MySQL 压缩模式。例如,它们不支持 mysql 命令的 --compress-C 选项使用的压缩。

  • 某些 SQL 语句和函数可以更改连接状态而不会引起固定。有关最新的固定行为,请参阅 避免固定

以下 RDS Proxy 先决条件和限制适用于 PostgreSQL:

  • 对于 RDS PostgreSQL,RDS Proxy 支持版本 10.10 及更高次要版本,以及版本 11.5 及更高次要版本。对于 Aurora PostgreSQL,RDS Proxy 支持版本 10.11 及更高次要版本,以及版本 11.6 及更高次要版本。

  • 目前,所有代理均在端口 5432 上侦听 PostgreSQL。

  • PostgreSQL 不支持查询取消。

  • PostgreSQL 函数 lastval 的结果并不总是准确的。作为解决方法,请将 INSERT 语句与 RETURNING 子句一起使用。

确定要用于 RDS Proxy 的数据库实例、集群和应用程序

您可以确定哪些数据库实例、集群和应用程序可能从使用 RDS Proxy 中受益匪浅。为此,请考虑以下因素:

  • RDS Proxy 高度可用,部署在多个可用区 (AZ) 上。要确保数据库的总体高可用性,请在多可用区配置中部署 Amazon RDS 数据库实例或 Aurora 集群。

  • 任何出现“连接过多”错误的数据库实例或集群都很适合与代理相关联。代理允许应用程序打开许多客户端连接,而代理管理与数据库实例或集群的少量长期连接。

  • 对于使用较小 Amazon 实例类(如 T2 或 T3)的数据库实例或集群,使用代理可以帮助避免内存不足情况。它还可以帮助减少建立连接时的 CPU 开销。处理大量连接时可能会发生这些情况。

  • 您可以监控某些 Amazon CloudWatch 指标,以确定数据库实例或集群是否接近某些类型的限制。这些限制针对连接数以及与连接管理关联的内存。您还可以监控某些 CloudWatch 指标,以确定数据库实例或集群是否处理许多短期连接。打开和关闭此类连接可能会给数据库带来性能开销。有关要监控的指标的信息,请参阅 使用 Amazon CloudWatch 监控 RDS Proxy

  • Amazon Lambda 函数也可以很好地使用代理。这些函数进行频繁的短数据库连接,可受益于 RDS Proxy 提供的连接池。您可以利用已为 Lambda 函数提供的任何 IAM 身份验证,而不是在 Lambda 应用程序代码中管理数据库凭证。

  • 使用 PHP 和 Ruby on Rails 等语言和框架的应用程序通常可以很好地使用代理。此类应用程序通常打开和关闭大量数据库连接,并且没有内置的连接池机制。

  • 长时间保持大量连接打开的应用程序通常可以很好地使用代理。诸如软件即服务 (SaaS) 或电子商务等行业中的应用程序通常会使连接保持打开状态,从而最大限度地减少数据库请求的延迟。通过使用 RDS Proxy,与直接连接到数据库实例或集群时相比,应用程序可以保持更多的连接为打开状态。

  • 由于为所有数据库实例和集群设置此类身份验证较为复杂,您可能尚未采用 IAM 身份验证和 Secrets Manager。如果是这样,您可以保留现有的身份验证方法,并将身份验证委派给代理。代理可以为特定应用程序的客户端连接强制执行身份验证策略。您可以利用已为 Lambda 函数提供的任何 IAM 身份验证,而不是在 Lambda 应用程序代码中管理数据库凭证。

设置网络先决条件

使用 RDS Proxy 要求您拥有一组联网资源。这些资源包括 Virtual Private Cloud (VPC)、两个或更多子网、相同 VPC 内的 Amazon EC2 实例和一个互联网网关。如果已成功连接到任何 RDS 数据库实例或 Aurora 数据库集群,则您已拥有所需的网络资源。

如果您刚刚开始使用 RDS 或 Aurora,您可以遵循 为 Amazon Aurora 设置环境 中的规程,了解连接到数据库的基础知识。您也可以按照 开始使用 Amazon Aurora 中的教程进行操作。

以下 Linux 示例展示了检查 Amazon 账户拥有的 VPC 和子网的 Amazon CLI 命令。尤其是,在使用 CLI 创建代理时,您可以将子网 ID 作为参数传递。

aws ec2 describe-vpcs aws ec2 describe-internet-gateways aws ec2 describe-subnets --query '*[].[VpcId,SubnetId]' --output text | sort

以下 Linux 示例展示了用于确定与特定 Aurora 数据库集群或 RDS 数据库实例对应的子网 ID 的 Amazon CLI 命令。对于 Aurora 集群,首先,您可以找到其中一个关联数据库实例的 ID。您可以通过检查数据库实例的描述输出中 DBSubnetGroupSubnets 属性中的嵌套字段来提取该数据库实例使用的子网 ID。在为该数据库服务器设置代理时,您可以指定部分或全部这些子网 ID。

$ # Optional first step, only needed if you're starting from an Aurora cluster.Find the ID of any DB instance in the cluster. $ aws rds describe-db-clusters --db-cluster-identifier my_cluster_id --query '*[].[DBClusterMembers]|[0]|[0][*].DBInstanceIdentifier' --output text my_instance_id instance_id_2 instance_id_3 ... $ # From the DB instance, trace through the DBSubnetGroup and Subnets to find the subnet IDs. $ aws rds describe-db-instances --db-instance-identifier my_instance_id --query '*[].[DBSubnetGroup]|[0]|[0]|[Subnets]|[0]|[*].SubnetIdentifier' --output text subnet_id_1 subnet_id_2 subnet_id_3 ...

作为替代方案,您可以首先找到数据库实例的 VPC ID。然后,您可以检查 VPC 以查找其子网。以下 Linux 示例展示了操作步骤。

$ # From the DB instance, find the VPC. $ aws rds describe-db-instances --db-instance-identifier my_instance_id --query '*[].[VpcId]' --output text my_vpc_id $ aws ec2 describe-subnets --filters Name=vpc-id,Values=my_vpc_id --query '*[].[SubnetId]' --output text subnet_id_1 subnet_id_2 subnet_id_3 subnet_id_4 subnet_id_5 subnet_id_6

在 Amazon Secrets Manager 中设置数据库凭证

对于您创建的每个代理,首先使用 Secrets Manager 服务来存储用户名和密码凭证集。您可以在 RDS 数据库实例或 Aurora 数据库集群上,为代理连接到的每个数据库用户账户分别创建 Secrets Manager 密钥。

在 Secrets Manager 中,您可以使用 usernamepassword 字段的值创建这些密钥。这样一来,代理可以连接到与代理关联的任何 RDS 数据库实例或 Aurora 数据库集群上的相应数据库用户。为此,您可以使用 Credentials for other database (其他数据库的凭证)Credentials for RDS database (RDS 数据库凭证)Other type of secrets (其他密钥类型) 设置。为用户名密码字段填写相应的值,以及任何其他必填字段的占位符值。代理会忽略其他存在于密钥中的字段,如主机端口。这些详细信息由代理自动提供。

您也可以选择其他密钥类型。在这种情况下,您可以使用名为 usernamepassword 的键创建密钥。

由于代理使用的密钥不与特定数据库服务器绑定,因此,如果在多个数据库服务器上使用相同的凭证,则可对多个代理重用一个密钥。例如,您可以在一组开发和测试服务器上使用相同的凭证。

要以特定用户身份通过代理进行连接,请确保与密钥关联的密码与该用户的数据库密码相匹配。如果不匹配,您可以在 Secrets Manager 中更新关联的密钥。在这种情况下,您仍然可以连接到密钥凭证和数据库密码确实匹配的其他账户。

通过 Amazon CLI 或 RDS API 创建代理时,请为代理可访问的所有数据库用户账户指定相应密钥的 Amazon 资源名称 (ARN)。在 Amazon Web Services Management Console 中,根据描述性名称选择密钥。

有关在 Secrets Manager 中创建密钥的说明,请参阅 Secrets Manager 文档中的创建密钥页面。使用下面的方法之一:

  • 使用控制台中的 Secrets Manager

  • 要使用 CLI 创建与RDS Proxy 一起使用的 Secrets Manager 密钥,请使用类似如下的命令。

    aws secretsmanager create-secret --name "secret_name" --description "secret_description" --region region_name --secret-string '{"username":"db_user","password":"db_user_password"}'

例如,以下命令为两个数据库用户(一个名为 admin,另一个名为 app-user)创建 Secrets Manager 密钥。

aws secretsmanager create-secret \ --name admin_secret_name --description "db admin user" \ --secret-string '{"username":"admin","password":"choose_your_own_password"}' aws secretsmanager create-secret \ --name proxy_secret_name --description "application user" \ --secret-string '{"username":"app-user","password":"choose_your_own_password"}'

要查看您的 Amazon 账户拥有的密钥,请使用以下命令。

aws secretsmanager list-secrets

使用 CLI 创建代理时,将一个或多个密钥的 Amazon 资源名称 (ARN) 传递给 --auth 参数。以下 Linux 示例展示了如何准备报告,其中仅包含 Amazon 账户所拥有的每个密钥的名称和 ARN。此示例使用了 Amazon CLI 版本 2 中提供的 --output table 参数。如果您使用的是 Amazon CLI 版本 1,请改用 --output text

aws secretsmanager list-secrets --query '*[].[Name,ARN]' --output table

要验证是否在密钥中以正确的格式存储了正确的凭据,请使用以下命令。以密钥的短名称或 ARN 代替 your_secret_name

aws secretsmanager get-secret-value --secret-id your_secret_name

输出应包括一行 JSON 编码值,如下所示。

"SecretString": "{\"username\":\"your_username\",\"password\":\"your_password\"}",

设置 Amazon Identity and Access Management (IAM) 策略

在 Secrets Manager 中创建密钥后,请创建一个可以访问这些密钥的 IAM 策略。有关将 IAM 与 RDS 和 Aurora 结合使用的一般信息,请参阅Amazon Aurora 中的 Identity and Access Management

提示

如果您使用 IAM 控制台,则应用下面的过程。如果您使用 Amazon Web Services Management Console for RDS,RDS 可以自动为您创建 IAM 策略。在这种情况下,您可以跳过下面的过程。

创建用于访问您的 Secrets Manager 密钥以便与代理一起使用的 IAM 策略

  1. 登录到 IAM 控制台。按照创建角色过程进行操作,如创建 IAM 角色中所述。包括将角色添加到数据库步骤。

  2. 对于新角色,请执行添加内联策略步骤。使用与编辑 IAM 策略中相同的一般过程。将下面的 JSON 粘贴到 JSON 文本框中。替换您自己的账户 ID。将您的 Amazon 区域替换为 us-east-2。将 Amazon 资源名称 (ARN) 替换为您创建的密钥。对于 kms:Decrypt 操作,请替换默认 Amazon KMS 客户主密钥 (CMK) 或您自己的 Amazon KMS CMK 的 ARN,具体取决于您使用哪个 CMK 来加密 Secrets Manager 密钥。

    { "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": "secretsmanager:GetSecretValue", "Resource": [ "arn:aws-cn:secretsmanager:us-east-2:account_id:secret:secret_name_1", "arn:aws-cn:secretsmanager:us-east-2:account_id:secret:secret_name_2" ] }, { "Sid": "VisualEditor1", "Effect": "Allow", "Action": "kms:Decrypt", "Resource": "arn:aws-cn:kms:us-east-2:account_id:key/key_id", "Condition": { "StringEquals": { "kms:ViaService": "secretsmanager.us-east-2.amazonaws.com" } } } ] }
  3. 编辑此 IAM 角色的信任策略。将下面的 JSON 粘贴到 JSON 文本框中。

    { "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": "rds.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }

以下命令通过 Amazon CLI 执行相同的操作。

PREFIX=choose_an_identifier aws iam create-role --role-name choose_role_name \ --assume-role-policy-document '{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Principal":{"Service":["rds.amazonaws.com"]},"Action":"sts:AssumeRole"}]}' aws iam put-role-policy --role-name same_role_name_as_previous \ --policy-name $PREFIX-secret-reader-policy --policy-document """ same_json_as_in_previous_example """ aws kms create-key --description "$PREFIX-test-key" --policy """ { "Id":"$PREFIX-kms-policy", "Version":"2012-10-17", "Statement": [ { "Sid":"Enable IAM User Permissions", "Effect":"Allow", "Principal":{"AWS":"arn:aws-cn:iam::account_id:root"}, "Action":"kms:*","Resource":"*" }, { "Sid":"Allow access for Key Administrators", "Effect":"Allow", "Principal": { "AWS": ["$USER_ARN","arn:aws-cn:iam::account_id:role/Admin"] }, "Action": [ "kms:Create*", "kms:Describe*", "kms:Enable*", "kms:List*", "kms:Put*", "kms:Update*", "kms:Revoke*", "kms:Disable*", "kms:Get*", "kms:Delete*", "kms:TagResource", "kms:UntagResource", "kms:ScheduleKeyDeletion", "kms:CancelKeyDeletion" ], "Resource":"*" }, { "Sid":"Allow use of the key", "Effect":"Allow", "Principal":{"AWS":"$ROLE_ARN"}, "Action":["kms:Decrypt","kms:DescribeKey"], "Resource":"*" } ] } """

创建 RDS Proxy

要管理指定数据库实例集的连接,您可以创建代理。您可以将代理与 RDS for MySQL 数据库实例、PostgreSQL 数据库实例或 Aurora 数据库集群关联。

创建代理

  1. 登录 Amazon Web Services Management Console 并通过以下网址打开 Amazon RDS 控制台:https://console.amazonaws.cn/rds/

  2. 在导航窗格中,选择 Proxies (代理)

  3. 选择 Create proxy (创建代理)

  4. 为您的代理选择所有设置。

    对于代理配置,请提供以下信息:

    • 代理标识符。指定选择的名称,该名称在您的 Amazon 账户 ID 和当前 Amazon 区域内唯一。

    • 引擎兼容性。选择 MySQLPOSTGRESQL

    • 需要传输层安全性。如果您希望代理对所有客户端连接强制执行 TLS/SSL,则选择此设置。如果您使用与代理的加密或未加密连接,则代理在与底层数据库建立连接时使用相同的加密设置。

    • 空闲客户端连接超时。选择在代理关闭客户端连接之前该连接可以处于空闲状态的时间段。默认值为 1800 秒(30 分钟)。如果应用程序未在上一请求完成后的指定时间内提交新请求,则客户端连接视为空闲。底层数据库连接保持打开状态并返回到连接池。因此,它可以重复用于新的客户端连接。

      如果您希望代理主动删除过时的连接,请考虑减少空闲客户端连接超时。如果您的工作负载会出现峰值,请考虑增加空闲客户端连接超时以节省建立连接的成本。

    对于目标组配置,请提供以下信息:

    • 数据库。选择一个要通过此代理访问的 RDS 数据库实例或 Aurora 数据库集群。该列表仅包含具有兼容数据库引擎、引擎版本和其他设置的数据库实例和集群。如果列表为空,请创建与 RDS Proxy 兼容的新数据库实例或集群。为此,请按照 创建 Amazon Aurora 数据库集群 中的过程操作。然后尝试再次创建代理。

    • 连接池最大连接数。指定一个从 1 到 100 的值。此设置表示 RDS Proxy 可用于其连接的 max_connections 值的百分比。如果您只打算对此数据库实例或集群使用一个代理,可以将此值设置为 100。有关 RDS Proxy 如何使用此设置的详细信息,请参阅 控制连接限制和超时

    • Session pinning filters (会话固定筛选条件)。(可选)这是一项高级设置,用于解决特定应用程序的性能问题。目前,唯一的选择是 EXCLUDE_VARIABLE_SETS。只有同时满足以下两个条件时才选择一个筛选条件:您的应用程序由于某些类型的 SQL 语句而未重用连接,并且您可以验证使用这些 SQL 语句重用连接不会影响应用程序的正确性。有关更多信息,请参阅避免固定

    • Connection borrow timeout (连接借用超时)。在某些情况下,您可能希望代理有时使用所有可用的数据库连接。在这种情况下,您可以指定在返回超时错误之前代理等待数据库连接可用的时间。您最多可以指定五分钟的时间段。仅当代理已打开最大连接数并且所有连接均已在使用时,该设置才适用。

    对于连接,请提供以下信息:

    • Secrets Manager ARN。至少选择一个 Secrets Manager 密钥,该密钥包含要使用此代理访问的 RDS 数据库实例或 Aurora 数据库集群的数据库用户凭证。

    • IAM role (IAM 角色)。选择一个有权访问您之前所选的 Secrets Manager 密钥的 IAM 角色。您还可以选择 Amazon Web Services Management Console 来创建新 IAM 角色并使用该角色。

    • IAM Authentication (IAM 身份验证)。选择是要求还是禁止对代理连接进行 IAM 身份验证。IAM 身份验证或本机数据库身份验证的选择适用于访问此代理的所有数据库用户。

    • Subnets (子网)。此字段预填充与您的 VPC 关联的所有子网。您可以删除此代理不需要的任何子网。必须至少保留两个子网。

    提供其他连接配置:

    • VPC security group (VPC 安全组)。选择现有的 VPC 安全组。您还可以选择 Amazon Web Services Management Console 来创建新安全组并使用该安全组。

      注意

      该安全组必须允许访问代理连接到的数据库。同一安全组用于从应用程序到代理的入口以及从代理到数据库的出口。例如,假设您对数据库和代理使用同一安全组。在这种情况下,请确保您指定该安全组中的资源可以与同一安全组中的其他资源进行通信。

    (可选)提供高级配置:

    • Enable enhanced logging (启用增强型日志记录)。您可以启用该设置来解决代理兼容性或性能问题。

      启用该设置后,RDS Proxy 会在其日志中包含有关 SQL 语句的详细信息。这些信息可帮助您调试涉及 SQL 行为或代理连接的性能和可扩展性的问题。调试信息包括您通过代理提交的 SQL 语句的文本。因此,只有在需要调试,并且仅当您已采取安全措施来保护日志中显示的任何敏感信息时,才启用该设置。

      为了最大限度地减少与代理相关的开销,在您启用该设置 24 小时后,RDS Proxy 会自动禁用它。暂时启用它以解决特定问题。

  5. 选择 Create Proxy (创建代理)

要创建代理,请使用 Amazon CLI 命令 create-db-proxy--engine-family 值区分大小写。

对于 Linux、macOS 或 Unix:

aws rds create-db-proxy \ --db-proxy-name proxy_name \ --engine-family { MYSQL | POSTGRESQL } \ --auth ProxyAuthenticationConfig_JSON_string \ --role-arn iam_role \ --vpc-subnet-ids space_separated_list \ [--vpc-security-group-ids space_separated_list] \ [--require-tls | --no-require-tls] \ [--idle-client-timeout value] \ [--debug-logging | --no-debug-logging] \ [--tags comma_separated_list]

对于 Windows:

aws rds create-db-proxy ^ --db-proxy-name proxy_name ^ --engine-family { MYSQL | POSTGRESQL } ^ --auth ProxyAuthenticationConfig_JSON_string ^ --role-arn iam_role ^ --vpc-subnet-ids space_separated_list ^ [--vpc-security-group-ids space_separated_list] ^ [--require-tls | --no-require-tls] ^ [--idle-client-timeout value] ^ [--debug-logging | --no-debug-logging] ^ [--tags comma_separated_list]
提示

如果您尚不知道要用于 --vpc-subnet-ids 参数的子网 ID,请参阅 设置网络先决条件 获取有关如何查找可以使用的子网 ID 的示例。

要创建代理所需的信息和关联,您还可以使用 register-db-proxy-targets 命令。指定目标组名称 default。当您创建每个代理时,RDS Proxy 会自动创建一个具有此名称的目标组。

aws rds register-db-proxy-targets --db-proxy-name value [--target-group-name target_group_name] [--db-instance-identifiers space_separated_list] # rds db instances, or [--db-cluster-identifiers cluster_id] # rds db cluster (all instances), or [--db-cluster-endpoint endpoint_name] # rds db cluster endpoint (all instances)

要创建 RDS 代理,请调用 Amazon RDS API 操作 CreateDBProxy。传递具有 AuthConfig 数据结构的参数。

当您创建每个代理时,RDS Proxy 会自动创建一个名为 default 的目标组。通过调用函数 RegisterDBProxyTargets,将 RDS 数据库实例或 Aurora 数据库集群与目标组关联。

查看 RDS Proxy

创建一个或多个 RDS 代理后,您可以查看所有代理以检查其配置详细信息,并选择要修改、删除以及执行其他操作的代理。

使用代理的任何数据库应用程序都要求在连接字符串中使用代理终端节点。

查看您的代理

  1. 登录 Amazon Web Services Management Console 并通过以下网址打开 Amazon RDS 控制台:https://console.amazonaws.cn/rds/

  2. 在 Amazon Web Services Management Console 的右上角,选择在其中创建了 RDS Proxy 的 Amazon 区域。

  3. 在导航窗格中,选择 Proxies (代理)

  4. 选择 RDS 代理的名称以显示其详细信息。

  5. 在详细信息页面上,Target groups (目标组) 部分显示了代理与特定 RDS 数据库实例或 Aurora 数据库集群的关联方式。您可以访问指向默认目标组页面的链接,以查看有关代理与数据库之间关联的更多详细信息。在该页面上,您可以看到创建代理时指定的设置,如最大连接百分比、连接借用超时、引擎兼容性和会话固定筛选条件。

要使用 CLI 查看您的代理,请使用 describe-db-proxies 命令。默认情况下,它会显示您的 Amazon 账户拥有的所有代理。要查看单个代理的详细信息,请通过 --db-proxy-name 参数指定其名称。

aws rds describe-db-proxies [--db-proxy-name proxy_name]

要查看与代理关联的其他信息,请使用以下命令。

aws rds describe-db-proxy-target-groups --db-proxy-name proxy_name aws rds describe-db-proxy-targets --db-proxy-name proxy_name

使用以下命令序列查看有关与代理关联的内容的更多详细信息:

  1. 要获取代理列表,请运行 describe-db-proxies

  2. 要显示连接参数(如代理可以使用的最大连接百分比),请运行 describe-db-proxy-target-groups --db-proxy-name,并使用代理的名称作为参数值。

  3. 要查看与返回的目标组关联的 RDS 数据库实例或 Aurora 数据库集群的详细信息,请运行 describe-db-proxy-targets

要使用 RDS API 查看您的代理,请使用 DescribeDBProxies 操作。该操作将返回 DBProxy 数据类型的值。

要查看代理连接设置的详细信息,请将此返回值中的代理标识符与 DescribeDBProxyTargetGroups 操作一起使用。该操作将返回 DBProxyTargetGroup 数据类型的值。

要查看与代理关联的 RDS 实例或 Aurora 数据库集群,请使用 DescribeDBProxyTargets 操作。该操作将返回 DBProxyTarget 数据类型的值。

通过 RDS Proxy 连接到数据库

通过代理连接到 RDS 数据库实例或 Aurora 数据库集群的方式通常与直接连接到数据库的方式相同。主要区别在于您指定代理终端节点而不是实例或集群终端节点。对于 Aurora 数据库集群,所有代理连接在默认情况下都具有读/写功能,并使用写入器实例。如果您通常使用读取器终端节点进行只读连接,则可以为代理创建额外的只读终端节点,然后以相同的方式使用该终端节点。有关更多信息,请参阅代理终端节点概述

使用本机身份验证连接到代理

执行以下基本步骤,使用本机身份验证连接到代理:

  1. 查找代理终端节点。在 Amazon Web Services Management Console 中,您可以在相应代理的详细信息页面上找到终端节点。通过 Amazon CLI,您可以使用 describe-db-proxies 命令。下面的示例演示如何操作。

    # Add --output text to get output as a simple tab-separated list. $ aws rds describe-db-proxies --query '*[*].{DBProxyName:DBProxyName,Endpoint:Endpoint}' [ [ { "Endpoint": "the-proxy.proxy-demo.us-east-1.rds.amazonaws.com", "DBProxyName": "the-proxy" }, { "Endpoint": "the-proxy-other-secret.proxy-demo.us-east-1.rds.amazonaws.com", "DBProxyName": "the-proxy-other-secret" }, { "Endpoint": "the-proxy-rds-secret.proxy-demo.us-east-1.rds.amazonaws.com", "DBProxyName": "the-proxy-rds-secret" }, { "Endpoint": "the-proxy-t3.proxy-demo.us-east-1.rds.amazonaws.com", "DBProxyName": "the-proxy-t3" } ] ]
  2. 在客户端应用程序的连接字符串中指定该终端节点作为主机参数。例如,指定代理终端节点作为 mysql -h 选项或 psql -h 选项的值。

  3. 提供您通常使用的相同数据库用户名和密码。

使用 IAM 身份验证连接到代理

在将 IAM 身份验证与RDS Proxy结合使用时,请将数据库用户设置为使用常规用户名和密码进行身份验证。IAM 身份验证适用于从 Secrets Manager 中检索用户名和密码凭证的RDS Proxy。从RDS Proxy至底层数据库的连接不经由 IAM。

要使用 IAM 身份验证连接到RDS Proxy,请遵循与使用 IAM 身份验证连接到 RDS 数据库实例或 Aurora 集群相同的常规过程。有关将 IAM 与 RDS 和 Aurora 结合使用的一般信息,请参阅Amazon Aurora 中的安全性

RDS Proxy 在 IAM 用法方面的主要区别包括:

  • 您不会使用授权插件配置每个单独的数据库用户。数据库用户在数据库中仍有常规的用户名和密码。您可以设置包含这些用户名和密码的 Secrets Manager 密钥,并授权 RDS Proxy 从 Secrets Manager 中检索凭证。

    重要

    IAM 身份验证应用于您的客户端程序与代理之间的连接。然后,代理使用从 Secrets Manager 中检索的用户名和密码凭证对数据库进行身份验证。当您将 IAM 用于与代理的连接时,请确保底层 RDS 数据库实例或 Aurora 数据库集群未启用 IAM。

  • 指定代理终端节点,而不是实例、集群或读取器终端节点。有关代理终端节点的详细信息,请参阅使用 IAM 身份验证连接到数据库集群

  • 在直接数据库 IAM 身份验证情况下,您可以有选择地选取数据库用户并将其配置为使用特殊身份验证插件进行标识。然后,您可以使用 IAM 身份验证连接到这些用户。

    在代理使用案例中,您需要为代理提供包含某些用户的用户名和密码(本机身份验证)的密钥。然后,您可以使用 IAM 身份验证(通过使用代理终端节点而不是数据库终端节点生成身份验证令牌)并使用与之前所提供密钥的用户名之一匹配的用户名,连接到代理。

  • 当使用 IAM 身份验证连接到代理时,确保您使用传输层安全性 (TLS)/安全套接字层 (SSL)。

您可以通过修改 IAM 策略授予特定用户对代理的访问权限。下面是一个示例。

"Resource": "arn:aws-cn:rds-db:us-east-2:1234567890:dbuser:prx-ABCDEFGHIJKL01234/db_user"

使用 PostgreSQL 连接到代理的注意事项

对于 PostgreSQL,当客户端启动到 PostgreSQL 数据库的连接时,它会发送一条包含参数名称和值字符串对的启动消息。有关详细信息,请参阅 PostgreSQL 文档中的 PostgreSQL 消息格式中的 StartupMessage

通过 RDS 代理进行连接时,启动消息可以包含以下当前识别的参数:

  • user

  • database

  • replication

启动消息还可以包含以下其他运行时参数:

有关 PostgreSQL 消息收发的更多信息,请参阅 PostgreSQL 文档中的前端/后端协议

对于 PostgreSQL,如果您使用 JDBC,我们建议您执行以下操作以避免固定:

  • 将 JDBC 连接参数 assumeMinServerVersion 至少设置为 9.0 以避免固定。这样做会阻止 JDBC 驱动程序在运行 SET extra_float_digits = 3 时,在连接启动期间执行额外的往返行程。

  • 将 JDBC 连接参数 ApplicationName 设置为 any/your-application-name 以避免固定。这样做会阻止 JDBC 驱动程序在运行 SET application_name = "PostgreSQL JDBC Driver" 时,在连接启动期间执行额外的往返行程。请注意,JDBC 参数为 ApplicationName,但 PostgreSQL StartupMessage 参数为 application_name

  • 将 JDBC 连接参数 preferQueryMode 设置为 extendedForPrepared 以避免固定。extendedForPrepared 可以确保扩展模式仅用于预编译语句。

    preferQueryMode 参数的默认值为 extended,它对所有查询都使用扩展模式。扩展模式使用一系列的 PrepareBindExecuteSync 请求以及相应的响应。这种系列类型会导致 RDS 代理中的连接固定。

有关更多信息,请参阅 避免固定。有关使用 JDBC 进行连接的更多信息,请参阅 PostgreSQL 文档中的连接到数据库

管理 RDS Proxy

下面,您可以找到有关如何管理 RDS 代理操作和配置的说明。这些过程可帮助您的应用程序最有效地利用数据库连接,并实现最大程度的连接重用。您越多地利用连接重用,就可以节省越多的 CPU 和内存开销。这进而减少了应用程序的延迟,使数据库能够将更多资源用于处理应用程序请求。

修改 RDS Proxy

您可以在创建代理后更改与代理关联的某些设置。可通过修改代理本身和/或其关联的目标组来执行此操作。每个代理都有一个关联的目标组。

修改代理的设置

  1. 登录 Amazon Web Services Management Console 并通过以下网址打开 Amazon RDS 控制台:https://console.amazonaws.cn/rds/

  2. 在导航窗格中,选择 Proxies (代理)

  3. 在代理列表中,选择要修改其设置的代理或转到其详细信息页面。

  4. 对于 Actions (操作),选择 Modify (修改)

  5. 输入或选择要修改的属性。您可以执行以下操作:

    • 通过输入新标识符来重命名代理。

    • 打开或关闭传输层安全性 (TLS) 的要求。

    • 输入空闲连接超时的时间段。

    • 添加或删除 Secrets Manager 密钥。这些密钥对应于数据库用户名和密码。

    • 更改用于从 Secrets Manager 中检索密钥的 IAM 角色。

    • 要求或禁止对代理连接进行 IAM 身份验证。

    • 添加或删除供代理使用的 VPC 子网。

    • 添加或删除供代理使用的 VPC 安全组。

    • 启用或禁用增强型日志记录。

  6. 选择修改

如果您找不到要更改的列出设置,请使用以下过程更新代理的目标组。与代理关联的目标组 控制与物理数据库连接相关的设置。每个代理都有一个名为 default 的关联目标组,该目标组与代理一起自动创建。

您只能从代理详细信息页面修改目标组,而不能从 Proxies (代理) 页面上的列表中进行修改。

修改代理目标组的设置

  1. 代理页面上,转到代理的详细信息页面。

  2. 对于 Target groups (目标组),选择 default 链接。目前,所有代理都有一个名为 default 的目标组。

  3. 默认目标组的详细信息页面上,选择 Modify (修改)

  4. 为您可以修改的属性选择新设置:

    • 选择不同的 RDS 数据库实例或 Aurora 集群。

    • 调整代理可使用的最大可用连接的百分比。

    • 选择会话固定筛选条件。这样做可以帮助减少由于事务级别的连接重用不足而导致的性能问题。要使用该设置,您需要了解应用程序行为以及 RDS Proxy 将会话固定到数据库连接的情况。

    • 调整连接借用超时间隔。当最大连接数已用于代理时,此设置适用。该设置确定在返回超时错误之前代理等待连接可用的时间。

    不能更改某些属性,例如,目标组标识符和数据库引擎。

  5. 选择 Modify target group (修改目标组)

要使用 Amazon CLI 修改代理,请使用 modify-db-proxymodify-db-proxy-target-groupderegister-db-proxy-targetsregister-db-proxy-targets 命令。

使用 modify-db-proxy 命令,您可以更改以下属性:

  • 代理使用的一组 Secrets Manager 密钥。

  • 是否需要 TLS。

  • 空闲客户端超时。

  • 是否记录 SQL 语句中的其他信息以进行调试。

  • 用于检索 Secrets Manager 密钥的 IAM 角色。

  • 代理使用的安全组。

以下示例演示了如何重命名现有代理。

aws rds modify-db-proxy --db-proxy-name the-proxy --new-db-proxy-name the_new_name

要修改与连接相关的设置或重命名目标组,请使用 modify-db-proxy-target-group 命令。目前,所有代理都有一个名为 default 的目标组。使用此目标组时,请指定代理的名称,并指定 default 作为目标组的名称。

以下示例演示了如何首先检查代理的 MaxIdleConnectionsPercent 设置,然后使用目标组对其进行更改。

aws rds describe-db-proxy-target-groups --db-proxy-name the-proxy { "TargetGroups": [ { "Status": "available", "UpdatedDate": "2019-11-30T16:49:30.342Z", "ConnectionPoolConfig": { "MaxIdleConnectionsPercent": 50, "ConnectionBorrowTimeout": 120, "MaxConnectionsPercent": 100, "SessionPinningFilters": [] }, "TargetGroupName": "default", "CreatedDate": "2019-11-30T16:49:27.940Z", "DBProxyName": "the-proxy", "IsDefault": true } ] } aws rds modify-db-proxy-target-group --db-proxy-name the-proxy --target-group-name default --connection-pool-config ' { "MaxIdleConnectionsPercent": 75 }' { "DBProxyTargetGroup": { "Status": "available", "UpdatedDate": "2019-12-02T04:09:50.420Z", "ConnectionPoolConfig": { "MaxIdleConnectionsPercent": 75, "ConnectionBorrowTimeout": 120, "MaxConnectionsPercent": 100, "SessionPinningFilters": [] }, "TargetGroupName": "default", "CreatedDate": "2019-11-30T16:49:27.940Z", "DBProxyName": "the-proxy", "IsDefault": true } }

使用 deregister-db-proxy-targetsregister-db-proxy-targets 命令,您可以通过相应的目标组来更改代理关联的 RDS 数据库实例或 Aurora 数据库集群。目前,每个代理都可以连接到一个 RDS 数据库实例或 Aurora 数据库集群。目标组可跟踪多可用区配置中的所有 RDS 数据库实例或 Aurora 集群中所有数据库实例的连接详细信息。

以下示例首先介绍了与名为 cluster-56-2020-02-25-1399 的 Aurora MySQL 集群关联的代理。该示例演示了如何更改代理,以便连接到名为 provisioned-cluster 的不同集群。

使用 RDS 数据库实例时,请指定 --db-instance-identifier 选项。使用 Aurora 数据库集群时,则指定 --db-cluster-identifier 选项。

以下示例修改 Aurora MySQL 代理。Aurora PostgreSQL 代理具有端口 5432。

aws rds describe-db-proxy-targets --db-proxy-name the-proxy { "Targets": [ { "Endpoint": "instance-9814.demo.us-east-1.rds.amazonaws.com", "Type": "RDS_INSTANCE", "Port": 3306, "RdsResourceId": "instance-9814" }, { "Endpoint": "instance-8898.demo.us-east-1.rds.amazonaws.com", "Type": "RDS_INSTANCE", "Port": 3306, "RdsResourceId": "instance-8898" }, { "Endpoint": "instance-1018.demo.us-east-1.rds.amazonaws.com", "Type": "RDS_INSTANCE", "Port": 3306, "RdsResourceId": "instance-1018" }, { "Type": "TRACKED_CLUSTER", "Port": 0, "RdsResourceId": "cluster-56-2020-02-25-1399" }, { "Endpoint": "instance-4330.demo.us-east-1.rds.amazonaws.com", "Type": "RDS_INSTANCE", "Port": 3306, "RdsResourceId": "instance-4330" } ] } aws rds deregister-db-proxy-targets --db-proxy-name the-proxy --db-cluster-identifier cluster-56-2020-02-25-1399 aws rds describe-db-proxy-targets --db-proxy-name the-proxy { "Targets": [] } aws rds register-db-proxy-targets --db-proxy-name the-proxy --db-cluster-identifier provisioned-cluster { "DBProxyTargets": [ { "Type": "TRACKED_CLUSTER", "Port": 0, "RdsResourceId": "provisioned-cluster" }, { "Endpoint": "gkldje.demo.us-east-1.rds.amazonaws.com", "Type": "RDS_INSTANCE", "Port": 3306, "RdsResourceId": "gkldje" }, { "Endpoint": "provisioned-1.demo.us-east-1.rds.amazonaws.com", "Type": "RDS_INSTANCE", "Port": 3306, "RdsResourceId": "provisioned-1" } ] }

要使用 RDS API 修改代理,请使用 ModifyDBProxyModifyDBProxyTargetGroupDeregisterDBProxyTargetsRegisterDBProxyTargets 操作。

使用 ModifyDBProxy,您可以更改以下属性:

  • 代理使用的一组 Secrets Manager 密钥。

  • 是否需要 TLS。

  • 空闲客户端超时。

  • 是否记录 SQL 语句中的其他信息以进行调试。

  • 用于检索 Secrets Manager 密钥的 IAM 角色。

  • 代理使用的安全组。

使用 ModifyDBProxyTargetGroup,您可以修改与连接相关的设置或重命名目标组。目前,所有代理都有一个名为 default 的目标组。使用此目标组时,请指定代理的名称,并指定 default 作为目标组的名称。

使用 DeregisterDBProxyTargetsRegisterDBProxyTargets,您可以通过相应的目标组来更改代理关联的 RDS 数据库实例或 Aurora 数据库集群。目前,每个代理都可以连接到一个 RDS 数据库实例或 Aurora 数据库集群。目标组可跟踪多可用区配置中的所有 RDS 数据库实例或 Aurora 集群中所有数据库实例的连接详细信息。

添加新数据库用户

在某些情况下,您可能会将新数据库用户添加到与代理关联的 RDS 数据库实例或 Aurora 集群。如果是这样,请添加 Secrets Manager 密钥或调整其用途,以存储该用户的凭证。为此,请选择以下选项之一:

  • 使用 在 Amazon Secrets Manager 中设置数据库凭证 中描述的过程创建新 Secrets Manager 密钥。

  • 更新 IAM 角色以授予 RDS Proxy 对新 Secrets Manager 密钥的访问权限。为此,请更新 IAM 角色策略的资源部分。

  • 如果新用户取代了现有用户,请更新存储在代理的 Secrets Manager 密钥中的现有用户的凭证。

更改数据库用户的密码

在某些情况下,您可能会更改与代理关联的 RDS 数据库实例或 Aurora 集群中的数据库用户的密码。如果是这样,请使用新密码更新相应的 Secrets Manager 密钥。

控制连接限制和超时

RDS Proxy 对 RDS 数据库实例或 Aurora 数据库集群使用 max_connections 设置。该设置表示代理在任何一个时刻可以打开的连接数量的总体上限。在 Aurora 集群和 RDS 多可用区配置中,代理使用的 max_connections 值是 Aurora 主实例或 RDS 写入器实例的值。

要为 RDS 数据库实例或 Aurora 数据库集群设置此值,请按照使用数据库参数组和数据库集群参数组中的过程操作。这些过程演示了如何将参数组与数据库关联以及如何编辑参数组中的 max_connections 值。

最大连接数的代理设置表示与代理关联的数据库的 max_connections 值的百分比。如果有多个应用程序都使用同一数据库,您可以通过对每个应用程序使用一个代理来有效地划分其连接配额(按 max_connections 的特定百分比)。如果执行此操作,请确保与同一数据库关联的所有代理的百分比加起来不超过 100%。

RDS Proxy 定期断开空闲连接并将其返回到连接池。您可以调整此超时间隔。这样做可帮助您的应用程序处理过时的资源(特别是如果应用程序错误地在保留重要数据库资源的同时使连接保持打开状态)。

管理和监控连接池

连接池 中所述,连接池是一个至关重要的 RDS Proxy 功能。接下来,您可以了解如何最有效地利用连接池和事务级别连接重用(多路复用)。

由于连接池由 RDS Proxy 托管,您可以对其进行监控并调整连接限制和超时间隔,而无需更改应用程序代码。

对于每个代理,您可以为连接池使用的连接数指定上限。请将限制指定为百分比。该百分比适用于数据库中配置的最大连接数。确切数字因数据库实例大小和配置设置而异。

例如,假设您将 RDS Proxy 配置为使用数据库最大连接数的 75%。对于 MySQL,最大值由 max_connections 配置参数定义。在这种情况下,其他 25% 的最大连接数仍可用于分配给其他代理或作为不经过代理的连接。在某些情况下,代理可能会在特定时间保持低于 75% 的最大打开连接数。这些情况可能包括数据库没有多个并发连接的情况,或者某些连接长时间处于空闲状态的情况。

当您更新适用于 RDS 数据库实例或 Aurora 集群的 max_connections 配置设置时,可用于连接池的总连接数会发生变化。

代理不会提前保留所有这些连接。因此,您可以指定一个相对较大的百分比,只有当代理变得足够忙而需要它们时才会打开这些连接。

您可以选择等待连接可供应用程序使用的时间。创建代理时,该设置由 Connection borrow timeout (连接借用超时) 选项表示。该设置指定在返回超时错误之前等待连接池中的连接可用的时间。这适用于连接数达到最大而导致连接池中没有可用连接的情况。如果由于正在进行故障转移操作而没有可用的写入器实例,那么这也适用。通过使用此设置,您可以为应用程序设置最佳等待期,而无需更改应用程序代码中的查询超时。

避免固定

当数据库请求不依赖于先前请求的状态信息时,多路复用效率更高。在这种情况下,RDS Proxy 可以在每个事务结束时重用连接。此类状态信息的示例包括可通过 SETSELECT 语句更改的大多数变量和配置参数。默认情况下,客户端连接上的 SQL 事务可以在底层数据库连接之间多路复用。

与代理的连接可以进入一种称为固定的状态。固定连接后,每个后续事务将使用相同的底层数据库连接,直到会话结束。在会话结束之前,其他客户端连接也不能重用该数据库连接。客户端连接断开时,会话结束。

当 RDS Proxy 检测到不适合其他会话的会话状态更改时,它会自动将客户端连接固定到特定的数据库连接。固定降低了连接重用的有效性。如果您的所有连接或几乎所有连接都遇到固定,请考虑修改应用程序代码或工作负载,以减少导致固定的条件。

例如,如果您的应用程序更改了会话变量或配置参数,则后续语句可以依赖将要生效的新变量或参数。因此,当 RDS Proxy 处理更改会话变量或配置设置的请求时,它会将该会话固定到数据库连接。这样,会话状态对于同一会话中的所有后续事务仍然有效。

这项规则并不对您可以设置的所有参数均适用。RDS Proxy 会跟踪对字符集、排序规则、时区、自动提交、当前数据库、SQL 模式和 session_track_schema 设置的更改。因此在您修改这些内容时,RDS Proxy 不会固定会话。在这种情况下,RDS Proxy 仅将连接重用于具有相同设置值的其他会话。

RDS Proxy 的性能优化包括尝试通过最小化固定来最大化事务级别连接重用(多路复用)。为此,您可以执行以下操作:

  • 避免可能导致固定的不必要的数据库请求。

  • 在所有连接中一致地设置变量和配置设置。这样,后续会话更有可能重用具有这些特定设置的连接。

    但是,对于 PostgreSQL 设置,变量会导致会话固定。

  • 将会话固定筛选条件应用于代理。您可以免除某些类型的操作,使其不固定会话(如果您知道这样做不会影响应用程序的正确操作)。

  • 通过监控 CloudWatch 指标 DatabaseConnectionsCurrentlySessionPinned 来查看固定的发生频率。有关该指标和其他 CloudWatch 指标的信息,请参阅 使用 Amazon CloudWatch 监控 RDS Proxy

  • 如果您使用 SET 语句为每个客户端连接执行相同的初始化,则可以在保留事务级别多路复用的同时执行此操作。在这种情况下,您将设置初始会话状态的语句移动到由代理使用的初始化查询中。该属性是一个字符串,包含一个或多个 SQL 语句(用分号分隔)。

    例如,您可以为设置特定配置参数的代理定义初始化查询。然后,每当为该代理设置新连接时,RDS Proxy 都会应用这些设置。您可以从应用程序代码中删除相应的 SET 语句,这样,它们就不会干扰事务级别多路复用。

    重要

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

对于以下情况(其中多路复用可能会导致意外行为),代理将会话固定到当前连接:

  • 文本大小大于 16 KB 的任何语句都会导致代理固定会话。

  • 预编译语句会导致代理固定会话。无论预编译语句使用 SQL 文本还是二进制协议,这项规则都适用。

  • 显式 MySQL 语句 LOCK TABLELOCK TABLESFLUSH TABLES WITH READ LOCK 会导致代理固定会话。

  • 设置用户变量或系统变量(有些例外)会导致代理固定会话。如果这种情况过多地减少了连接重用,您可以选择让 SET 操作不导致固定。有关如何通过设置 SessionPinningFilters 属性来执行此操作的信息,请参阅创建 RDS Proxy

  • 创建临时表会导致代理固定会话。这样,无论事务边界如何,临时表的内容都会在整个会话期间保留。

  • 调用 MySQL 函数 ROW_COUNTFOUND_ROWSLAST_INSERT_ID 有时会导致固定。

    这些函数导致固定的确切情况在与 MySQL 5.6 和 MySQL 5.7 兼容的 Aurora MySQL 版本之间可能有所不同。

调用 MySQL 存储过程和存储函数不会导致固定。RDS Proxy 不会检测此类调用导致的任何会话状态更改。因此,请确保您的应用程序不会更改存储例程中的会话状态,并依赖该会话状态跨事务持续存在。例如,如果存储过程创建了一个旨在跨事务持续存在的临时表,则该应用程序当前不与 RDS Proxy 兼容。

对于 PostgreSQL,以下交互会导致固定:

  • 使用 SET 命令

  • 使用扩展查询协议,例如使用 JDBC 默认设置

  • 创建临时序列、表或视图

  • 声明游标

  • 丢弃会话状态

  • 监听通知频道

  • 加载库模块,如 auto_explain

  • 使用函数操作序列,例如 nextvalsetval

  • 使用函数与锁定交互,例如 pg_advisory_lockpg_try_advisory_lock

  • 使用预编译语句,设置参数或将参数重置为其默认值

如果您拥有关于应用程序行为的专业知识,则可以跳过某些应用程序语句的固定行为。为此,请在创建代理时选择会话固定筛选条件选项。当前,您可以选择退出会话固定,以设置会话变量和配置设置。

有关代理的固定发生频率的指标,请参阅使用 Amazon CloudWatch 监控 RDS Proxy

删除 RDS Proxy

如果您不再需要某个代理,可以将其删除。您可能因为正在使用某个代理的应用程序不再相关而删除该代理。或者,如果您停止使用数据库实例或与其关联的集群,则可以删除代理。

删除代理

  1. 登录 Amazon Web Services Management Console 并通过以下网址打开 Amazon RDS 控制台:https://console.amazonaws.cn/rds/

  2. 在导航窗格中,选择 Proxies (代理)

  3. 从列表中选择要删除的代理。

  4. 选择 Delete Proxy (删除代理)

要删除数据库代理,请使用 Amazon CLI 命令 delete-db-proxy。要删除相关的关联,还可以使用 deregister-db-proxy-targets 命令。

aws rds delete-db-proxy --name proxy_name
aws rds deregister-db-proxy-targets --db-proxy-name proxy_name [--target-group-name target_group_name] [--target-ids comma_separated_list] # or [--db-instance-identifiers instance_id] # or [--db-cluster-identifiers cluster_id]

要删除数据库代理,请调用 Amazon RDS API 函数 DeleteDBProxy。要删除相关的项目和关联,您还可以调用函数 DeleteDBProxyTargetGroupDeregisterDBProxyTargets

使用 Amazon CloudWatch 监控 RDS Proxy

您可以使用 Amazon CloudWatch 监控 RDS Proxy。CloudWatch 可从代理收集原始数据,并将数据处理为便于读取的近乎实时的指标。要在 CloudWatch 控制台中查找这些指标,请依次选择 Metrics (指标)RDSPer-Proxy Metrics (每个代理指标)。有关更多信息,请参阅 Amazon CloudWatch 用户指南 中的使用 Amazon CloudWatch 指标

注意

RDS 为与代理关联的每个底层 Amazon EC2 实例发布这些指标。一个代理可能由多个 EC2 实例提供服务。使用 CloudWatch 统计数据可汇总所有关联实例的代理值。

其中一些指标可能在代理第一次成功连接之后才可见。

在 RDS Proxy 日志中,每个条目都以关联的代理终端节点的名称作为前缀。此名称可以是您为用户定义的终端节点指定的名称,也可以是特殊名称 default,用于使用代理的默认终端节点提出读/写请求。

所有 RDS Proxy 指标都在 proxy 组中。

每个代理终端节点都有自己的 CloudWatch 指标。您可以单独监控每个代理终端节点的使用情况。有关代理终端节点的更多信息,请参阅 Amazon RDS Proxy 的终端节点

您可以使用以下维度集之一聚合每个指标的值。例如,通过使用 ProxyName 维度集,您可以分析特定代理的所有流量。通过使用其他维度集,您可以用不同的方式拆分指标。您可以根据每个代理的不同终端节点或目标数据库,或者每个数据库的读/写和只读流量来拆分指标。

  • 维度集 1:ProxyName

  • 维度集 2:ProxyNameEndpointName

  • 维度集 3:ProxyNameTargetGroupTarget

  • 维度集 4:ProxyNameTargetGroupTargetRole

指标 描述 有效期 CloudWatch 维度集

AvailabilityPercentage

目标组在维度指示的角色中可用的时间百分比。每分钟报告一次此指标。此指标最有用的统计数据是 Average

1 minute 维度集 4
ClientConnections

当前客户端连接数。每分钟报告一次此指标。此指标最有用的统计数据是 Sum

1 minute

维度集 1维度集 2
ClientConnectionsClosed

已关闭的客户端连接数。此指标最有用的统计数据是 Sum

1 分钟及更久

维度集 1维度集 2

ClientConnectionsNoTLS

当前没有传输层安全性 (TLS) 的客户端连接的数量。每分钟报告一次此指标。此指标最有用的统计数据是 Sum 1 分钟及更久 维度集 1维度集 2

ClientConnectionsReceived

收到的客户端连接请求数。此指标最有用的统计数据是 Sum

1 分钟及更久

维度集 1维度集 2
ClientConnectionsSetupFailedAuth

由于身份验证或 TLS 配置错误而失败的客户端连接尝试次数。此指标最有用的统计数据是 Sum

1 分钟及更久

维度集 1维度集 2
ClientConnectionsSetupSucceeded

使用任何具有或不具有 TLS 的身份验证机制成功建立的客户端连接数。此指标最有用的统计数据是 Sum

1 分钟及更久

维度集 1维度集 2
ClientConnectionsTLS 当前具有 TLS 的客户端连接的数量。每分钟报告一次此指标。此指标最有用的统计数据是 Sum 1 分钟及更久 维度集 1维度集 2
DatabaseConnectionRequests

创建数据库连接的请求数。此指标最有用的统计数据是 Sum

1 分钟及更久

维度集 1维度集 3维度集 4

DatabaseConnectionRequestsWithTLS

创建具有 TLS 的数据库连接的请求数。此指标最有用的统计数据是 Sum 1 分钟及更久 维度集 1维度集 3维度集 4
DatabaseConnections

当前数据库连接数。每分钟报告一次此指标。此指标最有用的统计数据是 Sum

1 minute

维度集 1维度集 3维度集 4

DatabaseConnectionsBorrowLatency

被监视的代理建立数据库连接所花费的时间(以微秒为单位)。此指标最有用的统计数据是 Average 1 分钟及更久 维度集 1维度集 2
DatabaseConnectionsCurrentlyBorrowed

当前处于借用状态的数据库连接数。每分钟报告一次此指标。此指标最有用的统计数据是 Sum

1 minute

维度集 1维度集 3维度集 4
DatabaseConnectionsCurrentlyInTransaction

事务中的当前数据库连接数。每分钟报告一次此指标。此指标最有用的统计数据是 Sum

1 minute

维度集 1维度集 3维度集 4
DatabaseConnectionsCurrentlySessionPinned

由于客户端请求中更改会话状态的操作,当前固定的当前数据库连接数。每分钟报告一次此指标。此指标最有用的统计数据是 Sum

1 minute

维度集 1维度集 3维度集 4
DatabaseConnectionsSetupFailed

失败的数据库连接请求数。此指标最有用的统计数据是 Sum

1 分钟及更久

维度集 1维度集 3维度集 4
DatabaseConnectionsSetupSucceeded

使用或不使用 TLS 成功建立的数据库连接数。此指标最有用的统计数据是 Sum

1 分钟及更久

维度集 1维度集 3维度集 4

DatabaseConnectionsWithTLS

具有 TLS 的当前数据库连接数。每分钟报告一次此指标。此指标最有用的统计数据是 Sum 1 minute 维度集 1维度集 3维度集 4
MaxDatabaseConnectionsAllowed

允许的最大数据库连接数。每分钟报告一次此指标。此指标最有用的统计数据是 Sum

1 minute

维度集 1维度集 3维度集 4

QueryDatabaseResponseLatency

数据库响应查询所花费的时间(以微秒为单位)。此指标最有用的统计数据是 Average 1 分钟及更久 维度集 1维度集 2维度集 3维度集 4
QueryRequests

收到的查询数。包含多个语句的查询被计为一个查询。此指标最有用的统计数据是 Sum

1 分钟及更久

维度集 1维度集 2
QueryRequestsNoTLS 从非 TLS 连接收到的查询数。包含多个语句的查询被计为一个查询。此指标最有用的统计数据是 Sum 1 分钟及更久 维度集 1维度集 2

QueryRequestsTLS

从 TLS 连接收到的查询数。包含多个语句的查询被计为一个查询。此指标最有用的统计数据是 Sum 1 分钟及更久 维度集 1维度集 2
QueryResponseLatency 从获取查询请求到代理响应该请求的时间(以微秒为单位)。此指标最有用的统计数据是 Average 1 分钟及更久 维度集 1维度集 2

Amazon RDS Proxy 的终端节点

接下来,您可以了解 RDS Proxy 的终端节点以及如何使用它们。通过使用终端节点,您可以利用以下功能:

  • 您可以将多个终端节点与代理结合使用,以独立地监视来自不同应用程序的连接并对其进行故障排除。

  • 您可以将读取器终端节点与 Aurora 数据库集群结合使用,提高查询密集型应用程序的读取可扩展性和高可用性。

  • 您可以使用跨 VPC 终端节点来允许从资源(如其他 VPC 中的 Amazon EC2 实例)访问一个 VPC 中的数据库。

代理终端节点概述

使用 RDS Proxy 终端节点所涉及的过程与使用 Aurora 数据库集群和读取器终端节点以及 RDS 实例终端节点相同。如果您不熟悉 Aurora 终端节点,请参阅 Amazon Aurora 连接管理

默认情况下,在将 RDS Proxy 与 Aurora 集群结合使用时所连接的终端节点具有读/写功能。因此,此终端节点会将所有请求发送到集群的写入器实例,并且所有这些连接都将计入写入器实例的 max_connections 值。如果您的代理与 Aurora 数据库集群关联,您可以为该代理创建额外的读/写或只读终端节点。

您可以将只读终端节点与代理结合用于只读查询,就像您将读取器终端节点用于 Aurora 预置集群一样。这样做可以帮助您利用具有一个或多个读取器数据库实例的 Aurora 集群的读取可扩展性。通过使用只读终端节点并根据需要向 Aurora 集群中添加更多读取器数据库实例,您可以运行更多的同时查询并建立更多的同时连接。

提示

使用 Amazon Web Services Management Console 为 Aurora 集群创建代理时,可以选择让 RDS Proxy 自动创建读取器终端节点。有关读取器终端节点优点的信息,请参阅 将读取器终端节点与 Aurora 集群结合使用

对于您创建的代理终端节点,您还可以将终端节点与代理本身使用的其他 Virtual Private Cloud (VPC) 关联。这样,您可以从其他 VPC 连接到代理,例如,组织内其他应用程序使用的 VPC。两个 VPC 必须由同一 Amazon 账户拥有。

有关与代理终端节点关联的限制的信息,请参阅 代理终端节点的限制

在 RDS Proxy 日志中,每个条目都以关联的代理终端节点的名称作为前缀。此名称可以是您为用户定义的终端节点指定的名称,也可以是使用代理的默认终端节点的读/写请求的特殊名称 default

每个代理终端节点都有自己的 CloudWatch 指标集合。您可以监视代理的所有终端节点的指标。您还可以监视特定终端节点或代理的所有读/写或只读终端节点的指标。有关更多信息,请参阅 使用 Amazon CloudWatch 监控 RDS Proxy

代理终端节点使用与其关联的代理相同的身份验证机制。RDS Proxy 会自动为用户定义的终端节点设置权限和授权,并与关联的代理的属性保持一致。

将读取器终端节点与 Aurora 集群结合使用

在将 RDS Proxy 与 Aurora 集群结合使用时,可以创建并连接到称为读取器终端节点的只读终端节点。这些读取器终端节点有助于提高查询密集型应用程序的读取可扩展性。如果集群中的读取器数据库实例变得不可用,读取器终端节点还有助于提高连接的可用性。

注意

当您将新的终端节点指定为只读时,RDS Proxy 要求 Aurora 集群有一个或多个读取器数据库实例。如果将代理的目标更改为只包含单个写入器的 Aurora 集群或多写入器 Aurora 集群,对读取器终端节点的任何请求都会失败并显示错误。如果代理的目标是 RDS 实例而不是 Aurora 集群,则请求也会失败。

如果 Aurora 集群具有读取器实例,但这些实例不可用,则 RDS Proxy 会等待发送请求,而不是立即返回错误。如果在连接借用超时期间没有读取器实例变为可用,则请求将失败并显示错误。

读取器终端节点如何帮助提高应用程序可用性

在某些情况下,集群中的一个或多个读取器实例可能会变得不可用。如果是这样,使用数据库代理的读取器终端节点的连接比使用 Aurora 读取器终端节点的连接恢复得更快。RDS Proxy 仅将连接路由到集群中的可用读取器实例。当实例变为不可用时,不会由于 DNS 缓存而造成延迟。

如果连接是多路复用的,则 RDS Proxy 会将后续查询定向到其他读取器数据库实例,而不会中断您的应用程序。在自动切换到新的读取器实例的过程中,RDS Proxy 会检查新旧读取器实例的复制滞后。RDS Proxy 确保新的读取器实例是最新的,并且与先前的读取器实例具有相同的更改。这样,当 RDS Proxy 从一个读取器数据库实例切换到另一个读取器数据库实例时,您的应用程序将永远不会看到过时的数据。

如果连接是固定的,则该连接中的下一个查询将返回错误。但是,您的应用程序可以立即重新连接到同一终端节点。RDS Proxy 会将连接路由到处于 available 状态的其他读取器数据库实例。在手动重新连接时,RDS Proxy 不会检查新旧读取器实例之间的复制滞后。

如果您的 Aurora 集群没有可用的读取器实例,则 RDS Proxy 会检查此情况是暂时的还是永久的。每种情况下的行为如下:

  • 假设您的集群有一个或多个读取器数据库实例,但它们都没有处于 Available 状态。例如,所有读取器实例可能都正在重启或遇到问题。在这种情况下,连接到读取器终端节点的尝试将等待读取器实例变为可用。如果在连接借用超时期间没有读取器实例变为可用,则连接尝试将失败。如果读取器实例变为可用,则连接尝试成功。

  • 假设您的集群没有读取器数据库实例。在这种情况下,RDS Proxy 会在您尝试连接到读取器终端节点时立即返回错误。要解决此问题,请在连接到读取器终端节点之前将一个或多个读取器实例添加到集群中。

读取器终端节点如何帮助提高查询可扩展性

代理的读取器终端节点通过以下方式帮助提高 Aurora 查询可扩展性:

  • 当您将读取器实例添加到 Aurora 集群时,RDS Proxy 可以将到任何读取器终端节点的新连接路由到其他读取器实例。这样,使用一个读取器终端节点连接执行的查询不会减慢使用另一个读取器终端节点连接执行的查询。查询在单独的数据库实例上运行。每个数据库实例都有其自己的计算资源、缓冲区缓存等。

  • 在可行的情况下,RDS Proxy 使用特定的读取器终端节点连接对所有查询问题使用相同的读取器数据库实例。这样,对相同表的一组相关查询就可以利用特定数据库实例上的缓存、计划优化等优势。

  • 如果读取器数据库实例变为不可用,则对应用程序的影响取决于会话是多路复用的还是固定的。如果会话是多路复用的,则 RDS Proxy 会将所有后续查询路由到其他读取器数据库实例,而无需您执行任何操作。如果会话是固定的,则您的应用程序将出现错误,必须重新连接。您可以立即重新连接到读取器终端节点,RDS Proxy 会将连接路由到可用的读取器数据库实例。有关代理会话的多路复用和固定的更多信息,请参阅 RDS Proxy 概念概述

  • 集群中拥有的读取器数据库实例越多,使用读取器终端节点可以建立的同时连接越多。例如,假设您的集群有四个读取器数据库实例,每个实例都配置为允许 200 个同时连接。假设您的代理配置为使用最大连接数的 50%。在这种情况下,对于读取器 1,您可以通过代理中的读取器终端节点建立的最大连接数为100(200 的 50%)。对于读取器 2 来说,也是 100,依此类推,总共是 400。如果将集群中的读取器数据库实例的数量增加一倍至 8,则通过读取器终端节点的最大连接数也将增加一倍,达到 800。

使用读取器终端节点的示例

以下 Linux 示例显示了如何确认您已通过读取器终端节点连接到 Aurora MySQL 集群。innodb_read_only 配置设置已启用。执行写操作(例如 CREATE DATABASE 语句)的尝试失败并显示错误。您可以通过使用 aurora_server_id 变量检查数据库实例名称来确认您已连接到读取器数据库实例。

提示

不要只依靠检查数据库实例名称来确定连接是读/写还是只读。请记住,发生故障转移时,Aurora 集群中的数据库实例可以在写入器和读取器之间更改角色。

$ mysql -h endpoint-demo-reader.endpoint.proxy-demo.us-east-1.rds.amazonaws.com -u admin -p ... mysql> select @@innodb_read_only; +--------------------+ | @@innodb_read_only | +--------------------+ | 1 | +--------------------+ mysql> create database shouldnt_work; ERROR 1290 (HY000): The MySQL server is running with the --read-only option so it cannot execute this statement mysql> select @@aurora_server_id; +---------------------------------------+ | @@aurora_server_id | +---------------------------------------+ | proxy-reader-endpoint-demo-instance-3 | +---------------------------------------+

以下示例显示您与代理读取器终端节点的连接如何在删除读取器数据库实例时仍正常工作。在本示例中,Aurora 集群具有两个读取器实例,instance-5507instance-7448。读取器终端节点的连接开始时使用其中一个读取器实例。在该示例中,此读取器实例被 delete-db-instance 命令删除。RDS Proxy 会切换到其他读取器实例以进行后续查询。

$ mysql -h reader-demo.endpoint.proxy-demo.us-east-1.rds.amazonaws.com -u my_user -p ... mysql> select @@aurora_server_id; +--------------------+ | @@aurora_server_id | +--------------------+ | instance-5507 | +--------------------+ mysql> select @@innodb_read_only; +--------------------+ | @@innodb_read_only | +--------------------+ | 1 | +--------------------+ mysql> select count(*) from information_schema.tables; +----------+ | count(*) | +----------+ | 328 | +----------+

mysql 会话仍在运行时,以下命令将删除读取器终端节点连接到的读取器实例。

aws rds delete-db-instance --db-instance-identifier instance-5507 --skip-final-snapshot

mysql 会话中的查询无需重新连接即可继续工作。RDS Proxy 会自动切换到其他读取器数据库实例。

mysql> select @@aurora_server_id; +--------------------+ | @@aurora_server_id | +--------------------+ | instance-7448 | +--------------------+ mysql> select count(*) from information_schema.TABLES; +----------+ | count(*) | +----------+ | 328 | +----------+

访问 VPC 中的 Aurora和 RDS 数据库

默认情况下,RDS 的组件和 Aurora 技术堆栈都在同一个 Amazon VPC 中。例如,假设一个在 Amazon EC2 实例上运行的应用程序连接到 Amazon RDS 数据库实例或 Aurora 数据库集群。在这种情况下,应用程序服务器和数据库必须都位于同一 VPC 内。

通过 RDS Proxy,您可以设置从一个 VPC 中的资源(例中,EC2 实例)访问另一个 VPC 中的 Aurora 集群或 RDS 实例。例如,您的组织可能有多个应用程序访问同一数据库资源。每个应用程序都可能位于自己的 VPC 中。要通过 RDS Proxy 使用跨 VPC 功能,所有 VPC 必须归同一个 Amazon 账户所有。

要启用跨 VPC 访问,您需要为代理创建一个新的终端节点。如果您不熟悉如何创建代理终端节点,请参阅 Amazon RDS Proxy 的终端节点 以了解详细信息。代理本身与 Aurora 数据库集群或 RDS 实例位于同一个 VPC 中。但是,跨 VPC 终端节点与 EC2 实例等其他资源一起位于另一个 VPC 中。跨 VPC 终端节点与 EC2 和其他资源所在的 VPC 中的子网和安全组关联。通过这些关联,您可以从原本由于 VPC 限制而无法访问数据库的应用程序连接到终端节点。

以下步骤说明了如何通过 RDS Proxy 创建和访问跨 VPC 终端节点:

  1. 创建两个 VPC,或者选择已用于 Aurora 和 RDS 工作的两个 VPC。每个 VPC 都应该有自己的关联网络资源,例如互联网网关、路由表、子网和安全组。如果您只有一个 VPC,可以查阅 开始使用 Amazon Aurora,了解设置另一个 VPC 以成功使用 Aurora 的步骤。 您还可以查看 Amazon EC2 控制台中的现有 VPC,了解要将哪些类型的资源连接起来。

  2. 创建一个与要连接到的 Aurora 数据库集群或 RDS 实例关联的数据库代理。按照创建 RDS Proxy中过程操作。

  3. 在 RDS 控制台中的代理的 Details(详细信息)页面上,在 Proxy endpoints(代理终端节点)部分下,选择 Create endpoint(创建终端节点)。按照创建代理终端节点中过程操作。

  4. 选择将跨 VPC 终端节点设置为读/写还是只读。

  5. 不接受默认的与 Aurora 数据库集群或 RDS 实例所在相同的 VPC,而是选择其他 VPC。此 VPC 必须与代理所在的 VPC 位于同一 Amazon 区域中。

  6. 现在不接受来自与 Aurora 数据库集群或 RDS 实例所在同一 VPC 中的默认子网和安全组,而是进行新的选择。根据您选择的 VPC 中的子网和安全组进行这些选择。

  7. 您无需更改 Secrets Manager 密钥的任何设置。相同的凭证适用于代理的所有终端节点,无论每个终端节点位于哪个 VPC 中均是如此。

  8. 等待新终端节点达到 Available(可用)状态。

  9. 记下终端节点的完整名称。这是以 Region_name.rds.amazonaws.com 为结尾的值,您提供此值作为数据库应用程序连接字符串的一部分。

  10. 从与该终端节点位于同一 VPC 中的资源访问新的终端节点。测试此过程的一种简单方法是在此 VPC 中创建一个新的 EC2 实例。然后您可以登录 EC2 实例并运行 mysqlpsql 命令,以使用连接字符串中的终端节点值进行连接。

创建代理终端节点

创建代理终终端节点

  1. 登录 Amazon Web Services Management Console 并通过以下网址打开 Amazon RDS 控制台:https://console.amazonaws.cn/rds/

  2. 在导航窗格中,选择 Proxies (代理)

  3. 单击您要为其创建新终端节点的代理的名称。

    此时将显示该代理的详细信息页面。

  4. Proxy endpoints(代理终端节点)部分中,选择 Create proxy endpoint(创建代理终端节点)

    此时将显示 Create proxy endpoint(创建代理终端节点)窗口。

  5. 对于 Proxy endpoint name(代理终端节点名称),输入您选择的描述性名称。

  6. 对于 Target role(目标角色),选择将终端节点设置为读/写还是只读。

    使用读/写终端节点的连接可以执行任何类型的操作:数据定义语言 (DDL) 语句、数据操作语言 (DML) 语句和查询。这些终端节点始终连接到 Aurora 集群的主实例。仅在应用程序中使用单个终端节点时,可以将读/写终端节点用于常规数据库操作。您还可以将读/写终端节点用于管理操作、联机事务处理 (OLTP) 应用程序和提取-转换-加载 (ETL) 作业。

    使用只读终端节点的连接只能执行查询。当 Aurora 集群中有多个读取器实例时,RDS Proxy 可以为终端节点的每个连接使用不同的读取器实例。这样,查询密集型应用程序就可以利用 Aurora 的集群功能。您可以通过添加更多读取器数据库实例来向集群添加更多查询容量。这些只读连接不会在集群的主实例上增加任何开销。这样,您的报告和分析查询就不会减慢 OLTP 应用程序的写入操作。

  7. 对于 Virtual Private Cloud (VPC),如果计划从您通常在那里访问代理或其关联数据库的相同 EC2 实例或其他资源访问终端节点,请选择默认值。如果要为此代理设置跨 VPC 访问,请选择默认值以外的 VPC。有关跨 VPC 访问的更多信息,请参阅 访问 VPC 中的 Aurora和 RDS 数据库

  8. 对于子网,默认情况下,RDS Proxy 会填充与关联代理相同的子网。如果要限制对终端节点的访问,以便只有 VPC 的地址范围的一部分能够与其连接,请从一组选择中删除一个或多个子网。

  9. 对于 VPC 安全组,您可以选择一个现有安全组或创建一个新的安全组。默认情况下,RDS Proxy 会填充与关联代理相同的一个或多个安全组。如果代理的入站和出站规则适用于此终端节点,则可以保留默认选项。

    如果选择创建新的安全组,请在此页面上为该安全组指定一个名称。然后,从 EC2 控制台编辑安全组设置。

  10. 选择 Create proxy endpoint(创建代理终端节点)

要创建代理终端节点,请使用 Amazon CLIcreate-db-proxy-endpoint 命令。

包括以下必需参数:

  • --db-proxy-name value

  • --db-proxy-endpoint-name value

  • --vpc-subnet-ids list_of_ids。用空格分隔子网 ID。您无需指定 VPC 本身的 ID。

您还可以包括以下可选参数:

  • --target-role { READ_WRITE | READ_ONLY }。此参数默认为 READ_WRITEREAD_ONLY 值仅对包含一个或多个读取器数据库实例的 Aurora 预置集群有影响。当代理与 RDS 实例或仅包含写入器数据库实例的 Aurora 集群相关联时,您不能指定 READ_ONLY 有关将只读终端节点与 Aurora 集群结合使用的详细信息,请参阅 将读取器终端节点与 Aurora 集群结合使用

  • --vpc-security-group-ids value。用空格分隔安全组 ID。如果省略此参数,则 RDS Proxy 使用 VPC 的默认安全组。RDS Proxy 根据您为 --vpc-subnet-ids 参数指定的子网 ID 确定 VPC。

下面的示例用于创建一个名为 my-endpoint 的代理终端节点。

对于 Linux、macOS 或 Unix:

aws rds create-db-proxy-endpoint \ --db-proxy-name my-proxy \ --db-proxy-endpoint-name my-endpoint \ --vpc-subnet-ids subnet_id subnet_id subnet_id ... \ --target-role READ_ONLY \ --vpc-security-group-ids security_group_id ]

对于 Windows:

aws rds create-db-proxy-endpoint ^ --db-proxy-name my-proxy ^ --db-proxy-endpoint-name my-endpoint ^ --vpc-subnet-ids subnet_id_1 subnet_id_2 subnet_id_3 ... ^ --target-role READ_ONLY ^ --vpc-security-group-ids security_group_id

要创建代理终端节点,请使用 RDS API CreateProxyEndpoint 操作。

查看代理终端节点

查看代理终端节点的详细信息

  1. 登录 Amazon Web Services Management Console 并通过以下网址打开 Amazon RDS 控制台:https://console.amazonaws.cn/rds/

  2. 在导航窗格中,选择 Proxies (代理)

  3. 在列表中,选择要查看其终端节点的代理。单击代理名称以查看其详细信息页面。

  4. Proxy endpoints(代理终端节点)部分中,选择要查看的终端节点。单击其名称以查看详细信息页面。

  5. 检查您对其值感兴趣的参数。您可以检查以下属性:

    • 终端节点是读/写还是只读。

    • 您在数据库连接字符串中使用的终端节点地址。

    • 与终端节点关联的 VPC、子网和安全组。

要查看一个或多个数据库代理终端节点,请使用 Amazon CLI describe-db-proxy-endpoints 命令。

您可以包括以下参数:

  • --db-proxy-endpoint-name

  • --db-proxy-name

以下示例描述了 my-endpoint 代理终端节点:

对于 Linux、macOS 或 Unix:

aws rds describe-db-proxy-endpoints \ --db-proxy-endpoint-name my-endpoint

对于 Windows:

aws rds describe-db-proxy-endpoints ^ --db-proxy-endpoint-name my-endpoint

要描述一个或多个代理终端节点,请使用 RDS API DescribeDBProxyEndpoints 操作。

修改代理终端节点

修改一个或多个代理终端节点

  1. 登录 Amazon Web Services Management Console 并通过以下网址打开 Amazon RDS 控制台:https://console.amazonaws.cn/rds/

  2. 在导航窗格中,选择 Proxies (代理)

  3. 在列表中,选择要修改其终端节点的代理。单击代理名称以查看其详细信息页面。

  4. Proxy endpoints(代理终端节点)部分中,选择要修改的终端节点。您可以在列表中选择它,也可以单击其名称以查看详细信息页面。

  5. 在代理详细信息页面上的 Proxy endpoints(代理终端节点)部分中,选择 Edit(编辑)。或在代理终端节点详细信息页面上,对 Actions(操作)项选择 Edit(编辑)

  6. 更改要修改的参数的值。

  7. 选择 Save changes

要修改数据库代理终端节点,请使用 Amazon CLI modify-db-proxy-endpoint 命令和以下必需参数:

  • --db-proxy-endpoint-name

使用以下一个或多个参数指定对终端节点属性的更改:

  • --new-db-proxy-endpoint-name

  • --vpc-security-group-ids。用空格分隔安全组 ID。

以下示例用于将 my-endpoint 代理终端节点重命名为 new-endpoint-name

对于 Linux、macOS 或 Unix:

aws rds modify-db-proxy-endpoint \ --db-proxy-endpoint-name my-endpoint \ --new-db-proxy-endpoint-name new-endpoint-name

对于 Windows:

aws rds modify-db-proxy-endpoint ^ --db-proxy-endpoint-name my-endpoint ^ --new-db-proxy-endpoint-name new-endpoint-name

要修改代理终端节点,请使用 RDS API ModifyDBProxyEndpoint 操作。

删除代理终端节点

您可以按照以下说明使用控制台删除代理的终端节点。

注意

您无法删除 RDS Proxy 自动为每个代理创建的默认终端节点。

删除代理时,RDS Proxy 会自动删除所有关联的终端节点。

使用 Amazon Web Services Management Console 删除代理终端节点

  1. 在导航窗格中,选择 Proxies (代理)

  2. 在列表中,选择要删除其终端节点的代理。单击代理名称以查看其详细信息页面。

  3. Proxy endpoints(代理终端节点)部分中,选择要删除的终端节点。您可以在列表中选择一个或多个终端节点,或单击单个终端节点的名称以查看详细信息页面。

  4. 在代理详细信息页面上的 Proxy endpoints(代理终端节点)部分中,选择 Delete(删除)。或在代理终端节点详细信息页面上,对 Actions(操作)项选择 Delete(编辑)

要删除代理终端节点,请运行 delete-db-proxy-endpoint 命令并包含以下必需参数:

  • --db-proxy-endpoint-name

以下命令用于删除名为 my-endpoint 的代理终端节点。

对于 Linux、macOS 或 Unix:

aws rds delete-db-proxy-endpoint \ --db-proxy-endpoint-name my-endpoint

对于 Windows:

aws rds delete-db-proxy-endpoint ^ --db-proxy-endpoint-name my-endpoint

要使用 RDS API 删除代理终端节点,请运行 DeleteDBProxyEndpoint 操作。对于 DBProxyEndpointName 参数,指定代理终端节点的名称。

代理终端节点的限制

每个代理都有一个默认终端节点,您可以修改但不能创建或删除默认终端节点。

代理的用户定义终端节点的最大数量为 20 个。因此,代理最多可以有 21 个终端节点:默认终端节点加上您创建的 20 个终端节点。

当您将其他终端节点与代理关联时,RDS Proxy 会自动确定集群中的哪些数据库实例用于每个终端节点。您无法像使用 Aurora 自定义终端节点那样选择特定实例。

要通过 RDS Proxy 使用跨 VPC 功能,所有 VPC 必须归同一个 Amazon 账户所有。

读取器终端节点不可用于 Aurora 多写入器集群。

您可以连接到使用 SSL 模式 REQUIREDVERIFY_CA 创建的代理终端节点。您无法连接到使用 SSL 模式 VERIFY_IDENTITY 创建的终端节点。

RDS Proxy 命令行示例

要了解连接命令和 SQL 语句的组合如何与 RDS Proxy 交互,请查看以下示例。

在故障转移时保留与 MySQL 数据库的连接

本 MySQL 示例演示了打开的连接在故障转移(例如当您重新启动数据库或数据库由于某个问题而变得不可用时)期间如何继续工作。本示例使用一个名为 the-proxy 的代理,以及一个包含数据库实例 instance-8898instance-9814 的 Aurora 数据库集群。从 Linux 命令行运行 failover-db-cluster 命令时,代理连接到的写入器实例将更改为不同的数据库实例。您可以看到,与代理关联的数据库实例在连接保持打开状态时发生更改。

$ mysql -h the-proxy.proxy-demo.us-east-1.rds.amazonaws.com -u admin_user -p Enter password: ... mysql> select @@aurora_server_id; +--------------------+ | @@aurora_server_id | +--------------------+ | instance-9814 | +--------------------+ 1 row in set (0.01 sec) mysql> [1]+ Stopped mysql -h the-proxy.proxy-demo.us-east-1.rds.amazonaws.com -u admin_user -p $ # Initially, instance-9814 is the writer. $ aws rds failover-db-cluster --db-cluster-identifier cluster-56-2019-11-14-1399 JSON output $ # After a short time, the console shows that the failover operation is complete. $ # Now instance-8898 is the writer. $ fg mysql -h the-proxy.proxy-demo.us.us-east-1.rds.amazonaws.com -u admin_user -p mysql> select @@aurora_server_id; +--------------------+ | @@aurora_server_id | +--------------------+ | instance-8898 | +--------------------+ 1 row in set (0.01 sec) mysql> [1]+ Stopped mysql -h the-proxy.proxy-demo.us-east-1.rds.amazonaws.com -u admin_user -p $ aws rds failover-db-cluster --db-cluster-identifier cluster-56-2019-11-14-1399 JSON output $ # After a short time, the console shows that the failover operation is complete. $ # Now instance-9814 is the writer again. $ fg mysql -h the-proxy.proxy-demo.us-east-1.rds.amazonaws.com -u admin_user -p mysql> select @@aurora_server_id; +--------------------+ | @@aurora_server_id | +--------------------+ | instance-9814 | +--------------------+ 1 row in set (0.01 sec) +---------------+---------------+ | Variable_name | Value | +---------------+---------------+ | hostname | ip-10-1-3-178 | +---------------+---------------+ 1 row in set (0.02 sec)

调整 Aurora 数据库集群的 max_connections 设置

本示例演示如何调整 Aurora MySQL 数据库集群的 max_connections 设置。为此,请根据与 MySQL 5.6 或 5.7 兼容的集群的默认参数设置,创建自己的数据库集群参数组。您可以为 max_connections 设置指定一个值,从而覆盖设置默认值的公式。将数据库集群参数组与数据库集群关联。

export REGION=us-east-1 export CLUSTER_PARAM_GROUP=rds-proxy-mysql-56-max-connections-demo export CLUSTER_NAME=rds-proxy-mysql-56 aws rds create-db-parameter-group --region $REGION \ --db-parameter-group-family aurora5.6 \ --db-parameter-group-name $CLUSTER_PARAM_GROUP \ --description "Aurora MySQL 5.6 cluster parameter group for RDS Proxy demo." aws rds modify-db-cluster --region $REGION \ --db-cluster-identifier $CLUSTER_NAME \ --db-cluster-parameter-group-name $CLUSTER_PARAM_GROUP echo "New cluster param group is assigned to cluster:" aws rds describe-db-clusters --region $REGION \ --db-cluster-identifier $CLUSTER_NAME \ --query '*[*].{DBClusterParameterGroup:DBClusterParameterGroup}' echo "Current value for max_connections:" aws rds describe-db-cluster-parameters --region $REGION \ --db-cluster-parameter-group-name $CLUSTER_PARAM_GROUP \ --query '*[*].{ParameterName:ParameterName,ParameterValue:ParameterValue}' \ --output text | grep "^max_connections" echo -n "Enter number for max_connections setting: " read answer aws rds modify-db-cluster-parameter-group --region $REGION --db-cluster-parameter-group-name $CLUSTER_PARAM_GROUP \ --parameters "ParameterName=max_connections,ParameterValue=$$answer,ApplyMethod=immediate" echo "Updated value for max_connections:" aws rds describe-db-cluster-parameters --region $REGION \ --db-cluster-parameter-group-name $CLUSTER_PARAM_GROUP \ --query '*[*].{ParameterName:ParameterName,ParameterValue:ParameterValue}' \ --output text | grep "^max_connections"

RDS Proxy 故障排除

下面,您可以找到一些常见 RDS Proxy 问题的故障排除思路,以及有关 RDS Proxy 的 CloudWatch 日志的信息。

在 RDS Proxy 日志中,每个条目都以关联的代理终端节点的名称作为前缀。此名称可以是您为用户定义的终端节点指定的名称,也可以是使用代理的默认终端节点的读/写请求的特殊名称 default。有关代理终端节点的更多信息,请参阅 Amazon RDS Proxy 的终端节点

常见问题和解决方案

有关您在使用 RDS Proxy 时可能遇到的一些常见问题的可能原因和解决方案,请参阅以下内容。

创建新代理或连接到代理时,您可能会遇到以下问题。

错误 原因或解决方法

403: The security token included in the request is invalid

选择现有 IAM 角色,而不是选择创建新角色。

连接到 MySQL 代理时,您可能会遇到以下问题。

错误 原因或解决方法
ERROR 1040 (HY000): Connections rate limit exceeded (limit_value) 从客户端到代理的连接请求速率超过了限制。
ERROR 1040 (HY000): IAM authentication rate limit exceeded 从客户端到代理的具有 IAM 身份验证的并发请求数超过了限制。
ERROR 1040 (HY000): Number simultaneous connections exceeded (limit_value) 从客户端到代理的并发连接请求数超出了限制。

ERROR 1045 (28000): Access denied for user 'DB_USER'@'%' (using password: YES)

一些可能的原因包括:

  • 代理使用的 Secrets Manager 密钥与现有数据库用户的用户名和密码不匹配。更新 Secrets Manager 密钥中的凭证,或者确保数据库用户存在并且具有与密钥中的密码相同的密码。

ERROR 1105 (HY000): Unknown error 出现未知错误。
ERROR 1231 (42000): Variable ''character_set_client'' can't be set to the value of value

character_set_client 参数设置的值无效。例如,值 ucs2 无效,因为它会导致 MySQL 服务器崩溃。

ERROR 3159 (HY000): This RDS Proxy requires TLS connections.

您在代理中启用了需要传输层安全性设置,但您的连接将参数 ssl-mode=DISABLED 包含在 MySQL 客户端中。请执行以下任一操作:

  • 禁用代理的需要传输层安全性设置。

  • 在 MySQL 客户端中,使用最小设置 ssl-mode=REQUIRED 连接到数据库。

ERROR 2026 (HY000): SSL connection error: Internal Server Error

与代理的 TLS 握手失败。一些可能的原因包括:

  • SSL 是必需的,但服务器不支持它。

  • 发生内部服务器错误。

  • 发生握手错误。

ERROR 9501 (HY000): Timed-out waiting to acquire database connection

等待获取数据库连接时代理超时。一些可能的原因包括:

  • 代理无法建立数据库连接,因为已达到最大连接数

  • 代理无法建立数据库连接,因为数据库不可用。

连接到 PostgreSQL 代理时,您可能会遇到以下问题。

错误 原因 解决方案

IAM authentication is allowed only with SSL connections.

用户在 PostgreSQL 客户端中,尝试使用具有设置 sslmode=disable 的 IAM 身份验证连接到数据库。

用户需要在 PostgreSQL 客户端中使用最小设置 sslmode=require 连接到数据库。有关更多信息,请参阅 PostgreSQL SSL 支持文档。

This RDS Proxy requires TLS connections.

用户启用了需要传输层安全性选项,但尝试在 PostgreSQL 客户端中使用 sslmode=disable 进行连接。

要修复此错误,请执行以下操作之一:

  • 禁用代理的需要传输层安全性选项。

  • 在 PostgreSQL 客户端中,使用最小设置 sslmode=allow 连接到数据库。

IAM authentication failed for user user_name. Check the IAM token for this user and try again.

该错误可能是由于以下原因引起的:

  • 客户端提供了错误的 IAM 用户名。

  • 客户端向用户提供了错误的 IAM 授权令牌。

  • 客户端在使用没有所需权限的 IAM 策略。

  • 客户端向用户提供了过期的 IAM 授权令牌。

要修复此错误,请执行以下操作:

  1. 确认提供的 IAM 用户存在。

  2. 确认 IAM 授权令牌属于提供的 IAM 用户。

  3. 确认 IAM 策略具有足够的 RDS 权限。

  4. 检查所用 IAM 授权令牌的有效性。

This RDS proxy has no credentials for the role role_name. Check the credentials for this role and try again.

这个角色没有 Secrets Manager 密钥。

为此角色添加 Secrets Manager 密钥。

RDS supports only IAM or MD5 authentication.

用于连接到代理的数据库客户端正在使用代理当前不支持的身份验证机制,如 SCRAM-SHA-256。

如果您不使用 IAM 身份验证,请仅使用 MD5 密码身份验证。

A user name is missing from the connection startup packet. Provide a user name for this connection.

用于连接到代理的数据库客户端在尝试建立连接时未发送用户名。

请确保在使用您选择的 PostgreSQL 客户端设置与代理的连接时定义用户名。

Feature not supported: RDS Proxy supports only version 3.0 of the PostgreSQL messaging protocol.

用于连接到代理的 PostgreSQL 客户端使用早于 3.0 的协议。

使用支持 3.0 消息传递协议的较新 PostgreSQL 客户端。如果您使用的是 PostgreSQL psql CLI,请使用大于或等于 7.4 的版本。

Feature not supported: RDS Proxy currently doesn't support streaming replication mode.

用于连接到代理的 PostgreSQL 客户端正在尝试使用流复制模式,该模式目前不受 RDS 代理支持。

在用于连接的 PostgreSQL 客户端中关闭流复制模式。

Feature not supported: RDS Proxy currently doesn't support the option option_name.

通过启动消息,用于连接到代理的 PostgreSQL 客户端正在请求 RDS 代理当前不支持的选项。

在用于连接的 PostgreSQL 客户端中,关闭上述消息中显示为不支持的选项。

The IAM authentication failed because of too many competing requests.

从客户端到代理的具有 IAM 身份验证的并发请求数超过了限制。

降低使用 PostgreSQL 客户端中的 IAM 身份验证建立连接的速率。

The maximum number of client connections to the proxy exceeded number_value.

从客户端到代理的并发连接请求数超出了限制。

减少从 PostgreSQL 客户端到此 RDS 代理的活动连接数。

Rate of connection to proxy exceeded number_value.

从客户端到代理的连接请求速率超过了限制。

降低从 PostgreSQL 客户端建立连接的速率。

The password that was provided for the role role_name is wrong.

此角色的密码与 Secrets Manager 密钥不匹配。

检查 Secrets Manager 中此角色的密钥,以查看密码是否与 PostgreSQL 客户端中使用的密码相同。

The IAM authentication failed for the role role_name. Check the IAM token for this role and try again.

用于 IAM 身份验证的 IAM 令牌存在问题。

生成新的身份验证令牌并在新连接中使用它。

IAM is allowed only with SSL connections.

客户端尝试使用 IAM 身份验证进行连接,但未启用 SSL。

在 PostgreSQL 客户端中启用 SSL。

Unknown error.

出现未知错误。

联系 Amazon Support,以便我们调查此问题。

Timed-out waiting to acquire database connection.

等待获取数据库连接时代理超时。一些可能的原因包括:

  • 代理无法建立数据库连接,因为已达到最大连接数。

  • 代理无法建立数据库连接,因为数据库不可用。

可能的解决方案:

  • 检查 RDS 数据库实例或 Aurora 数据库集群状态的目标,以查看它是否不可用。

  • 检查是否有长时间运行的事务和/或查询正在执行。它们可以长时间使用连接池中的数据库连接。

Request returned an error: database_error.

从代理建立的数据库连接返回错误。

解决方案取决于特定的数据库错误。示例为:Request returned an error: database "your-database-name" does not exist。这意味着指定的数据库名称或用作数据库名称的用户名(如果尚未指定数据库名称)不存在于数据库服务器中。

使用 RDS Proxy 的 CloudWatch 日志

您可以在 Amazon Web Services Management Console 中的 CloudWatch 下找到 RDS Proxy 活动的日志。每个代理在 Log groups (日志组) 页面中都有一个条目。

重要

这些日志供相关人员进行故障排除,而不是用于编程访问。日志的格式和内容可能会发生变化。

特别是,较旧的日志不包含指示每个请求的终端节点的任何前缀。在较新的日志中,每个条目都以关联的代理终端节点的名称作为前缀。此名称可以是您为用户定义的终端节点指定的名称,也可以是使用代理的默认终端节点的请求的特殊名称 default

验证代理的连接

您可以使用以下命令验证连接机制的所有组件是否均可与其他组件进行通信。

使用 describe-db-proxies 命令检查代理本身。同时使用 describe-db-proxy-target-groups 检查关联的目标组。检查目标的详细信息是否与要与代理关联的 RDS 数据库实例或 Aurora 数据库集群匹配。使用如下命令。

aws rds describe-db-proxies --db-proxy-name $DB_PROXY_NAME aws rds describe-db-proxy-target-groups --db-proxy-name $DB_PROXY_NAME

要确认代理可以连接到底层数据库,请使用 describe-db-proxy-targets 命令检查目标组中指定的目标。使用如下命令。

aws rds describe-db-proxy-targets --db-proxy-name $DB_PROXY_NAME

describe-db-proxy-targets 命令的输出包括一个 TargetHealth 字段。您可以检查 TargetHealth 内部的字段 StateReasonDescription,以检查代理是否可以与底层数据库实例进行通信。

  • StateAVAILABLE 表示代理可以连接到数据库实例。

  • StateUNAVAILABLE 表示存在临时或永久的连接问题。在这种情况下,请检查 ReasonDescription 字段。例如,如果 Reason 的值为 PENDING_PROXY_CAPACITY,请在代理完成其扩展操作后,重试连接。如果 Reason 的值为 UNREACHABLECONNECTION_FAILEDAUTH_FAILURE,请使用 Description 字段中的说明来帮助您诊断问题。

  • 在更改为 AVAILABLEUNAVAILABLE 之前,State 字段的值可能在短时间内为 REGISTERING

如果以下 Netcat 命令 (nc) 成功,您可以从登录的 EC2 实例或其他系统访问代理终端节点。如果您与代理和关联数据库不在同一 VPC 中,则该命令将报告失败。您可能未在同一 VPC 中就可以直接登录到数据库。但是,除非在同一 VPC 中,否则无法登录到代理。

nc -zx MySQL_proxy_endpoint 3306 nc -zx PostgreSQL_proxy_endpoint 5432

您可以使用以下命令来确保 EC2 实例具有所需属性。特别是,EC2 实例的 VPC 必须与代理连接到的 RDS 数据库实例或 Aurora 数据库集群的 VPC 相同。

aws ec2 describe-instances --instance-ids your_ec2_instance_id

检查用于代理的 Secrets Manager 密钥。

aws secretsmanager list-secrets aws secretsmanager get-secret-value --secret-id your_secret_id

确保 get-secret-value 显示的 SecretString 字段被编码为包含 usernamepassword 字段的 JSON 字符串。以下示例显示了 SecretString 字段的格式。

{ "ARN": "some_arn", "Name": "some_name", "VersionId": "some_version_id", "SecretString": '{"username":"some_username","password":"some_password"}', "VersionStages": [ "some_stage" ], "CreatedDate": some_timestamp }

将 RDS Proxy 与 Amazon CloudFormation 结合使用

您可以将 RDS Proxy 与 Amazon CloudFormation 结合使用。这样做有助于您创建相关资源组,包括可连接到新创建的 Amazon RDS 数据库实例或 Aurora 数据库集群的代理。Amazon CloudFormation 中的 RDS Proxy 支持涉及两种新的注册表类型:DBProxyDBProxyTargetGroup

以下列表显示了 RDS Proxy 的 Amazon CloudFormation 模板示例。

Resources: DBProxy: Type: Amazon::RDS::DBProxy Properties: DBProxyName: CanaryProxy EngineFamily: MYSQL RoleArn: Fn::ImportValue: SecretReaderRoleArn Auth: - {AuthScheme: SECRETS, SecretArn: !ImportValue ProxySecret, IAMAuth: DISABLED} VpcSubnetIds: Fn::Split: [",", "Fn::ImportValue": SubnetIds] ProxyTargetGroup: Type: Amazon::RDS::DBProxyTargetGroup Properties: DBProxyName: CanaryProxy TargetGroupName: default DBInstanceIdentifiers: - Fn::ImportValue: DBInstanceName DependsOn: DBProxy

有关您可以使用 Amazon CloudFormation 创建的 Amazon RDS 和 Aurora 资源的更多信息,请参阅 RDS 资源类型参考