亚马逊AWS官方博客

使用 Amazon RDS 代理和具有两个可读备用数据库的 Amazon RDS Multi-AZ 部署,在停机时间不超过 1 秒的情况下执行次要版本升级

结合使用 Amazon RDS 代理时,具有两个可读备用数据库的 Amazon RDS Multi-AZ 部署现在支持次要版本升级和系统维护更新,而停机时间通常为 1 秒或更短时间。在这篇博文中,我们将讨论这项新功能及其优点和设置步骤。

具有两个可读备用数据库的 Amazon RDS Multi-AZ 部署

2022 年 3 月,AWS 在 Amazon RDS for PostgreSQL 和 Amazon RDS for MySQL 中推出了具有两个可读备用数据库的 Amazon Relational Database Service(RDS)Multi-AZ 部署。这种新的部署选项由一个主数据库实例和两个可读备用数据库实例(即多可用区数据库集群)组成。在此配置中,集群的每个节点都使用高速直连的 NVMe 卷和 Amazon Elastic Block Store(Amazon EBS)卷。写入操作最初会写入 NVMe 卷,而不是提交路径中的 Amazon EBS,从而降低延迟。然后,这些写入操作会异步写入 EBS 卷,以保证持久性。除这种性能提升外,此部署选项还使两个备用节点都能为读取流量提供服务。

Amazon RDS 代理

2020 年 6 月,AWS 推出了 Amazon RDS 代理。RDS 代理有很多优点。第一个优点是连接入池。对于某些应用程序来说,连接入池是一项挑战。通过使用这项 RDS 代理功能,现在可以分配原本用于协商 TCP 和 TLS 握手以及身份验证的数据库资源,来运行更多查询。应用程序现在可以连接到 RDS 代理,RDS 代理将维护一个与数据库的连接池,从而减轻原本会加在数据库服务器上的负担。

RDS 代理的另一个优点与连接相关,就是连接多路复用。有了这项功能,无论应用程序与代理建立了多少个连接,RDS 代理都只会与数据库实例建立所需数量的数据库连接。通过保持较低的数据库实例连接数,可以在相同的应用程序连接数下使用较少的资源。

RDS 代理的第三个功能是能够实现快速失效转移。根据我们的测试,RDS 代理可以缩短失效转移后的客户端恢复时间。造成这种情况的因素有很多。首先,当 Amazon RDS 上发生失效转移时,底层主机及其 IP 地址会发生变化。这意味着,不使用 RDS 代理的应用程序将需要与数据库服务器建立新的 TCP 连接。使用 RDS 代理时,应用程序会自行维护与代理的 TCP 连接。

某些应用程序(通常是用 Java 编写的应用程序)缓存集群端点的 CNAME 的时间超过了公告的 TTL。在这种情况下,即使集群已完全失效转移,应用程序也无法连接到新的写入器,因为它仍在使用缓存的端点。有了 RDS 代理,就不需要更改 CNAME,因此这个问题也就迎刃而解了。

除了连接入池、连接多路复用和更快的失效转移外,还需要注意的是,RDS 代理是完全托管的、无服务器的,该代理在应用程序和数据库实例之间增加了一层抽象层,从而提供了额外的安全性。

解决方案概览

目前,Amazon RDS for PostgreSQL 或 Amazon RDS for MySQL 数据库的次要版本升级或系统维护更新可能需要几分钟时间,而且需要计划内停机。定制的升级解决方案不是完全自动化的,在数据库实例集中使用也很复杂,因为它们需要在不同的应用程序用户之间进行协调,需要额外的基础设施,需要大量的资源,而且构建成本高昂。Amazon RDS Multi-AZ 数据库(DB)集群现在可以执行次要版本升级,停机时间通常不超过 35 秒。对停机时间有更严格要求的客户可以通过添加 RDS 代理,将停机时间进一步缩短到 1 秒或更短时间。

在 Amazon RDS Multi-AZ DB 集群上打补丁或进行次要版本升级时,首先要将补丁依次应用到每个读取器。读取器升级后,其中一个读取器成为新的写入器,原写入器成为读取器。当读取器和写入器切换角色时,就会出现停机时间。有了 Amazon RDS Multi-AZ DB 集群,停机时间现在通常不到 35 秒。其中大部分时间是由于集群端点域名系统(DNS)传播延迟造成的。RDS 代理可直接感知读取器和写入器角色的变化,而不依赖于导致 35 秒延迟的 DNS 传播。因此,RDS 代理与 Amazon RDS Multi-AZ DB 集群一起使用时,停机时间通常为 1 秒或更短时间。

现在,我们已经研究了如何在 1 秒或更短的时间内完成次要版本升级,让我们来看看如何使用 Amazon RDS Multi-AZ DB 集群设置 RDS 代理。

使用新的 Amazon RDS Multi-AZ DB 集群设置 RDS 代理

要设置 Amazon RDS Multi-AZ DB 集群和 RDS 代理,请完成以下步骤:

  1. 在 Amazon RDS 控制台上,选择创建数据库
  2. 对于引擎类型,选择 MySQLPostgreSQL
  3. 隐藏筛选器下,选择显示支持多可用区数据库集群的版本
  4. 对于引擎版本,选择您的首选版本。
  5. 可用性和持久性下,选择多可用区数据库集群
  6. 连接下,对于 RDS 代理,选择创建 RDS 代理
  7. 选择创建数据库

此过程还会在 AWS Secrets Manager 中创建一个密钥,并创建一个 AWS Identity and Access Management(IAM)策略来访问该密钥,以便与新创建的代理一起使用。创建这些资源后,可以在代理详细信息页面的代理端点部分找到读/写和只读端点。

使用现有的 Amazon RDS Multi-AZ DB 集群设置 RDS 代理

要使用现有的 Amazon RDS Multi-AZ DB 集群设置 RDS 代理,请完成以下步骤:

  1. 在 Amazon RDS 控制台上,选择代理
  2. 选择创建代理
  3. 代理配置下,选择 MariaDB 和 MySQLPostgreSQL,然后在“代理标识符”字段中输入新 RDS 代理的名称。
  4. 目标组配置下,选择要为其创建此 RDS 代理的 Amazon RDS Multi-AZ DB 集群。
  5. 身份验证下,指定包含此代理将用于连接到 Amazon RDS Multi-AZ DB 集群的凭证的 Secrets Manager 密钥,以及此代理将用于读取此密钥的 IAM 角色。
  6. 选择创建代理

按照这篇博文中的步骤操作后,请务必清理所有不再使用的资源。您可以在 AWS 文档中找到有关 RDS 代理Amazon RDS Multi-AZ DB 集群IAM 策略Secrets Manager 密钥的说明。

小结

在这篇博文中,我们研究了如何将 RDS 代理与 Amazon RDS Multi-AZ DB 集群配合使用,从而在读取器实例没有副本滞后的情况下实现通常为 1 秒或更短的停机时间。此解决方案可以提供额外的优点,如连接入池和连接多路复用,从而优化数据库资源。有关更多信息,请参阅 Amazon RDS Multi-AZ 部署中的可读备用实例:新的高可用性选项,并立即开始使用 RDS 代理!


关于作者

Steve Abraham 是 Amazon Web Services 的首席解决方案架构师。他与客户一起工作,提供有关数据库项目的指导和技术协助,协助客户在使用 AWS 时提高其解决方案的价值。