结合使用 [Amazon Relational Database Service(RDS) 代理](https://aws.amazon.com/rds/proxy/?trk=cndc-detail)时,具有两个可读备用数据库的 [Amazon RDS](https://aws.amazon.com/cn/rds/?trk=cndc-detail) Multi-AZ 部署现在支持次要版本升级和系统维护更新,而停机时间通常为 1 秒或更短时间。**在这篇博文中,我们将讨论这项新功能及其优点和设置步骤**。
### **具有两个可读备用数据库的 Amazon RDS Multi-AZ 部署**
2022 年 3 月,亚马逊云科技在 [Amazon RDS](https://aws.amazon.com/cn/rds/?trk=cndc-detail) for PostgreSQL 和 [Amazon RDS](https://aws.amazon.com/cn/rds/?trk=cndc-detail) for MySQL 中推出了具有两个可读备用数据库的 [Amazon RDS Multi-AZ 部署](https://aws.amazon.com/about-aws/whats-new/2022/03/amazon-rds-multi-az-transaction-commit-latency/?trk=cndc-detail)。
这种新的部署选项由一个主数据库实例和两个可读备用数据库实例(即多可用区数据库集群)组成。在此配置中,集群的每个节点都使用高速直连的 NVMe 卷和 [Amazon Elastic Block Store(Amazon EBS)](http://aws.amazon.com/ebs?trk=cndc-detail)卷。
写入操作最初会写入 NVMe 卷,而不是提交路径中的 [Amazon EBS](https://aws.amazon.com/cn/ebs/?trk=cndc-detail),从而降低延迟。然后,这些写入操作会异步写入 [Amazon EBS](https://aws.amazon.com/cn/ebs/?trk=cndc-detail) 卷,以保证持久性。**除这种性能提升外,此部署选项还使两个备用节点都能为读取流量提供服务。**
### **Amazon RDS 代理**
2020 年 6 月,亚马逊云科技推出了[ Amazon RDS 代理](https://aws.amazon.com/rds/proxy/?trk=cndc-detail)。[Amazon RDS](https://aws.amazon.com/cn/rds/?trk=cndc-detail) 代理有很多优点。**第一个优点是[连接入池](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/rds-proxy.howitworks.html#rds-proxy-connection-pooling?trk=cndc-detail)**。对于某些应用程序来说,连接入池是一项挑战。
通过使用这项 [Amazon RDS](https://aws.amazon.com/cn/rds/?trk=cndc-detail) 代理功能,现在可以分配原本用于协商 TCP 和 TLS 握手以及身份验证的数据库资源,来运行更多查询。应用程序现在可以连接到 [Amazon RDS](https://aws.amazon.com/cn/rds/?trk=cndc-detail) 代理,[Amazon RDS](https://aws.amazon.com/cn/rds/?trk=cndc-detail) 代理将维护一个与数据库的连接池,从而减轻原本会加在数据库服务器上的负担。
**[Amazon RDS](https://aws.amazon.com/cn/rds/?trk=cndc-detail) 代理的另一个优点与连接相关,就是[连接多路复用](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/rds-proxy.howitworks.html#rds-proxy-overview?trk=cndc-detail)**。有了这项功能,无论应用程序与代理建立了多少个连接,[Amazon RDS](https://aws.amazon.com/cn/rds/?trk=cndc-detail) 代理都只会与数据库实例建立所需数量的数据库连接。通过保持较低的数据库实例连接数,可以在相同的应用程序连接数下使用较少的资源。
**[Amazon RDS](https://aws.amazon.com/cn/rds/?trk=cndc-detail) 代理的第三个功能是能够实现快速[失效转移](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/rds-proxy.howitworks.html#rds-proxy-failover?trk=cndc-detail)**。根据我们的[测试](https://aws.amazon.com/blogs/database/improving-application-availability-with-amazon-rds-proxy/?trk=cndc-detail),[Amazon RDS](https://aws.amazon.com/cn/rds/?trk=cndc-detail) 代理可以缩短失效转移后的客户端恢复时间。造成这种情况的因素有很多。
首先,当 [Amazon RDS](https://aws.amazon.com/cn/rds/?trk=cndc-detail) 上发生失效转移时,底层主机及其 IP 地址会发生变化。这意味着,不使用 [Amazon RDS](https://aws.amazon.com/cn/rds/?trk=cndc-detail) 代理的应用程序将需要与数据库服务器建立新的 TCP 连接。使用 [Amazon RDS](https://aws.amazon.com/cn/rds/?trk=cndc-detail) 代理时,应用程序会自行维护与代理的 TCP 连接。
某些应用程序(通常是用 Java 编写的应用程序)缓存[集群端点](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/multi-az-db-clusters-concepts-connection-management.html#:~:text=AZ%20DB%20cluster%3A-,Cluster%20endpoint,DB%20cluster%20has%20one%20cluster%20endpoint%20and%20one%20writer%20DB%20instance.,-You%20use%20the)的 CNAME 的时间超过了公告的 TTL。在这种情况下,即使集群已完全失效转移,应用程序也无法连接到新的写入器,因为它仍在使用缓存的端点。**有了 [Amazon RDS](https://aws.amazon.com/cn/rds/?trk=cndc-detail) 代理,就不需要更改 CNAME,因此这个问题也就迎刃而解了。**
除了连接入池、连接多路复用和更快的失效转移外,还需要注意的是,[Amazon RDS](https://aws.amazon.com/cn/rds/?trk=cndc-detail) 代理是完全托管的、[无服务器](https://aws.amazon.com/cn/serverless/?trk=cndc-detail)的,**该代理在应用程序和数据库实例之间增加了一层抽象层,从而提供了额外的安全性。**
### **解决方案概览**
目前,[Amazon RDS](https://aws.amazon.com/cn/rds/?trk=cndc-detail) for PostgreSQL 或 [Amazon RDS](https://aws.amazon.com/cn/rds/?trk=cndc-detail) for MySQL 数据库的次要版本升级或系统维护更新可能需要几分钟时间,而且需要计划内停机。
定制的升级解决方案不是完全自动化的,在数据库实例集中使用也很复杂,因为它们需要在不同的应用程序用户之间进行协调,需要额外的基础设施,需要大量的资源,而且构建成本高昂。
**[Amazon RDS](https://aws.amazon.com/cn/rds/?trk=cndc-detail) Multi-AZ 数据库(DB)集群现在可以执行次要版本升级,停机时间通常不超过 35 秒。对停机时间有更严格要求的客户可以通过添加 [Amazon RDS](https://aws.amazon.com/cn/rds/?trk=cndc-detail) 代理,将停机时间进一步缩短到 1 秒或更短时间。**
在 [Amazon RDS](https://aws.amazon.com/cn/rds/?trk=cndc-detail) Multi-AZ DB 集群上打补丁或进行次要版本升级时,首先要将补丁依次应用到每个读取器。读取器升级后,其中一个读取器成为新的写入器,原写入器成为读取器。当读取器和写入器切换角色时,就会出现停机时间。
**有了 [Amazon RDS](https://aws.amazon.com/cn/rds/?trk=cndc-detail) Multi-AZ DB 集群,停机时间现在通常不到 35 秒**。其中大部分时间是由于集群端点的[域名系统(DNS)](https://aws.amazon.com/route53/what-is-dns/?trk=cndc-detail)传播延迟造成的。
[Amazon RDS](https://aws.amazon.com/cn/rds/?trk=cndc-detail) 代理可直接感知读取器和写入器角色的变化,而不依赖于导致 35 秒延迟的 DNS 传播。因此,Amazon **RDS 代理与 [Amazon RDS](https://aws.amazon.com/cn/rds/?trk=cndc-detail) Multi-AZ DB 集群一起使用时,停机时间通常为 1 秒或更短时间。**
现在,我们已经研究了如何在 1 秒或更短的时间内完成次要版本升级,让我们来看看如何使用 [Amazon RDS](https://aws.amazon.com/cn/rds/?trk=cndc-detail) Multi-AZ DB 集群设置 AmazonRDS 代理。
### **使用新的 Amazon RDS Multi-AZ DB 集群设置 Amazon RDS 代理**
要设置 [Amazon RDS](https://aws.amazon.com/cn/rds/?trk=cndc-detail) Multi-AZ DB 集群和 [Amazon RDS](https://aws.amazon.com/cn/rds/?trk=cndc-detail) 代理,请完成以下步骤:
1.在 [Amazon RDS](https://aws.amazon.com/cn/rds/?trk=cndc-detail) 控制台上,选择创建**数据库**。
![image.png](https://dev-media.amazoncloud.cn/a2dcad6ea6174d21ab7b992c3d92b3d4_image.png "image.png")
2.对于引擎类型,选择 **MySQL** 或 **PostgreSQL**。
3.在**隐藏筛选器**下,选择**显示支持多可用区数据库集群的版本**。
4.对于**引擎版本**,选择您的首选版本。
![image.png](https://dev-media.amazoncloud.cn/3f9c0960180e4d84b78ade7b4ba26eee_image.png "image.png")
5.在**可用性和持久性**下,选择**多可用区数据库集群。**
![image.png](https://dev-media.amazoncloud.cn/23b24e834c4b418da842c54abaee4cf2_image.png "image.png")
6.在连接下,对于 **[Amazon RDS](https://aws.amazon.com/cn/rds/?trk=cndc-detail) 代理**,选择**创建 [Amazon RDS](https://aws.amazon.com/cn/rds/?trk=cndc-detail) 代理。**
![image.png](https://dev-media.amazoncloud.cn/71c3bb69cc904da484e52f302b084ba3_image.png "image.png")
7.选择**创建数据库。**
此过程还会在 [Amazon Secrets Manager](https://aws.amazon.com/secrets-manager/?trk=cndc-detail) 中创建一个密钥,并创建一个 [Amazon Identity and Access Management(IAM)](https://aws.amazon.com/iam/?trk=cndc-detail)策略来访问该密钥,以便与新创建的代理一起使用。创建这些资源后,可以在代理详细信息页面的代理端点部分找到读/写和只读端点。
### **使用现有的 Amazon RDS Multi-AZ DB 集群设置 Amazon RDS 代理**
要使用现有的 [Amazon RDS](https://aws.amazon.com/cn/rds/?trk=cndc-detail) Multi-AZ DB 集群设置 [Amazon RDS](https://aws.amazon.com/cn/rds/?trk=cndc-detail) 代理,请完成以下步骤:
1.在 [Amazon RDS](https://aws.amazon.com/cn/rds/?trk=cndc-detail) 控制台上,选择**代理**。
![image.png](https://dev-media.amazoncloud.cn/8884f52d99f24ded9318c45e35e8838b_image.png "image.png")
2.选择**创建代理。**
![image.png](https://dev-media.amazoncloud.cn/86c975b077294bbeb4012d8da108d566_image.png "image.png")
3.在**代理配置**下,选择 **MariaDB** 和 **MySQL** 或 **PostgreSQL**,然后在“代理标识符”字段中输入新 [Amazon RDS](https://aws.amazon.com/cn/rds/?trk=cndc-detail) 代理的名称。
![image.png](https://dev-media.amazoncloud.cn/266661932e6e43e5b4de0925a527293c_image.png "image.png")
4.在**目标组配置**下,选择要为其创建此 [Amazon RDS](https://aws.amazon.com/cn/rds/?trk=cndc-detail) 代理的 [Amazon RDS](https://aws.amazon.com/cn/rds/?trk=cndc-detail) Multi-AZ DB 集群。
![image.png](https://dev-media.amazoncloud.cn/958e51260cd949c492a8ad348980fd8b_image.png "image.png")
5.在**身份验证**下,指定包含此代理将用于连接到 [Amazon RDS](https://aws.amazon.com/cn/rds/?trk=cndc-detail) Multi-AZ DB 集群的凭证的 Secrets Manager 密钥,以及此代理将用于读取此密钥的 Amazon IAM 角色。
![image.png](https://dev-media.amazoncloud.cn/83d18f7495b940fb8f0d22a2522b8d9a_image.png "image.png")
6.选择**创建代理**。
![image.png](https://dev-media.amazoncloud.cn/e6d9da7a82d841f0bd72ac2952ac0026_image.png "image.png")
**按照这篇博文中的步骤操作后,请务必清理所有不再使用的资源**。您可以在亚马逊云科技文档中找到有关 [Amazon RDS 代理](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/rds-proxy-managing.html#rds-proxy-deleting?trk=cndc-detail)、[Amazon RDS Multi-AZ DB 集群](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_DeleteMultiAZDBCluster.Deleting.html?trk=cndc-detail)、[Amazon IAM 策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-delete.html?trk=cndc-detail)和 [Amazon Secrets Manager 密钥](https://docs.aws.amazon.com/secretsmanager/latest/userguide/manage_delete-secret.html?trk=cndc-detail)的说明。
### **总结**
在这篇博文中,**我们研究了如何将 [Amazon RDS](https://aws.amazon.com/cn/rds/?trk=cndc-detail) 代理与 [Amazon RDS](https://aws.amazon.com/cn/rds/?trk=cndc-detail) Multi-AZ DB 集群配合使用,从而在读取器实例没有副本滞后的情况下实现通常为 1 秒或更短的停机时间。**
**此解决方案可以提供额外的优点,如连接入池和连接多路复用,从而优化数据库资源。**
有关更多信息,请参阅 [Amazon RDS Multi-AZ 部署中的可读备用实例:新的高可用性选项](https://aws.amazon.com/blogs/database/readable-standby-instances-in-amazon-rds-multi-az-deployments-a-new-high-availability-option/?trk=cndc-detail),立即开始使用 [Amazon RDS](https://aws.amazon.com/cn/rds/?trk=cndc-detail) 代理!
![image.png](https://dev-media.amazoncloud.cn/0bca3dba618a46d2a7d7bab35130f513_image.png "image.png")
![开发者尾巴.gif](https://dev-media.amazoncloud.cn/024f13d48bd4480cb16958099336cf58_%E5%BC%80%E5%8F%91%E8%80%85%E5%B0%BE%E5%B7%B4.gif "开发者尾巴.gif")