亚马逊AWS官方博客

保驾护航 – Amazon RDS for MySQL 5.7 到 8.0 升级方案

1. 前言

Amazon RDS 支持 MySQL Community Edition 5.7 和 8.0 版本,这意味着您现在已经使用的代码、应用程序和工具可以与 Amazon RDS 一起使用。

为了保证 Amazon RDS MySQL 的可靠性和安全性,亚马逊云科技会不断的推动的数据库版本的迭代,关于升级的具体分析请大家参考:《保驾护航 – Amazon RDS for MySQL 5.7 到 8.0 升级指南》

本篇,我们主要介绍如何进行 MySQL 的版本升级,以及对各种升级方法进行对比。在进入升级步骤之前,我们先梳理下 MySQL 数据库实例的两种升级方式:

  1. 主要版本升级
  2. 次要版本升级

主要版本升级可能会包含与现有应用程序不兼容的数据库变更。因此,您必须手动为数据库实例执行主要版本升级。您可以通过修改数据库实例来启动主要版本升级。但是,执行主要版本升级之前,我们建议您按照 MySQL 的主要版本升级中的说明操作。

次要版本升级仅包括与现有应用程序向后兼容的更改。您可以通过修改数据库实例来手动启动次要版本升级。您也可以在创建或修改数据库实例时启用自动次要版本升级选项。这样做意味着数据库实例在 Amazon RDS 测试并批准新版本后会自动升级。

2. 升级前置条件

在执行升级之前,我们希望您可以完成以下工作,限于篇幅有限,这里不会对每个前置步骤进行展开介绍,我们会给出同系列的参考资料。

  1. 升级前的预检

我们准备可以详细的升级预检查的流程介绍,详细请参考:《保驾护航 – Amazon RDS for MySQL 5.7 到 8.0 升级前预检查 》。

  1. 创建新的参数组

创建参数组并根据原配置设置新的参数组,最大限度减少升级过程中参数不一致带来的影响。具体步骤请参考:《保驾护航 – Amazon RDS for MySQL 5.7 到 8.0 升级指南》。

  1. 更新现有库、代码

您需要根据升级预检查和新版本的特性应用需要更新现有的表结构、代码等。

  1. 选择升级方法

每种升级方法都有自己的适用场景,我们整理了不同升级方案的优缺点,具体请查看:《保驾护航 – Amazon RDS for MySQL 5.7 到 8.0 升级指南》

3. 监控升级过程中数据库可用性(可选)

我们通过不断的模拟读请求和写请求来评估升级过程中数据库的可读写性,但因为数据库数据量、实例类型、网络环境等各种环境的不一致,最终的可用性不可以作为您生产环境的数据库升级的参考,仅帮助您理解升级过程可用性发生的变化。

3.1 读请求健康检查

通过每隔 1 秒循环读请求数据库,判断数据库是否工作正常:

while true;
do
mysql -u admin -p"Abc12345" -h zk-upgrade-direct-5-7-33.xxx.rds.cn-northwest-1.amazonaws.com.cn zk -P 3306 -e  "SELECT now(),@@hostname,@@global.innodb_read_only;"
echo -e "\n\n"
now=$(date +"%T")
echo "Current time : $now"
sleep 1
done

3.2 写请求健康检查

通过每隔 1 秒循环写请求数据库,判断数据库是否写入正常:

while true;
do
mysql -u admin -p"Abc12345" -h zk-upgrade-direct-5-7-33.xxx.rds.cn-northwest-1.amazonaws.com.cn zk -P 3306 -e  "insert into user(name,age,city,sex,address,description) values(concat('user','1'), 1,2,0,'suzhou','description');"
echo -e "\n\n"
now=$(date +"%T")
echo "Current time : $now"
sleep 1
done

4. 升级方案

注意:尽管我们可能做了升级的准备工作,但是因为环境的不一致性,以及从数据重要性的角度出发,我们建议优先在开发/测试环境进行升级方法的验证。

4.1 就地升级

就地升级是指在控制台点击修改按钮或者使用 CLI 命令,优点是简单、易操作;缺陷是可能带来数据库不可用的时间长。

4.1.1 修改配置数据库升级信息

注:本文的下图演示为从 5.7.33 升级到 8.0.32

4.1.2 应用升级

4.1.3 监控分析(可选)

4.2 只读副本切换升级

通过只读副本进行升级的方式核心是通过先升级只读副本,不影响主体数据库读写功能的基础上;通过提升原只读副本为主库的方式来实现快速切换,减少数据库升级的影响。

4.2.1 创建只读副本(可选,如果尚无只读副本需先创建)

选中主库,在操作中选择“创建只读副本”。

创建只读副本的流程中,目前支持两个选项,多可用区数据库实例/单个数据库实例,为了保持新创建的只读副本和数据库主节点在相同的可用区,建议先创建单个数据库实例,并且选择所在可用区和主节点相同,创建后再打开多可用区部署选项。

4.2.2 给只读副本开启备份和多可用区部署

  1. 开启自动备份功能
  2. 选中只读数据库后,操作-选择“转为多可用区部署”。利用多可用区部署功能减少升级过程中只读库的不可用影响。

4.2.3 升级只读副本

选中只读数据库,修改实例的数据库引擎和对应的参数组选项。

等待状态从“升级”变为“可用”状态。

4.2.4 检查复制状态完成

通过查询复制状态,确认升级完成后,数据库只读库的数据同步到最新状态。

升级完成并且状态显示为可用之后,验证升级的只读副本是否与源 MySQL 5.7 数据库实例保持同步。要进行验证,请连接到只读副本并运行 SHOW REPLICA STATUS 命令。如果 Seconds_Behind_Master 字段为 0,则复制保持最新。

4.2.5 提升只读数据库为主库

4.2.6 监控分析(可选)

您可以选择使用 3.1-3.2 章节介绍的方式或自有方式监控监控升级过程中数据库可用性。

如下图所示,整体数据库在 26 分 22 秒后不可用,在 26 分 31 秒正常,因此整体中断时间为 9 秒(因数据库配置和数据量不同,因此仅供参考,不代表实际生产环境)。

4.3 蓝绿切换自动升级

蓝绿部署是指同时存在 2 个实例/集群,在蓝绿部署时,并不停止掉老版本,而是直接部署一套新版本,等新版本运行起来后,再将流量切换到新版本上,从而实现版本升级。

4.3.1 创建蓝绿部署环境

选中现有实例/集群,创建蓝绿部署集群,并选择“绿”版数据库为 8.0 目标版本,指定新版本的参数组信息。

等待数据库蓝绿集群创建完成

此时可以看到,“绿”版数据库引擎已经为 8.0 版本,而旧的”蓝”版依然为 5.7 版本。

4.3.2 在绿版数据库上测试兼容性、数据完整性等

当前绿库为最新版本,此时建议使用应用程序(如 UAT 环境)连接到绿库测试数据库的可用性和兼用性(不建议写入数据)。待测试通过后执行下一步的切换工作。

另外,在切换蓝绿部署前,我们建议您检查 Amazon CloudWatch 中以下指标的值:

  • ReplicaLag – 使用此指标来确定绿色环境中当前的复制滞后。要减少停机时间,请在切换之前确保此值接近零。
  • DatabaseConnections – 使用此指标估算蓝绿部署上的活动水平,并在切换之前确保该值处于部署的可接受水平。如果开启了“性能详情”,则 DBLoad 是更准确的指标。

4.3.3 执行蓝绿数据库切换

观察切换过程的状态变化:

切换完成后,原“绿”库变为了现在的主库(蓝库)并保留了原主库的 endpoint 地址,之前的“蓝”库被重命名为“old1”。

4.3.4 删除新的绿环境

在蓝绿环境切换完成后,我们建议根据您的业务情况观察一段时间;确认正常运行后,我们可以尝试删除绿库以节约资源和成本(注意备份)。

4.3.5 监控分析(可选)

如果您选择了使用 3.1-3.2 章节介绍的方式或自有方式监控监控升级过程中数据库可用性,可以看到:

  1. 写入过程的影响时间为 1 分 25 秒(因为测试数据和实例不同,不代表实际生产环境的时间)。
  2. 在读取操作中,我们通过每隔1秒的循环的健康检查日志信息可以看出,读取过程无中断。

5. 总结

最后,本文在属于数据库升级系列博客:《保驾护航 – Amazon RDS for MySQL 5.7 到 8.0 升级》。在本文中介绍了就地升级、只读副本切换升级、蓝绿环境自动切换升级 三种升级方式。您可以根据升级操作复杂度、停机时间影响等制约因素选择合适的方法进行升级。当然,数据库升级不止于这 3 种方法,限于篇幅有限本文没有提及,如果您关注一些其他升级方式欢迎关注本系列的其他文章。

6. 参考资料

  1. https://thinkwithwp.com/blogs/database/best-practices-for-upgrading-amazon-rds-for-mysql-and-amazon-rds-for-mariadb/
  2. https://docs.thinkwithwp.com/zh_cn/AmazonRDS/latest/UserGuide/USER_UpgradeDBInstance.MySQL.html
  3. https://dev.mysql.com/doc/mysql-shell/8.0/en/mysql-shell-utilities-upgrade.html#mysql-shell-utilities-upgrade-about
  4. https://www.percona.com/blog/mysql-8-shell-upgrade-checker-utility/
  5. https://dev.mysql.com/blog-archive/upgrading-to-mysql-8-0-here-is-what-you-need-to-know/
  6. https://dev.mysql.com/downloads/file/?id=515761
  7. https://dev.mysql.com/doc/mysql-shell/8.0/en/mysql-shell-install-linux-quick.html
  8. https://dev.mysql.com/doc/refman/8.0/en/mysqlcheck.html
  9. https://www.modb.pro/db/476815
  10. https://catalog.us-east-1.prod.workshops.aws/workshops/0135d1da-9f07-470c-9845-44ead3c78212/en-US/lab3/task5

系列博客

本篇作者

张凯

AWS 解决方案架构师,主要负责基于 AWS 云计算的解决方案架构设计和的方案咨询;擅长的行业有教育、物流、电商等行业,加入前曾在顺丰、京东任职研发管理和项目管理等职务,具有多年的架构设计、项目管理经验。

马丽丽

亚马逊云科技数据库解决方案架构师,十余年数据库行业经验,先后涉猎 NoSQL 数据库 Hadoop/Hive、企业级数据库 DB2、分布式数仓 Greenplum/Apache HAWQ 以及亚马逊云原生数据库的开发和研究。

李芬芳

亚马逊云科技数据库专家,负责亚马逊云科技数据库相关的架构优化、成本管理、技术咨询等工作。加入 AWS 之前曾就职于腾讯、唯品会、圆通速递等公司,有多年数据库管理经验。

刘营宇

西云数据解决方案架构师,10+年软件架构设计、研发经验。对系统架构、云计算技术有丰富的经验。

李宁

西云数据技术客户经理,负责为亚马逊云科技中国客户提供企业级技术支持和专业指导。曾就职于全球领先的数据库公司。在高并发、高可用数据库架构设计,数据处理以及数据库管理和性能优化等方面具有丰富的经验。

肖福生

西云数据解决方案架构师,负责西云数据华南区域的云计算方案咨询和设计,同时致力于亚马逊云科技在国内的应用和推广。在加入西云数据之前,在云计算行业担任解决方案架构师,负责互联网行业的云计算方案咨询以及架构设计,在企业软件架构,数据库,中间件软件等方面有丰富的经验。