热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MySQL高可用MGR入门(4)异常恢复

点击蓝字关注我们前文阅读:1.MySQL高可用--MGR入门(1)单主多主模式搭建2.MySQL高可用--MGR入门(2&#

点击蓝字

关注我们

796eb5be6a651eac6c2410b54829d879.png

前文阅读:

1.MySQL高可用--MGR入门(1)单主/多主模式搭建

2.MySQL高可用--MGR入门(2)组复制监控常用相关表

3.MySQL高可用--MGR入门(3)单主/多主模式切换

1.网络异常

MGR 对网络要求很高,有的时候会因网络波动,自动退出集群的情况,此时需要先在出问题的节点停止组复制,然后再重新加入到集群中。

如下,该节点被踢出集群,直接执行Stop group_replication;报错:

cc2f976af39cc7da954902b66db77905.png

需要先执行 stop group_replication 然后再 start group_replication:

Stop group_replication;
Start group_replication;

ed85395e9634147ecc003212d5921c1e.png

2.节点启动长时间处于RECOVERING

ee2a8275b271eb2b38e019f6de32c19a.png

  • 查看日志:

9f8901aa53eec816675009e6587e4533.png

  • 在主节点将密码的加密方式修改:

SET SQL_LOG_BIN=0;
alter USER repl@'%' IDENTIFIED WITH mysql_native_password BY 'repl';
GRANT REPLICATION SLAVE ON *.* TO repl@'%';
GRANT BACKUP_ADMIN ON *.* TO repl@'%';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;

  • 再重启两个从节点:

STOP GROUP_REPLICATION;
START GROUP_REPLICATION;

  • 2节点状态恢复正常:

b4e0b14179efe372490ee5cf2ef9f510.png

  • 3节点状态恢复正常:

a606e9012918ed08729f4f92645cf19b.png

3.数据异常修复

3.1暂时性恢复

MGR 对数据具有一定的容错性和最终一致性,原则上并不会出现数据不一致的情况,并且每次执行事务都会检测冲突,如果某个节点的数据因为异常导致不一致,切主节点的 binlog 丢失的情况,势必会导致集群数据不一致,此时可以通过以下的方法暂时让集群起来。

停止异常节点的组复制Stop group_replication;清空当前的 GTID EXECUTEDReset master;在异常节点将 GTID 事务号设置和主节点一致SET @@GLOBAL.GTID_PURGED='主节点的 GTID 号';启动异常节点的组复制Start group_replication;

这里需要注意,这样的方式即使恢复了集群,因为 binlog 的缺失,实际上数据是不一致的,极有可能发生后续因为数据不一致导致集群出现问题,这里强烈不建议这么做。

4.分布式恢复

前面提到了暂时性的集群恢复,这样的恢复会有很大的问题,这里将阐述 MGR 正常的恢复方式。当 MGR 中新的成员加入节点时,通常有两种方法,当 binlog 全,或者 binlog 在删除前接入的节点能够成功继续往下同步的,则新加入的节点会继续同步下去,在 MySQL 8.0.21 版本中,可以通过设置参数:

group_replication_advertise_recovery_endpoints

来进行指定点进行同步。

如果在 binlog 不可用或者差的数据实在太多的情况下,MySQL 在 8.0.17 后退出了克隆的方式进行恢复,即在集群中的所有 MySQL 节点上添加克隆插件,新加入的节点数据将会被全部删除,然后会被自动重新同步数据。

4.1节点分布式恢复

读节点重新加入环境。

模拟读节点重新加入,首先观察主节点的数据以及事务的情况:

此时将节点 3,清除所有数据,清除同步信息,重新初始化 MySQL,模拟成新节点。

  • 已有数据:

9a93588e2f1edf681eac8c0be3f68685.png

  • 关库:

5f554a414bbb01255c5475480017934a.png

  • 删数据文件:

5ac9884c9007349621b15585cde4be5d.png

此时3节点已经被集群踢出去了:

305fed2e05e948f0464daaad9af44041.png

  • 重新初始化,启动,并登录:

初始化
mysqld --defaults-file=/etc/my.cnf --basedir=/usr/local/mysql --initialize-insecure --datadir=/data/3306/data --user=mysql &
启动
mysqld_safe --defaults-file=/etc/my.cnf --user=mysql & 
登录
mysql -u root

35e214944231e1374f46dddffb603881.png

5d7716279f3a9bf5ecd354b522bbcd84.png

这里注意,因为 2 节点的的 IP 已经添加到了所有节点的 group_replication_group_seeds 中,所以不再添加,如果是新的 IP 加入节点,必须在所有其他节点上 group_replication_group_seeds 中添加新节点的IP。

  • 按照搭建 MGR 节点的步骤,将节点 2 添加到集群中:

Reset master;
INSTALL PLUGIN group_replication SONAME 'group_replication.so';
CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='repl' FOR CHANNEL 'group_replication_recovery';
START GROUP_REPLICATION;

78ca5e3da7007684fcfb23e5275365c0.png

  • 已经重新加入到集群中,数据也同步回来:

a0ca0b842a0ad0627db1b4afe7c0a157.png

89cf8d3e21b87cca827b0319a89cb887.png

  • 可以看到同步事务已经一致:

e5484115772f61073e51a3c5f3e005d7.png

4.2克隆恢复

MySQL 8.0.17 后可以使用克隆恢复。

这里我们依然采用节点 3 作为需要接收克隆的节点。

  • 首先在源节点和接收克隆的节点添加克隆插件:

INSTALL PLUGIN clone SONAME 'mysql_clone.so';

  • 同样因为是组复制,所以节点 3 必须装组复制插件:

INSTALL PLUGIN group_replication SONAME 'group_replication.so';

2de598166f38952201611f08b0040637.png

  • 其次在提供克隆的节点上,也就是节点 1 上赋权:

CREATE USER clone_user@'%' IDENTIFIED by '123456';
GRANT BACKUP_ADMIN ON *.* TO 'clone_user'@'%';

  • 在接收克隆的目标节点,也就是节点 2 上赋权:

CREATE USER clone_user@'%' IDENTIFIED by '123456';
GRANT CLONE_ADMIN ON *.* TO 'clone_user'@'%';

  • 在接收克隆的目标节点上设置源端的白名单:

SET GLOBAL clone_valid_donor_list = '192.168.168.101:3360';

  • 为了验证克隆是否会清除接收端上的数据,这里我们多建几个 schema 在节点3执行:

CLONE INSTANCE FROM clone_user@'192.168.168.101':3360 IDENTIFIED BY '123456';

  • 完成之后,把节点3重新加入到集群:

CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='repl' FOR CHANNEL 'group_replication_recovery';
start GROUP_REPLICATION;

  • 完成恢复


墨天轮原文链接:https://www.modb.pro/db/170916?sjhy(复制链接至浏览器或点击文末阅读原文查看)

关于作者

陈家睿,云和恩墨MySQL技术顾问,拥有MySQL OCP、PGCE、OBCA、SCDP证书,长期服务于电信行业。现负责公司MySQL数据库、分布式数据库运维方面的技术工作;热衷于运维故障处理、备份恢复、升级迁移、性能优化的学习与分享。

END

推荐阅读:331页!2021年度数据库技术年刊

推荐下载:2021数据技术嘉年华视频回放及PPT下载


2021数据技术嘉年华50余个PPT下载、视频回放已上传墨天轮平台,可在“数据和云”公众号回复关键词“2021DTC”获得!

你知道吗?我们的视频号里已经发布了很多精彩的内容,快去看看吧!↓↓↓

点击下图查看更多 ↓

68f2a37d925f6c8fa8339f805aadc134.png

1d4c9d7c05940e785acc736fb8d0a62c.png

19693043a51a2144f64461bdb558c2c3.png

云和恩墨大讲堂 | 一个分享交流的地方

长按,识别二维码,加入万人交流社群

请备注:云和恩墨大讲堂

  点个“在看” 

你的喜欢会被看到❤



推荐阅读
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 树莓派Linux基础(一):查看文件系统的命令行操作
    本文介绍了在树莓派上通过SSH服务使用命令行查看文件系统的操作,包括cd命令用于变更目录、pwd命令用于显示当前目录位置、ls命令用于显示文件和目录列表。详细讲解了这些命令的使用方法和注意事项。 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • 如何用JNI技术调用Java接口以及提高Java性能的详解
    本文介绍了如何使用JNI技术调用Java接口,并详细解析了如何通过JNI技术提高Java的性能。同时还讨论了JNI调用Java的private方法、Java开发中使用JNI技术的情况以及使用Java的JNI技术调用C++时的运行效率问题。文章还介绍了JNIEnv类型的使用方法,包括创建Java对象、调用Java对象的方法、获取Java对象的属性等操作。 ... [详细]
  • GreenDAO快速入门
    前言之前在自己做项目的时候,用到了GreenDAO数据库,其实对于数据库辅助工具库从OrmLite,到litePal再到GreenDAO,总是在不停的切换,但是没有真正去了解他们的 ... [详细]
author-avatar
时间证明一2602891163
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有