暂无图片
暂无图片
7
暂无图片
暂无图片
暂无图片

Mysql MGR 的滚动升级

原创 大表哥 2022-06-01
1493

image.png

大家好,这次大表哥分享的是 mysql MGR 的滚动升级过程。

对于生产环境来说,升级数据库是一件十分 critcal 重要的事情。 风险是十分大的! 尤其是大版本的数据库升级,作为DBA必须要谨慎对待。
对于数据库的升级:

  1. 需要开发人员进行必要的代码改造
  2. 需要测试人员进行完全的回归的功能点测试和必要的性能测试
  3. 需要DBA根据自己数据库特性,进行前期分析升级的可能性以及故障点。 并且一定要准备升级失败的版本降级回滚的方案。
    DBA 需要根据升级的风险以及数据库的大小:选择是inplace 的升级 还是 logical 的升级。
  4. 需要全体人员在测试环境上进行升级前的预演,及时发现潜在的问题。

简单地说, 数据库升级绝对不是简单的DBA一个人的事情,前期就需要所有相关人员的参与。

本片本章到此其实最重要已经说完了。

下面我们看看从DBA的技术层面,如何对MYSQL MGR 进行升级:

首先中最要的说三遍:
一定要阅读 官网的mysql 升级文档!!!
一定要阅读 官网的mysql 升级文档!!!
一定要阅读 官网的mysql 升级文档!!!

比起市面上任何的资料,博客,公众号, 官方文档是最权威的!!! 必要要仔细阅读一遍。。。

https://dev.mysql.com/doc/refman/8.0/en/upgrading.html

一共14个小的章节:

image.png

1)我们先看一下 mysql 版本的升级路径

mysql 5.7 -> mysql 8.0
mysql 5.6 -> mysql 5.7 -> mysql 8.0
mysql 8.0.x - mysql 8.0.y

简单地说: 是不能够跨越大版本升级的, 想从 5.6 直接升级到 8.0 是不行的。
image.png

2)需要分析一下升级到 mysql 8.0 对你的应用的影响(如果老的版本是5.7)

https://dev.mysql.com/doc/refman/8.0/en/upgrading-from-previous-series.html

这里列出比较重要的几点:

a)默认权限插件的改变: mysql_native_password --》 caching_sha2_password
这个可能会导致应用程序连不上
b)SQL_MODE 默认值的改变: 可能会导致应用的SQL语法解析报错

3) 升级前对数据库进行全面的检查

https://dev.mysql.com/doc/refman/8.0/en/upgrade-prerequisites.html

官网推荐用: mysql shell 的升级检查工具 : mysqlsh> util.checkForServerUpgrade()

4)升级前一定要对数据库进行全备份。

建议使用 xtrabackup 或者企业版的备份工具

5)滚动升级数据库

我们这次是 从 8.0.15 升级到 8.0.27, 采取的是MGR的滚动升级。

原有数据库信息:

image.png

mysql> select * from replication_group_members; +---------------------------+--------------------------------------+--------------+-------------+--------------+-------------+----------------+ | CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION | +---------------------------+--------------------------------------+--------------+-------------+--------------+-------------+----------------+ | group_replication_applier | 16d296b7-83d1-11ec-8d13-005056aefbb6 | 10.67.39.149 | 3072 | ONLINE | SECONDARY | 8.0.15 | | group_replication_applier | 30af63d9-7db1-11ec-9d58-f403439dfd00 | 10.67.38.50 | 3072 | ONLINE | PRIMARY | 8.0.15 | | group_replication_applier | 89866a9b-7db1-11ec-9d58-f403439dfd00 | 10.67.39.49 | 3072 | ONLINE | SECONDARY | 8.0.15 | +---------------------------+--------------------------------------+--------------+-------------+--------------+-------------+----------------+ 3 rows in set (0.00 sec)

我们采用滚动升级:

我们先是升级一下 secondary : 10.67.39.49 这台机器:
老的mysql home : /opt/mysql/product/8.0/bin
新的mysql home: /opt/mysql/product/percona8.0/bin

a)设置 关闭数据库为 slow 的方式:
mysql> set global innodb_fast_shutdown = 0; Query OK, 0 rows affected (0.00 sec)
b)关闭数据库
mysql> select @@innodb_fast_shutdown; +------------------------+ | @@innodb_fast_shutdown | +------------------------+ | 0 | +------------------------+ 1 row in set (0.00 sec) mysql> shutdown; Query OK, 0 rows affected (0.00 sec)
c) 新的 mysql 软件启动数据库
/opt/mysql/product/percona8.0/bin/mysqld_safe --defaults-file=/data/mysql3072/my_mysql3072.cnf > update.log 2>&1 &

我们从error log 中也可以看到 data dictionary 和 mysql server upgrading 的信息的完成的信息

2022-06-01T13:37:45.561650+08:00 1 [System] [MY-011090] [Server] Data dictionary upgrading from version '80014' to '80023'. 2022-06-01T13:37:45.561688+08:00 1 [Note] [MY-013327] [Server] MySQL server upgrading from version '80015' to '80027'. 2022-06-01T13:37:46.236266+08:00 1 [System] [MY-013413] [Server] Data dictionary upgrade from version '80014' to '80023' completed. 2022-06-01T13:37:53.746243+08:00 5 [System] [MY-013381] [Server] Server upgrade from '80015' to '80027' completed.

根据官方的升级文档来说升级是分为如下2个步骤:

Step 1: Data dictionary upgrade. This step upgrades: The data dictionary tables in the mysql schema. If the actual data dictionary version is lower than the current expected version, the server creates data dictionary tables with updated definitions, copies persisted metadata to the new tables, atomically replaces the old tables with the new ones, and reinitializes the data dictionary. The Performance Schema, INFORMATION_SCHEMA, and ndbinfo. Step 2: Server upgrade. This step comprises all other upgrade tasks. If the server version of the existing MySQL installation is lower than that of the new installed MySQL version, everything else must be upgraded: The system tables in the mysql schema (the remaining non-data dictionary tables). The sys schema. User schemas.

对于升级到 mysql 8.0.16版本以及之后的版本来说, 不再需要执行 mysql_upgrade 这个命令, 未来这个命令会被废弃掉。

image.png

d) 我们观察这个时候MGR的集群状态
mysql> select * from replication_group_members; +---------------------------+--------------------------------------+--------------+-------------+--------------+-------------+----------------+ | CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION | +---------------------------+--------------------------------------+--------------+-------------+--------------+-------------+----------------+ | group_replication_applier | 16d296b7-83d1-11ec-8d13-005056aefbb6 | 10.67.39.149 | 3072 | ONLINE | SECONDARY | 8.0.15 | | group_replication_applier | 30af63d9-7db1-11ec-9d58-f403439dfd00 | 10.67.38.50 | 3072 | ONLINE | PRIMARY | 8.0.15 | | group_replication_applier | 89866a9b-7db1-11ec-9d58-f403439dfd00 | 10.67.39.49 | 3072 | ONLINE | SECONDARY | 8.0.27 | +---------------------------+--------------------------------------+--------------+-------------+--------------+-------------+----------------+ 3 rows in set (0.00 sec)
e)我们再去升级另外一个节点10.67.39.149
mysql> set global innodb_fast_shutdown = 0; Query OK, 0 rows affected (0.00 sec) mysql> shutdown; Query OK, 0 rows affected (0.00 sec) mysql> exit; Bye uat mysql@wqdcsrv3354[14:01:19]:~ $ /opt/mysql/product/percona8.0/bin/mysqld_safe --defaults-file=/data/mysql3072/my_mysql3072.cnf > update.log 2>&1 & [1] 111199
f)我们查看MGR的集群的状态
mysql> select * from replication_group_members; +---------------------------+--------------------------------------+--------------+-------------+--------------+-------------+----------------+ | CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION | +---------------------------+--------------------------------------+--------------+-------------+--------------+-------------+----------------+ | group_replication_applier | 16d296b7-83d1-11ec-8d13-005056aefbb6 | 10.67.39.149 | 3072 | ONLINE | SECONDARY | 8.0.27 | | group_replication_applier | 30af63d9-7db1-11ec-9d58-f403439dfd00 | 10.67.38.50 | 3072 | ONLINE | PRIMARY | 8.0.15 | | group_replication_applier | 89866a9b-7db1-11ec-9d58-f403439dfd00 | 10.67.39.49 | 3072 | ONLINE | SECONDARY | 8.0.27 | +---------------------------+--------------------------------------+--------------+-------------+--------------+-------------+----------------+ 3 rows in set (0.00 sec)
g) 手动切换主节点到 10.67.39.49
mysql> select group_replication_set_as_primary('16d296b7-83d1-11ec-8d13-005056aefbb6'); +--------------------------------------------------------------------------+ | group_replication_set_as_primary('16d296b7-83d1-11ec-8d13-005056aefbb6') | +--------------------------------------------------------------------------+ | Primary server switched to: 16d296b7-83d1-11ec-8d13-005056aefbb6 | +--------------------------------------------------------------------------+ 1 row in set (0.17 sec) mysql> select * from replication_group_members; +---------------------------+--------------------------------------+--------------+-------------+--------------+-------------+----------------+ | CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION | +---------------------------+--------------------------------------+--------------+-------------+--------------+-------------+----------------+ | group_replication_applier | 16d296b7-83d1-11ec-8d13-005056aefbb6 | 10.67.39.149 | 3072 | ONLINE | PRIMARY | 8.0.27 | | group_replication_applier | 30af63d9-7db1-11ec-9d58-f403439dfd00 | 10.67.38.50 | 3072 | ONLINE | SECONDARY | 8.0.15 | | group_replication_applier | 89866a9b-7db1-11ec-9d58-f403439dfd00 | 10.67.39.49 | 3072 | ONLINE | SECONDARY | 8.0.27 | +---------------------------+--------------------------------------+--------------+-------------+--------------+-------------+----------------+ 3 rows in set (0.00 sec)
h) 关机升级最后一个节点
mysql> set global innodb_fast_shutdown = 0; Query OK, 0 rows affected (0.00 sec) mysql> shutdown; Query OK, 0 rows affected (0.00 sec) mysql> exit; Bye uat mysql@wqdcsrv3352[14:16:46]:~ $ /opt/mysql/product/percona8.0/bin/mysqld_safe --defaults-file=/data/mysql3072/my_mysql3072.cnf > update.log 2>&1 & [1] 33105
i) 查看此时的MGR的集群的状态
mysql> select * from replication_group_members; +---------------------------+--------------------------------------+--------------+-------------+--------------+-------------+----------------+----------------------------+ | CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION | MEMBER_COMMUNICATION_STACK | +---------------------------+--------------------------------------+--------------+-------------+--------------+-------------+----------------+----------------------------+ | group_replication_applier | 16d296b7-83d1-11ec-8d13-005056aefbb6 | 10.67.39.149 | 3072 | ONLINE | PRIMARY | 8.0.27 | XCom | | group_replication_applier | 30af63d9-7db1-11ec-9d58-f403439dfd00 | 10.67.38.50 | 3072 | ONLINE | SECONDARY | 8.0.27 | XCom | | group_replication_applier | 89866a9b-7db1-11ec-9d58-f403439dfd00 | 10.67.39.49 | 3072 | ONLINE | SECONDARY | 8.0.27 | XCom | +---------------------------+--------------------------------------+--------------+-------------+--------------+-------------+----------------+----------------------------+ 3 rows in set (0.00 sec)

至此所有的节点都升级到了 8.0.27 版本。

最后,还是要强调一下,DBA 必须要根据自身的应用系统的特点,来制定合适的升级方案:

1)Inplace(本地升级): 适合小版本的升级,代码无需改动,MGR,或者master/slave这种的主从 可以实现不down机的滚动升级
2)logical (逻辑同步升级): 适合数据大版本的跨越的升级, 前期需要进行数据同步, 需要和应用运维配置来实现系统的cutover,一旦出问题,可以快速切回到老版本的数据库。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论