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