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

管理 RDS Proxy

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

修改 RDS Proxy

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

修改代理的设置

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

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

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

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

  5. 输入或选择要修改的属性。您可以指定如下内容:

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

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

    • 空闲客户端连接超时 - 输入空闲客户端连接超时的时间段。

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

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

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

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

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

  6. 选择修改

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

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

修改代理目标组的设置

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

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

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

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

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

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

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

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

    • 初始化查询 - (可选)添加初始化查询或修改当前查询。您可以为代理指定一个或多个 SQL 语句,以便在打开每个新数据库连接时运行。设置通常与 SET 语句一起使用,以确保每个连接具有相同的设置,如时区和字符集。对于多个语句,请使用分号作为分隔符。您还可以在单个 SET 语句中包含多个变量,例如 SET x=1, y=2。初始化查询目前不支持 PostgreSQL。

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

  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 控制台中的连接池最大连接数字段或 Amazon CLI 或 API 中的 MaxConnectionsPercent 参数表示。请将限制指定为百分比。该百分比适用于数据库中配置的最大连接数。确切数字因数据库实例大小和配置设置而异。

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

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

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

您可以选择等待数据库连接可供应用程序使用的时间。此设置由 RDS Proxy 控制台中的连接借用超时字段或 Amazon CLI or API中的 ConnectionBorrowTimeout 参数表示。该设置指定在返回超时错误之前等待连接池中的连接可用的时间。这适用于连接数达到最大而导致连接池中没有可用连接的情况。如果由于正在进行故障转移操作而没有适当的数据库实例来处理请求,那么这也适用。通过使用此设置,您可以为应用程序设置最佳等待期,而无需更改应用程序代码中的查询超时。

您可控制代理关闭连接池中空闲数据库连接的主动程度。此设置由 Amazon CLI 或 API 中 DBProxyTargetGroupMaxIdleConnectionsPercent 参数表示。对于高值,代理会将较高百分比的空闲数据库连接保持在打开状态。对于低值,代理会关闭较高百分比的空闲数据库连接。对于 Aurora MySQL,它以百分比表示,这是为目标组使用的 RDS 数据库实例或 Aurora 数据库集群的 max_connections 设置的百分比。原定设置值是 50%。要更改 MaxIdleConnectionsPercent 的值,请使用 CLI 命令 modify-db-proxy-target-group 或 API 操作 ModifyDBProxyTargetGroup

注意

当数据库连接不再使用时,RDS Proxy 会在 24 小时后关闭数据库连接。无论最大空闲连接设置的值如何,代理都会执行此操作。

避免固定

当数据库请求不依赖于先前请求的状态信息时,多路复用效率更高。在这种情况下,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.aws.amazon.com/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