从 Amazon Aurora 无服务器 v1 升级到 v2,停机时间最短

作者: 蒂姆·古斯塔夫森 | 2023

亚马逊 Aurora Ser verle ss v1 问世时,它是 2018 年最激动人心的新功能之一。拥有关系数据库而不必担心为空闲计算付费,也不会因为一段时间的高负载和容量不足而导致用户体验不佳,这种能力改变了游戏规则,许多 亚马逊云科技 客户都表示同意。

从那时起,Aurora服务有了长足的发展。2022 年,我们发布了 Aurora 无服务器 v2,这是 Aurora 无服务器发展的下一步。Aurora Serverless v2 使无服务器更接近于与预配置的 Aurora 相提并论的功能,并启用了客户要求的许多重要功能,包括 Aurora 副本、逻辑复制和全球数据库。但是,从 Aurora 无服务器 v1 到 Aurora 无服务器 v2 的迁移路径操作复杂,所需的停机时间不可忽视。

Aurora Serverless v1 有一个新的升级路径,它允许您从 Amazon Serverless v1 数据库转到预配置的 Aurora 集群,仅需 30 秒的故障转移,这与将 Aurora 只读副本提升为新编写器时发生的情况类似。然后,您可以使用新的 蓝/绿部署 功能将数据库升级到 Aurora Serverless v2 支持的版本,并将无服务器实例添加到集群中。

在考虑迁移 之前,请务必记下 Aurora 无服务器 v1 和 Aurora 无服务器 v2 之间的 区别

在这篇文章中,我们将引导您完成将现有 Aurora 无服务器 v1 数据库集群迁移到 Aurora 无服务器 v2 的步骤。

解决方案概述

在这篇文章中,我们转换了 兼容 Amazon Aurora MySQL 的版本集群。 请注意,与 Amazon Aurora Post greSQL 兼容版集群尚不支持本文中提到的蓝/绿部署方法。 您仍然可以使用新的迁移功能来升级 Aurora PostgreSQL Serverless v1 集群,但您必须使用 PostgreSQL 的逻辑复制或 亚马逊云科技 数据库迁移服务 (亚马逊云科技 DMS) 来协调蓝/绿部署步骤。

有关新功能的完整文档,请参阅 修改 Aurora 无服务器 v1 数据库 集群。

先决条件

本文中描述的过程需要最新版本的 亚马逊云科技 命令行接口 (亚马逊云科技 CLI)。如果您最近没有更新,请参阅 安装或更新最新版本的 亚马逊云科技 CLI ,然后再继续操作。

将 Aurora 无服务器 v1 实例转换为预配置的 Aurora 实例

以下屏幕截图显示了我们在本文中使用的 Aurora-mysql-serverless v1 数据库集群,名为 aurora-mysql-serverless。

首先,我们为源数据库集群创建一个参数组。这是必需的,因为蓝/绿部署过程需要启用二进制日志。如果您已经有一个自定义参数组,则可以通过将 binlog_form at 参数更改为 MIXED 来继续使用它 然后跳过此步骤。要创建新的参数组,请使用以下代码:

aws rds create-db-cluster-parameter-group \
 --db-cluster-parameter-group-name aurora-mysql-with-binlogging \
 --description 'Aurora MySQL 5.7 With Binlog Enabled' \
 --db-parameter-group-family aurora-mysql5.7

aws rds modify-db-cluster-parameter-group \
 --db-cluster-parameter-group-name aurora-mysql-with-binlogging \
 --parameters 'ParameterName=binlog_format,ParameterValue=MIXED,ApplyMethod=pending-reboot'

接下来,我们将 MySQL 5.7 参数组附加到现有数据库集群:

aws rds modify-db-cluster \
 --db-cluster-identifier aurora-mysql-serverless \
 --db-cluster-parameter-group-name aurora-mysql-with-binlogging \
 --apply-immediately

要将此无服务器数据库集群迁移到 Aurora 预置的数据库集群,请在终端窗口中运行 m odify-db-cl uster 命令:

aws rds modify-db-cluster \
 --db-cluster-identifier aurora-mysql-serverless \
 --engine-mode provisioned \
 --allow-engine-mode-change \
 --db-cluster-instance-class db.r5.xlarge \
 --apply-immediately

aws rds wait db-instance-available \
 --db-instance-identifier aurora-mysql-serverless-instance-1

aws rds wait db-cluster-available \
 --db-cluster-identifier aurora-mysql-serverless

以下屏幕截图显示了 “ 数据库 ” 页面上的更新视图。

在这篇文章中,我们指定了数据库集群名称并选择了 db.r5.xlarge 实例类型。有关此操作的有效实例类型列表,请参阅 修改 Aurora Serverless v1 数据库集群 。 在过渡到 Amazon Serverless v2 期间,您应该选择适合预期峰值工作负载的实例大小。

转换将花费几分钟,在此期间,在升级新的预配置实例期间,将有大约 30 秒的故障转移窗口。该过程完成后,您的集群将转换为预配置的 Aurora 数据库集群。

将数据库升级到 Aurora 无服务器 v2 支持的版本

在迁移到亚马逊无服务器 v2 之前,我们需要将数据库升级到亚马逊无服务器 v2 支持的版本。对于兼容亚马逊 Aurora MySQL 的版本,这意味着从 MySQL 5.7 升级到 MySQL 8.0。进行主要版本升级需要一些计划,并且应该进行适当的测试。

我们建议使用新的 蓝/绿部署 功能来升级数据库,同时最大限度地减少停机时间。要创建蓝/绿部署,请使用以下命令:

aws rds create-blue-green-deployment \
 --source arn:aws:rds:eu-west-1:123456789012:cluster:aurora-mysql-serverless \
 --blue-green-deployment-name aurora-mysql-serverless-green \
 --target-engine-version 8.0.mysql_aurora.3.03.0 \
 --target-db-cluster-parameter-group-name default.aurora-mysql8.0

aws rds wait db-cluster-available \
 --db-cluster-identifier GreenClusterID

aws rds wait db-instance-available \
 --db-instance-identifier GreenInstanceID

记下此命令中的 BlueGreenDeploymentIdentifier 输出值,以便在后续步骤中使用。此外,在亚马逊 RDS 控制台上查找 GreenClusterID GreenInstanceID 以获取等待命令。 要了解此命令的所有可用命令行选项,请参阅创建蓝绿色部署。

创建蓝/绿部署和升级绿色数据库将花费一些时间,但在此过程进行期间,您的应用程序不会受到任何干扰。请注意,蓝/绿部署将经历两个阶段:创建 5.7 版集群,然后升级到 8.0 版。您需要等待两者都完成后再向前移动。

将绿色部署升级到新版本并可用后,您的集群将如下屏幕截图所示。

创建 Aurora 无服务器 v2 副本

现在,我们需要使用以下命令为集群设置无服务器参数以匹配我们的要求:

aws rds modify-db-cluster \
 --db-cluster-identifier GreenClusterID \
 --serverless-v2-scaling-configuration MinCapacity=4,MaxCapacity=32

在此示例中,我们选择了至少 4 个 ACU 和最多 32 个 ACU,但您应该选择对您的工作负载有意义的值。

现在您已经设置了最小和最大 ACU,请向集群添加一个无服务器实例:

aws rds create-db-instance \
 --db-instance-identifier aurora-mysql-serverless-a \
 --db-instance-class db.serverless \
 --engine aurora-mysql \
 --db-cluster-identifier GreenClusterID

aws rds wait db-instance-available \
 --db-instance-identifier aurora-mysql-serverless-a

故障转移到 Aurora 无服务器 v2 实例

当新实例联机并准备就绪时,使用以下命令将其故障转移到该实例:

aws rds failover-db-cluster \
 --db-cluster-identifier GreenClusterID \
 --target-db-instance-identifier aurora-mysql-serverless-a

aws rds wait db-cluster-available \
 --db-cluster-identifier GreenClusterID

故障转移过程将持续几分钟,在此期间,绿色部署将在一段时间内不可用,但蓝色部署仍可为您的应用程序提供服务。故障转移完成后,群集配置如下屏幕截图所示。

数据库集群现在使用一个 Aurora 无服务器 v2 写入器和一个预配置的 Aurora 读取器运行。使用以下命令移除临时预置的实例:

aws rds delete-db-instance \
 --db-instance-identifier GreenInstanceID

接下来,我们使用绿色部署的端点对新数据库版本进行全面测试,以确保应用程序没有任何不兼容性。

当你确信你的应用程序对新版本感到满意时,请按如下方式执行蓝/绿故障转移:

aws rds switchover-blue-green-deployment \
 --blue-green-deployment-identifier BlueGreenDeploymentIdentifier \
 --switchover-timeout 120
 
aws rds wait db-cluster-available \
 --db-cluster-identifier aurora-mysql-serverless

aws rds wait db-instance-available \
 --db-instance-identifier aurora-mysql-serverless-a

我们用从前面的命令中获得的实际值替换了 BlueGreenDeploymentIdentif ier。

在此示例中,我们已指定,如果系统无法在 120 秒内完成切换,则应回滚。有关此参数的更多信息,请参阅 切换-蓝绿-部署

完成后,集群看起来像下面的屏幕截图。

清理迁移期间创建的临时资源

最后,您可以删除源实例(以前是蓝色)、源集群和蓝/绿部署本身:

aws rds delete-db-instance \
 --db-instance-identifier OldDatabaseInstanceID
 
aws rds delete-db-cluster \
 --db-cluster-identifier aurora-mysql-serverless-old1 \
 --final-db-snapshot-identifier OldDatabaseClusterID

aws rds delete-blue-green-deployment \
 --blue-green-deployment-identifier BlueGreenDeploymentIdentifier

和以前一样,我们用创建 蓝/绿部署时获得的实际值替换了 BlueGreenDeploymentIdenti fier。集群现在看起来像下面的屏幕截图。

我们已成功将 Aurora 无服务器 v1 数据库迁移到 Aurora 无服务器 v2,停机时间约为 30 秒。

结论

在这篇文章中,我们向您介绍了将现有 Aurora 无服务器 v1 数据库升级到 Aurora 无服务器 v2 的过程。这个新流程允许您轻松地从 v1 迁移到 v2,同时最大限度地减少应用程序停机时间和操作复杂性。我们鼓励您尽快开始计划将数据库从 v1 迁移到 v2。


作者简介

蒂姆·古斯塔夫森 是首席数据库专家解决方案架构师,主要负责开源数据库引擎。


*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您发展海外业务和/或了解行业前沿技术选择推荐该服务。