RDS Proxy 概念和术语 - Amazon Aurora
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

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,在运行 --ssl-mode 命令时使用 mysql 参数在客户端上指定此要求。

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

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 结合使用时,以 --ssl-ca 格式指定指向 CA 的 .pem 选项。对于可使用的 .pem 文件,您可以从 Amazon Trust Services 下载 Amazon Root CA 1 信任存储

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

Failover

故障转移是一项高可用性功能,可在原始实例变得不可用时将数据库实例替换为另一个数据库实例。可能会因为数据库实例出现问题而发生故障转移。故障转移也可能是正常维护程序的一部分,例如在数据库升级期间。故障转移适用于多可用区配置中的 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 连接尤其重要,因为这些连接的设置成本很高。

Transactions

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

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

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

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

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

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