请启用 Javascript 以查看内容

AWS RDS MySQL升级8.0

 ·  ☕ 8 分钟  ·  ✍ CNSRE · 👀... 阅读

作者:SRE运维博客
博客地址:https://www.cnsre.cn/
文章地址:https://www.cnsre.cn/posts/231215114645/
相关话题:https://www.cnsre.cn/tags/aws/


一. 前言

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

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

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

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

二. 升级前置条件

在执行升级之前,可以完成以下工作。

1、升级前核对
  • 核对升级数据库
  • 核对升级前操作
    • 是否有参数需要新增
    • 是否有参数需要调整(如果有一定要提前创建参数组和选项组)
    • 是否有sql 需要执行
  • 核对业务是否在开发、测试环境验证是否通过?
2、创建新的参数组

创建参数组并根据原配置设置新的参数组,最大限度减少升级过程中参数不一致带来的影响。
具体可以再参数组中创建新的参数组,并修改以下参数:

character_set_client    utf8mb4
character_set_connection    utf8mb4
character_set_database  utf8mb4
character_set_filesystem    binary
character_set_results   utf8mb4
character_set_server    utf8mb4
innodb_file_per_table   1
binlog_format ROW
innodb_print_all_deadlocks  1
long_query_time 120
max_connect_errors  1000
max_user_connections    400
slow_query_log  1
3、更新现有库、代码

了解新版本的特性应用更新现有的表结构、代码等。

4、备份数据库
5、升级方法

在进行真正升级时,有几种不同的升级方法可供选择:

  • 原地升级。直接在数据库上点击,更改成新的 8.0 版本。操作简单,可能停机时间稍长。此外,为保证能够成功回溯,建议在升级以前先打个快照。一旦升级过程中出现问题,可以将快照恢复到一个新的数据库,将生产环境指向新库,以防对生产环境影响时间过长。
  • 只读副本升级。创建 RDS 的一个只读副本,将只读副本升级成目标版本 8.0,等待复制延迟较低时,将只读副本 promote 成单独集群,再更改应用程序指向新的集群。
  • 蓝绿部署自动化升级。利用 Amazon 提供的蓝绿部署升级工具,创建对应生产环境的绿集群,监控复制延迟,然后点击 switchover 进行升级。自动化蓝绿部署工具会自动切换 endpoint 信息,所以无需更改应用程序指向集群链接。
  • 手动蓝绿部署升级。自己创建一套绿环境,和蓝环境间搭建 binlog 复制机制,然后监控复制延迟。延迟较低时,对蓝环境停写,等待绿环境追平,将应用程序指向绿环境。
  • DMS 全量加增量升级。建立一个空的 8.0 集群,配置 DMS 的全量+增量升级,进行升级操作。可以参照该文档

下面是几种升级方式的对比图:

升级类型 停机时间 升级复杂度 适用的数据集规模 注意事项
原地升级 各种规模 1)提前打快照。因为 RDS 打快照是增量快照的方式,升级前提前打快照能够加速原地升级本身的时间 2)评估停机时间
只读副本升级 较短 较低 各种规模 1)应用更改 Endpoint 连接。应用需要连接到新的数据库集群 2)副本提升后要生成和源集群相同拓扑
蓝绿部署自动化升级 较低 各种规模 1)如果 RDS 后有 binlog consumer,需要先停止复制,再蓝绿切换以后重新对外提供服务前拿绿环境上 binlog 文件和位移,再配置 consumer 2)监控复制延迟较小时再点击切换
手动蓝绿部署升级 各种规模 1)应用更改 Endpoint 连接; 2)监控复制延迟较小时再点击切换 3)binlog filter 配置,建议 exclude 系统库,因为 8.0 和 5.7 的系统表可能不一致,在创建 binlog 复制时最好过滤掉。可以通过参数 replicate-do-db- 来配置需要同步的业务数据库,或者通过参数 replicate-ignore-db 来配置需要忽略的数据库(information_schema/mysql/performance_schema/sys)
DMS 全量加增量升级 较小数据量 1)DMS 正确配置 2)Binlog filter 配置,建议 exclude 系统库,因为 8.0 和 5.7 的系统表可能不一致,在创建 binlog 复制时最好过滤掉。可以通过 DMS 创建复制任务的时候通过 Selection rules 来指定需要复制的数据库

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

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

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.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 给只读副本开启备份和多可用区部署

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

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 分 25 秒(因为测试数据和实例不同,不代表实际生产环境的时间)。


在读取操作中,我们通过每隔1秒的循环的健康检查日志信息可以看出,读取过程无中断。


六. 文章链接

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


作者:SRE运维博客
博客地址:https://www.cnsre.cn/
文章地址:https://www.cnsre.cn/posts/231215114645/
相关话题:https://www.cnsre.cn/tags/aws/


您的鼓励是我最大的动力
alipay QR Code
wechat QR Code

Avatar
作者
CNSRE
一位只会重启的运维






目录