码迷,mamicode.com
首页 > 其他好文 > 详细

MGR由5.7.24升级至8.0.20记录

时间:2021-06-30 17:59:42      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:允许   statement   exec   his   epo   hang   组成   手动   mysql服务器   

升级原因
    5.7版本的MGR多主模式存在比较严重的问题,无法预知和监控的认证故障,会导致部分行数据无法修改,故急需升级至8.0
 
升级流程
    原集群有5个节点,首先扩容一个5.7.24的节点,将其升级为8.0.20的实例(注意参数的变化,如果数据量比较小,可以采用导出导入的方式,由于mysql8升级非常方便,内部会自动执行upgrade),然后将8.0.20的节点加入原集群,START GROUP_REPLICATION未报错, SELECT * FROM performance_schema.replication_group_members;查看状态正在recovering。如下图所示,
技术图片
从图中可以看到 相对于5.7.24版本多了 member_role 和 member_version列,在5.7.24实例上看还是没有这两列的。
 
等待同步完成。。。。。
 
同步完成后,所有的6个节点都是online状态,此时将8.0.20的节点上线,用于测试是否有可以正常提供服务(此处应当先测试,由于是内部集群直接上线了,不该如此)
一段时间后,业务的提案操作偶发报错,
报错如下:
update table_attribute error: update table_attribute set table_has_no_partition = ‘system_approved‘ where id= 196853 (1290, ‘The MySQL server is running with the --super-read-only option so it cannot execute this statement‘)
看这个报错里出现了 super-read-only ,印象里mgr的节点退出集群时会将自己置为 super-read-only,这是为了防止有写入导致数据不一致,所以猜测时8.0.20的节点有问题导致自动退出集群将自己置为super-read-only
查询报警后没有找到mgr的报警,于是去线上看参数,发现8.0,20的super-read-only确实是on,看来问题找到了。
但是这里不确定是为何为on,所以没有做任何修改,以免破坏现场,先将问题节点下线,解决问题,然后查看该节点的error log,如果是由于故障退出集群error能看到信息,但是error log中没有输出。
于是推测是由于节点加入集群是就是super-read-only状态,这可能是8.0.20的新特性。确认没有报错后,将super-read-only置为off。
为了进行对比,将5.7.24节点STOP GROUP_REPLICATION && START GROUP_REPLICATION;想看看super-read-only参数会变化么,结果发现根本无法加入集群,error log中的报错如下
 
 
2021-06-29T15:25:10.833093+08:00 0 [Note] Plugin group_replication reported: XCom protocol version: 3
2021-06-29T15:25:10.833123+08:00 0 [Note] Plugin group_replication reported: XCom initialized and ready to accept incoming connections on port 15562
2021-06-29T15:25:13.088685+08:00 58520294 [Note] Aborted connection 58520294 to db: unconnected user: mysqlha_common host: 10.73.9.73 (Got an error reading communication packets)
2021-06-29T15:25:13.480498+08:00 0 [ERROR] Plugin group_replication reported: Member version is incompatible with the group
2021-06-29T15:25:13.480555+08:00 0 [Note] Plugin group_replication reported: Group membership changed to 10.190.1.78:5562, 10.182.1.236:5562, 10.185.1.129:5562, 10.41.14.184:5562, 10.13.43.33:5562, 10.41.23.21:5562 on view 16238265148777711:20.
2021-06-29T15:25:13.480558+08:00 58517616 [Note] Plugin group_replication reported: Going to wait for view modification
2021-06-29T15:25:13.480566+08:00 0 [ERROR] Plugin group_replication reported: Message received while the plugin is not ready, message discarded
2021-06-29T15:25:13.480585+08:00 0 [ERROR] Plugin group_replication reported: Message received while the plugin is not ready, message discarded
2021-06-29T15:25:13.480591+08:00 0 [ERROR] Plugin group_replication reported: Message received while the plugin is not ready, message discarded
2021-06-29T15:25:13.480596+08:00 0 [ERROR] Plugin group_replication reported: Message received while the plugin is not ready, message discarded
2021-06-29T15:25:13.480601+08:00 0 [ERROR] Plugin group_replication reported: Message received while the plugin is not ready, message discarded
 
通过报错信息[ERROR] Plugin group_replication reported: ‘Member version is incompatible with the group 合理猜测是由于版本问题,猜测高版本节点可以加入低版本集群,低版本节点不可加入高版本集群(取最高版本)。
 
下面结合官方文档和腾讯云博客(https://cloud.tencent.com/developer/article/1444077)描述下mgr 5.7.24升级为8.0.20的过程以及注意点。
 
1,首先在8.0.16版本之后,mgr集群存在通信协议的概念,可以直接管理MGR通信协议版本,并将其设置为适应你希望MGR成员支持的哪个MySQL服务器版本。从而实现同一个MGR可用组中可以由不同MySQL服务器版本的成员组成。这也是我们可以进行在线的滚动升级的基础。
  1. group_replication_get_communication_protocol 用于获取该MGR成员中最早的MySQL版本的通信协议
技术图片  2. group_replication_set_communication_protocol 需要更改MGR的通信协议版本以便早期版本的成员可以加入,需要具有GROUP_REPLICATION_ADMIN 权限哦
 
技术图片技术图片
技术图片技术图片
这是在不同版本的节点上看通信协议的结果,首先5.7.24不支持这个命令,显然这个是8.0.16新增的功能,其次在8.0.20节点上的支持协议版本是5.7.14,是个很早的版本,这意味这个8.0.20最低可以加入5.7.14版本的MGR集群。那是否意味这5.7.14节点可以加入8.0.20的集群呢,不行,5.7.24都不能直接加入8.0.20集群。
将复制组的所有成员升级到新版本后,通信协议版本不会自动升级,以防仍然需要允许早期版本的成员加入。如果不需要支持老版本,升级后可以使用 group_replication_set_communication_protocol() 功能升级通讯协议。
 
mgr单主模式的升级很简单,类似主从架构升级,先滚动升级从节点,然后切换主,再升级主节点
mgr多主模式升级有些要注意的事,
1,高版本的节点加入集群后会自动变成只读( super-read-only),在8.0.17版本之后,等集群里的节点都升级后,所有节点会自动取消只读模式,8.0.17版本一下就需要手动改参数了。由于我们的集群读写量比较大,为了均摊流量,每升级一个节点,都主动改下参数。
2,紧急情况下 可以使用 group_replication_allow_local_lower_version_join参数将低于最低版本的节点加入集群,无视兼容性,无保护,慎用~
3,MySQL 5.7.22 或 MySQL 8.0.11 尝试加入运行 MySQL 5.7.21 或更低版本的集群时,无法加入,因为 MySQL 5.7.21 没有lower_case_table_names.
4,mgr集群内的通信协议版本必须一致,即使版本不同,也应该使用所有节点能理解的信息
5,为什么低版本不能加入高版本集群(通信协议满足的条件下),比如5.7.24无法加入只有一个8.0.20节点的5.7.24集群,这个原因没有找到。
 
 
 
 
 

MGR由5.7.24升级至8.0.20记录

标签:允许   statement   exec   his   epo   hang   组成   手动   mysql服务器   

原文地址:https://www.cnblogs.com/zzyhogwarts/p/14952186.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!