亚马逊AWS官方博客

Amazon RDS Proxy – 现已全面推出

在 AWS re:Invent 2019 上,我们发布了 Amazon RDS Proxy 的预览版,这是一个用于 Amazon Relational Database Service (RDS) 的完全托管、高度可用的数据库代理,可让应用程序更具可扩展性、提高对数据库故障的恢复能力且更加安全。继发布 MySQL 引擎预览版后,我们扩展了 PostgreSQL 的兼容性。今天,我很高兴地宣布,我们现已面向两种引擎正式发布。

许多应用程序(包括使用 AWS LambdaFargateAmazon ECSEKS 在现代无服务器架构上构建的应用程序)都可能与数据库服务有大量的开放连接,并且可能以高速度打开和关闭数据库连接,从而耗尽数据库内存和计算资源。

Amazon RDS Proxy 支持应用程序汇集并共享与数据库建立的连接,从而提高数据库效率、应用程序可扩展性和安全。利用 RDS Proxy,Amazon Aurora 和 RDS 的故障转移时间最多可减少 66%,并且可以通过与 AWS Secrets ManagerAWS Identity and Access Management (IAM) 集成来管理数据库凭证、身份验证和访问。

大多数应用程序无需更改代码即可启用 Amazon RDS Proxy,并且您无需提供或管理任何额外的基础设施,只需为启用代理的数据库实例的每个 vCPU 付费。

Amazon RDS Proxy – 开始使用
前往 AWS 管理控制台并为 RDS 数据库创建 RDS Proxy 终端节点后,只需点击几次便可开始使用 Amazon RDS。在导航窗格中,选择代理,然后创建代理。您还可以看到下面的代理面板。

如需创建代理,请指定代理标识符(您选择的唯一名称),然后选择数据库引擎 — MySQL 或 PostgreSQL。如果希望代理对应用程序与代理之间的所有连接执行 TLS/SSL,请选择加密设置,然后指定代理可以将其关闭之前客户端连接可以处于空闲状态的时间段。

如果应用程序在前一个请求完成后的指定时间内未提交新的请求,客户端连接则视为处于空闲状态。代理与数据库之间的底层连接保持开放状态并返回到连接池。因此,可重新用于新的客户端连接。

接下来,在数据库中选择一个 RDS DB 实例或 Aurora DB 集群来通过该代理进行访问。该列表仅包含具有兼容数据库引擎、引擎版本和其他设置的 DB 实例与集群。

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

至少选择一个与您打算使用此代理访问的 RDS DB 实例或 Aurora DB 集群有关的 Secrets Manager 机密,然后选择一个具有访问所选 Secrets Manager 机密权限的 IAM 角色。如果没有现有的机密,请在设置 RDS Proxy 前单击创建新的机密

设置 VPC 子网安全组后,请单击创建代理。如果要详细进行更多设置,请参阅文档

您可以在等待几分钟后看到新的 RDS Proxy,然后将应用程序指向 RDS Proxy 终端节点。就这么简单!

您也可以通过 AWS CLI 命令轻松创建 RDS Proxy。

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

RDS Proxy 工作原理
我们来看一个示例,该示例演示了当您重新启动数据库或数据库由于问题变得不可用时,开放连接如何在故障转移期间继续发挥作用。此示例使用了一个名为 channy-proxy 的代理和带有 DB 实例 instance-8898instance-9814 的 Aurora DB 集群。从 Linux 命令行运行 failover-db-cluster 命令时,代理所连接的写入程序实例将更改为不同的 DB 实例。您可以看到,与代理相关的 DB 实例会发生更改,而连接仍保持开放状态。

$ mysql -h channy-proxy.proxy-abcdef123.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)

mysql>
[1]+ Stopped mysql -h channy-proxy.proxy-abcdef123.us-east-1.rds.amazonaws.com -u admin_user -p
$ # 最初,instance-9814 为写入程序。
$ aws rds failover-db-cluster --db-cluster-id cluster-56-2019-11-14-1399
JSON 输出
$ # 不久后,控制台将显示故障转移操作已完成。
$ # 现在,instance-8898 为写入程序。
$ fg
mysql -h channy-proxy.proxy-abcdef123.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 channy-proxy.proxy-abcdef123.us-east-1.rds.amazonaws.com -u admin_user -p
$ aws rds failover-db-cluster --db-cluster-id cluster-56-2019-11-14-1399
JSON 输出
$ # 不久后,控制台将显示故障转移操作已完成。
$ # 现在,instance-9814 为写入程序。
$ fg
mysql -h channy-proxy.proxy-abcdef123.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)

使用 RDS Proxy,您可以构建能够以透明的方式容忍数据库故障的应用程序,而无需编写复杂的故障处理代码。RDS Proxy 会自动将流量路由至新的数据库实例,同时保留应用程序连接。

您可以查看演示,以便获取 RDS Proxy 的概览以及从 Lambda 函数访问 RDS Proxy 所需采取的步骤。

如果您想了解无服务器应用程序如何在峰值负载下保持出色的性能,请阅读本博文。如需更深入地了解如何在无服务器的情况为 MySQL 使用 RDS Proxy,请访问本博文

以下是您应该了解的部分内容:

  • 目前,RDS Proxy 可用于 MySQL 和 PostgreSQL 引擎系列。此引擎系列包括适用于 MySQL 5.6 和 5.7、PostgreSQL 10.11 和 11.5 的 RDS。
  • 在 Aurora 集群中,连接池中的所有连接都由 Aurora 主实例处理。如需为读取密集型工作负载执行负载均衡,您仍然需要直接将读取器终端节点用于 Aurora 集群。
  • RDS Proxy 必须与数据库在同一 VPC 中。虽然数据库可以公开访问,但代理不行。
  • 代理不支持压缩模式。例如,代理不支持 mysql 命令的 --compress-C 选项所使用的压缩。

现已推出!
Amazon RDS Proxy 现已面向 Aurora MySQL、RDS for MySQL、Aurora PostgreSQL 以及 RDS for PostgreSQL 在美国东部(弗吉尼亚北部)美国东部(俄亥俄)美国西部(加利福尼亚北部)美国西部(俄勒冈)欧洲(法兰克福)欧洲(爱尔兰)欧洲(伦敦)亚太地区(孟买)亚太地区(首尔)亚太地区(新加坡)亚太地区(悉尼)亚太地区(东京)区域正式推出,还包括对 Aurora Serverless 和 Aurora Multi-Master 的支持。

通过产品页面定价文档也可以了解更多信息。请通过 Amazon RDS 的 AWS 论坛或您常用的 AWS Support 联系方式向我们发送反馈。

Channy