使用 Amazon RDS Proxy 终端节点 - Amazon Aurora

使用 Amazon RDS Proxy 终端节点

了解 RDS 代理的终端节点以及使用方法。通过使用代理端点,您可以利用以下功能:

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

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

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

代理终端节点概述

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

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

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

提示

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

对于您创建的代理终端节点,您还可以将终端节点与代理本身使用的其他 Virtual Private Cloud (VPC) 关联。这样,您可以从其他 VPC 连接到代理,例如,组织内其他应用程序使用的 VPC。

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

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

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

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

要了解代理端点如何用于 Aurora Global Database 中的数据库集群,请参阅 RDS 代理端点如何与全局数据库配合使用

代理端点的限制

RDS 代理端点具有以下限制:

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

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

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

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

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

注意

当您将新的终端节点指定为只读时,RDS Proxy 要求 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 数据库

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

通过 RDS 代理,您可以设置从一个 VPC 中的资源(例如,EC2 实例)访问另一个 VPC 中的 Aurora 数据库集群。例如,您的组织可能有多个应用程序访问同一数据库资源。每个应用程序都可能位于自己的 VPC 中。

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

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

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

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

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

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

  5. 不接受默认的与 Aurora 数据库集群使用相同的 VPC,而是选择其它 VPC。此 VPC 必须与代理所在的 VPC 位于同一 AWS 区域中。

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

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

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

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

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