RDS Proxy 概念和术语
您可以通过使用 RDS 代理来简化 Amazon RDS 数据库实例的连接管理。
RDS Proxy 处理客户端应用程序和数据库之间的网络流量。为实现这一点,它首先了解数据库协议。然后,它会根据应用程序中的 SQL 操作和数据库中的结果集来调整其行为。
RDS Proxy 减少了数据库上的连接管理的内存和 CPU 开销。当应用程序打开多个同时连接时,数据库所需的内存和 CPU 资源较少。而且也不需要应用程序中的逻辑来关闭和重新打开长时间处于空闲状态的连接。同样,在出现数据库问题时,需要较少的应用程序逻辑来重新建立连接。
RDS Proxy 的基础设施高度可用,部署在多个可用区 (AZ) 上。RDS 代理的计算、内存和存储独立于您的 RDS 数据库实例。这种分离有助于减少数据库服务器的开销,使它们能够将资源用于处理数据库工作负载。RDS Proxy 计算资源是无服务器的,根据您的数据库工作负载自动进行扩展。
RDS Proxy 概念概述
RDS 代理处理基础设施以执行连接池和以下各节中所述的其他功能。您可以在代理页面上看到 RDS 控制台中表示的代理。
每个代理处理与单个 RDS 数据库实例的连接。对于 RDS 多可用区实例或集群,代理自动确定当前的写入器实例。
代理保持打开状态且可供数据库应用程序用于形成连接池的连接。
默认情况下,RDS Proxy 可在会话中的每个事务之后重用连接。这种事务级别的重用称为多路复用。当 RDS Proxy 临时从连接池中删除某个连接以重用该连接时,该操作称为借用连接。如果这样做是安全的,RDS Proxy 会将该连接返回到连接池。
在某些情况下,RDS Proxy 不能确定在当前会话之外重用数据库连接是否安全。在这些情况下,它将会话保持在同一个连接上,直到会话结束。此回退行为称为固定。
代理具有默认端点。使用 Amazon RDS 数据库实例时,您将连接到该端点。您可以这样做,而不是连接到与实例直接连接的读/写端点。对于 RDS 数据库集群,您还可以创建其它读/写和只读端点。有关更多信息,请参阅 代理终端节点概述。
例如,您仍可连接到集群端点以实现读/写连接,而无需连接池。您仍可连接到读取器端点以实现负载均衡的只读连接。您仍可连接到实例端点,以便对集群中的特定数据库实例进行诊断和故障排除。如果您使用其他 AWS 服务(例如 AWS Lambda)连接到 RDS 数据库,请将其连接设置更改为使用代理端点。例如,指定代理端点,以允许 Lambda 函数在利用 RDS Proxy 功能的同时访问数据库。
每个代理都包含一个目标组。该目标组包含代理可连接到的 RDS 数据库实例。与代理关联的 RDS 数据库实例称为该代理的目标。为方便起见,当您通过控制台创建代理时,RDS Proxy 也会创建相应的目标组并自动注册关联的目标。
引擎系列是使用相同数据库协议的相关数据库引擎集。您可以为创建的每个代理选择引擎系列。
连接池
每个代理都为其关联的 RDS 数据库的写入器实例执行连接池。连接池 是一项优化,可减少与打开和关闭连接相关的开销,并可保持许多连接同时打开。该开销包括处理每个新连接所需的内存。关闭每个连接并打开一个新连接还涉及 CPU 开销。示例包括传输层安全性协议/安全套接字层(TLS/SSL)握手、身份验证、协商功能等。连接池可简化应用程序逻辑。无需编写应用程序代码,即可最大限度地减少同时打开的连接数量。
每个代理还执行连接多路复用,也称为连接重用。对于多路复用,RDS 代理使用一个底层数据库连接对事务执行所有操作。然后,RDS 可以对下一个事务使用不同的连接。您可以同时打开许多到代理的连接,而代理可确保打开的到数据库实例或集群的连接数量较少。这样做可进一步减少数据库服务器上连接的内存开销。这项技术还降低了出现“连接过多”错误的可能性。
RDS Proxy 安全性
RDS Proxy 使用现有的 RDS 安全机制,如 TLS/SSL 和 AWS Identity and Access Management (IAM)。有关这些安全功能的一般信息,请参阅 Amazon RDS 中的安全性。此外,请务必熟悉 RDS 如何处理身份验证、授权和其它安全领域。
RDS Proxy 可作为客户端应用程序和底层数据库之间的附加安全层。例如,即使底层数据库实例支持旧版 TLS,您也可以使用 TLS 1.3 连接到代理。您可以使用 IAM 角色连接到代理。即使代理使用本机用户和密码身份验证方法连接到数据库,也是如此。通过采用这项技术,您可以对数据库应用程序强制执行强身份验证要求,而无需对数据库实例本身进行成本高昂的迁移。
您将 RDS Proxy 使用的数据库凭证存储在 AWS Secrets Manager 中。代理访问的 RDS 数据库实例的每个数据库用户都必须在 Secrets Manager 中拥有相应的密钥。您还可为 RDS Proxy 的用户设置 IAM 身份验证。这样一来,即使数据库使用本机密码身份验证,您也可以对数据库访问强制执行 IAM 身份验证。我们建议使用这些安全功能,而不是在应用程序代码中嵌入数据库凭证。
将 TLS/SSL 与 RDS Proxy 结合使用
您可以使用 TLS/SSL 协议连接到 RDS Proxy。
注意
RDS Proxy 使用来自 AWS Certificate Manager (ACM) 的证书。如果您正在使用 RDS Proxy,则无需下载 Amazon RDS 证书或更新使用 RDS Proxy 连接的应用程序。
要对代理与数据库之间的所有连接强制执行 TLS,您可以在 AWS Management Console中创建或修改代理时,指定需要传输层安全性设置。
RDS Proxy 还可以确保您的会话在客户端与 RDS Proxy 端点之间使用 TLS/SSL。要让 RDS Proxy 这样做,请在客户端上指定此要求。没有为使用 RDS Proxy 的数据库 SSL 连接设置 SSL 会话变量。
-
对于 RDS for MySQL,在运行
mysql
命令时使用--ssl-mode
参数在客户端上指定此要求。 -
对于 Amazon RDS PostgreSQL,在运行
psql
命令时将sslmode=require
指定为conninfo
字符串的一部分。
RDS 代理支持 TLS 协议版本 1.0、1.1、1.2 和 1.3。您可以使用比底层数据库中使用的更高版本的 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-mode
VERIFY_CA
或 VERIFY_IDENTITY
结合使用时,以 --ssl-ca
格式指定指向 CA 的 .pem
选项。对于要使用的 .pem
文件,请从 Amazon Trust Services.pem
文件。
RDS 代理使用通配符证书,这些证书应用到域及其子域。如果您使用 mysql
客户端以 SSL 模式 VERIFY_IDENTITY
进行连接,则您当前必须使用与 MySQL 8.0 兼容的 mysql
命令。
故障转移
故障转移是一项高可用性功能,可在原始实例变得不可用时将数据库实例替换为另一个数据库实例。可能会因为数据库实例出现问题而发生故障转移。故障转移也可能是正常维护程序的一部分,例如在数据库升级期间。故障转移适用于多可用区配置中的 RDS 数据库实例。
通过代理进行连接可使您的应用程序对数据库故障转移更具弹性。当原始数据库实例变得不可用时,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
autocommit
设置后,每个单独的语句之后都会发生连接重用。 -
相反,关闭
autocommit
设置后,您在会话中发出的第一个语句会开始新的事务。例如,假设您输入SELECT
、INSERT
、UPDATE
序列和其他数据操作语言(DML)语句。在这种情况下,在您发出COMMIT
、ROLLBACK
或以其他方式结束事务之前,不会发生连接重用。 -
输入数据定义语言 (DDL) 语句会导致事务在该语句完成后结束。
RDS Proxy 通过数据库客户端应用程序使用的网络协议检测事务何时结束。事务检测不依赖于关键字,例如 SQL 语句文本中显示的 COMMIT
或 ROLLBACK
。
在某些情况下,RDS Proxy 可能会检测到使得无法将会话移动到其他连接的数据库请求。在这些情况下,它会在会话的剩余时间关闭该连接的多路复用。当 RDS Proxy 不能确定多路复用是否适用于会话时,这一规则也适用。该操作称为固定。有关检测和最小化固定的方法,请参阅 避免固定 RDS 代理。