1. MGR简介 | 深入浅出MGR

1. MGR简介 | 深入浅出MGR,第1张

MGR是MySQL Group Replication的缩写,即MySQL组复制。

在以往,我们一般是利用MySQL的主从复制或半同步复制来提供高可用解决方案,但这存在以下几个比较严重的问题:

因为上述几个明显的缺点,因此MySQL推出了全新的高可用解决方案 -- 组复制,这是本系列文章要着重介绍的新特性。

MGR是MySQL 5.7.17开始引入的,但随着5.7版本逐渐退出历史舞台(MySQL 5.7已于2020年10月起不再做大的功能更新,只有修修补补以及针对安全更新),更多MGR相关特性都只在MySQL 8.0上才有。

因此,如果线上还有基于MySQL 5.7版本的MGR环境的话,建议尽快升级、迁移到MySQL 8.0版本。进一步提醒,推荐MySQL 8.0.22及之后的版本,整体会更稳定可靠,也有些很不错的新功能(不只是MGR方面的)。

MGR具备以下几个特点:

MGR可以选择单主(Single-Primary)模式

如上图所示,一开始S1节点是Primary角色,提供读写服务。当它发生故障时,剩下的S2-S5节点会再投票选举出S2作为新的Primary角色提供读写服务,而S1节点再达到一定超时阈值后,就会被踢出。

亦可选择多主(Multi-Primary)模式(再次 强烈建议选用单主模式

如上图所示,一开始S1-S5所有节点都是Primary角色,都可以提供读写服务,任何一个节点发生故障时,只需要把指向这个节点的流量切换下就行。

上述两种架构模式下,应用端通过MySQL Router连接后端在MGR服务,当后端节点发生切换时,Router会自动感知,对应用端来说几乎是透明的,影响很小,架构上也更灵活。

首先来个MGR的技术架构图:

MGR是以Plugin方式嵌入MySQL,部署更灵活方便。

事务从Server层通过钩子(hook)进入MGR API接口层,再分发到各组件层,在组件层完成事务Capture/Apply/Recover,通过复制协议层(Replication Protocol Logics)传输事务,最后经由GCS协调事务在各节点的最终一致性。

MGR节点间由组通信系统(GCS)提供支持,它提供了故障检测机制、组成员角色管理,以及安全且有序的消息传递,这些机制可确保在各节点间一致地复制数据。这项技术的核心是Paxos算法的实现,在MySQL里称之为XCom,由它充当MGR的通信引擎。

对于要提交的事务,组中的多数派节点必须就全局事务序列中给定的事务顺序达成一致。各节点做出决定提交或中止事务的选择,但所有节点都要做出相同的决定。如果发生网络分区,导致节点间无法达成一致决定,则在网络恢复前,MGR无法工作。

MGR支持单主和多主两种模式,在单主模式下,各节点会自动选定主节点,只有该主节点能同时读写,而其他(从)节点只能只读。在多主模式下,所有节点都可以进行读写。

相对于MariaDB Galera Cluster(以及基于此技术的Percona XtraDB Cluster,下面为了书写方便,都统称为PXC),个人认为MGR具备以下几个优势:

相对于传统主从复制(Replication),我认为MGR的优势有以下几点:

以上是我根据MySQL、MariaDB、Percona的资料整理得到的观点,不一定准确和全面,有不完善的地方还请留言指正。

本节主要介绍了什么是MGR,MGR的技术架构概要,以及MGR相对PXC的几个技术优势。

MGR是MySQL四部战略走的关键一环,依靠MGR和MySQL Shell、MySQL Router已实现了读节点扩展,以及写节点扩展(MGR多主模式),下一步预计实现sharding,让我们拭目以待。

相信MGR也是MySQL未来几年的重头戏,建议跟紧方向,不要错过这班列车。

因个人水平有限,专栏中难免存在错漏之处,请勿直接复制文档中的命令、方法直接应用于线上生产环境。请读者们务必先充分理解并在测试环境验证通过后方可正式实施,避免造成生产环境的破坏或损害。

Enjoy GreatSQL :)

所有mysql实例皆为MYSQL8版本,使用的Xtrabackup备份组件为xtrabackup8.

生产mysql使用基于percona的分支,相对于原版mysql多了一些性能调教和监控视图,版本为:percona-server-server-8.0.22,备份相关工具对mysql8的官方版本也是完全兼容的.percona的分支相关信息: https://www.percona.com/software/mysql-database/percona-server

生产环境mysql一共3个实例,使用MGR组成集群以实现灵活的高可用与读写分离.并由前置的proxysql进行数据的路由与转发.

模拟故障为:在生产环境mysql8 的MGR集群完全不可用,有前一天的Xtrabackup全量备份和增量备份,需要从之前的全量和增量备份完整恢复到故障最近的时间点.本次故障恢复的要求是读取前一天的所有增量和全量数据并恢复.快速重组生产MGR集群.

在这里会用ansible脚本快速搭建3个mysql实例,以模拟生产环境(略过).

backup_func.sh :

策略是每天的0:30做一次全量备份,之后每两个小时的半点会做一次增量备份.

注: 本次恢复属于完整的生产环境集群恢复,下面的 获取备份文件 , 准备备份 , 开始恢复 相关流程,需要在每一台服务器上执行,实际 *** 作中,如果只需要恢复并查看数据则只做一个点就可以了.

这里取的是前一天的打过包的备份文件,根据备份脚本的规则,每天凌晨的全量备份之前,会自动将前一天的全量备份和增量备份目录全部打包并以前一天的日期命名:

20210609.tar.gz

将其scp到待恢复的服务器上并解压:

解压后的目录结构:

确保需要恢复的服务器有mysql实例,xtrabackup8工具已安装,由于备份是经过压缩的,确保qpress也已安装.

由于备份脚本在备份时使用了 --compress 指令,在恢复备份前,需要先解压缩备份,

这里将所有增量和全量备份路径均执行一下解压缩指令:

在同时存在全量和增量备份需要合并的情况下,准备备份时需要带上 --apply-log-only 参数,但是要注意在准备最后一个增量备份的时候,不需要加该参数.

以上 *** 作会将所有的增量备份合并到全量备份中.

根据各自安装时指定的相关路径去删除数据.(data,binglog,logs,undolog),一般在my.cnf中有指定

如果my.cnf不是在默认路径(/etc/my.cnf),需要指定一下mysql配置文件的路径: --defaults-file=${DB_CONF}

至此,备份数据在单节点上的恢复已经完成了.

查看下最后一份增量备份里才会有的一些数据

先确保同样的mysql恢复 *** 作分别在三台服务器上执行完成.(如果在新建服务器上恢复MGR集群,一定要检查my.cnf中MGR集群相关配置,比如 loose-group_replication_local_address , loose-group_replication_group_seeds , loose-group_replication_start_on_boot )

master节点启动:

MGR的三台节点的权重实际上是一样的,选择其中的一台做master即可.

mster节点启动完成后,再分别在两台slave节点启动MGR:

由于3台mysql实例的数据是一样的,节点间状态同步迅速就OK了.

至此,3台mysql的MGR状态均为 online ,整个集群启动完成,全演练流程结束.


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/8662539.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-19
下一篇 2023-04-19

发表评论

登录后才能评论

评论列表(0条)

保存