什么是MGR高可用(完整版)

MGR简介

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

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

  1. 主从复制间容易发生复制延迟,尤其是在5.6以前的版本,以及当数据库实例中存在没有显式主键表时,很容易发生。

  2. 主从复制节点间的数据一致性无法自行实现最终一致性。

  3. 当主节点发生故障时,如果有多个从节点,无法自动从中选择合适的节点作为新的主节点。

  4. 如果采用(增强)半同步复制,那么当有个从节点因为负载较高、网络延迟或其他意外因素使得事务无法及时确认时,也会反过来影响主节点的事务提交。

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

MGR具备以下几个特点:

  1. 基于shared-nothing模式,所有节点都有一份完整数据,发生故障时可以直接切换。

  2. MGR提供了数据一致性保障,默认是最终一致性,可根据业务特征需要自行调整一致性级别。

  3. 支持在线添加、删除节点,节点管理更方便。

  4. 支持故障自动检测及自动切换,发生故障时能自动切换到新的主节点,再配合MySQL Router中间件,应用层无需干预或调整。

  5. 支持单节点、多节点写入两种模式,可根据架构或业务需要选择哪种方案,不过强烈建议选用单主模式

单主(Single-Primary)模式

 多主(Multi-Primary)模式

 但是建议使用单主模式

MGR技术架构

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


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

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

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

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

组复制技术架构

1. 传统主从复制技术架构

传统主从复制的方式是在master节点上执行数据更新事务,而后记录这些事务到binlog中,再将binlog发送到slave节点转储成relay log,在slave节点上再有单独的线程读取这些relay log然后重新执行或应用这些事务,它是shared-nothing的,每个节点都有一份完整的数据副本,其技术流程图如下所示:  

Shared-Nothing(SN)是一种分布式计算架构,其中每个节点都是独立且自给自足的,不存在单点竞争。在这种架构中,没有节点共享存储和硬盘等资源,而是各自管理自己的数据。

MySQL还提供了半同步复制,这是在传统主从复制的基础上增加了一个同步的步骤,master节点上提交事务前,要先等到slave节点确认收到事务信息才可以(所以前文才说当slave节点响应慢时会影响master节点的事务提交),其技术流程图如下所示:

2. MGR组复制技术架构

MGR也是shared-nothing的,每个节点都有一份完整的数据副本,节点间通过GCS(Group Communication System)进行交互。GCS层提供了节点间的全局消息及其有序性的保证。

MGR可以做到在任何节点、任何时间都能执行读写事务(不含只读事务),不过读写事务要被整个复制组确认后才能提交。如果是只读事务则没有这个限制,任何节点都可以发起及提交。

当读写事务准备提交前,它会向复制组发出一个原子广播,内容包括:该事务修改的数据,及其所对应的writeset。复制组中所有节点要么接收该事务,要么都不接收。如果组中所有节点都接收该事务消息,那么它们都会按照与之前发送事务的相同顺序收到该广播消息。因此,所有组成员都以相同的顺序接收事务的写集,并为事务建立全局顺序。

在多个节点上并行执行的事务是可能产生冲突的,这时候就需要对比判断两个并行事务的writeset来确认,这个过程称为事务认证,也叫做冲突检测。事务冲突检测是行级别的,也就是说两个并行的事务更新同一行时,则视为产生冲突。这时的做法是全局顺序在前面的事务可以成功,所有节点都提交该事务。而全局顺序在后面的事务会失败回滚,各节点会删除该事务。这实际上是个分布式的谁先提交谁先赢得事务的规则。

建议:如果经常发生节点间的事务冲突,那最好将这些事务放在同一个节点上执行,这样它们在本地事务并发控制协调下可能都可以提交成功,而不至于由于MGR的冲突检测而导致某个事务总是被回滚。

 下图描述了MGR的组复制协议,可以看到和传统主从复制(及半同步复制)的一些差异。为了简单起见,图中少了共识算法和Paxos相关的信息:

3.MGR的单主和多主模式

在启动时,通过设置选项 group_replication_single_primary_mode 来决定使用哪种模式,各节点中该值的设置要求一致。设置为 ON 时表示采用 单主模式,当设置为 OFF 时表示采用 多主模式

单主模式 下,有且只有一个(Primary)节点可以写入数据,其余(Secondary)节点都只能读数据。而在 多主模式 下,可以在任意节点上同时读写数据。

节点管理

MGR由一组节点构成,每个节点都有唯一的名字,以 UUID 的格式表现。节点可以动态加入或离开(也可能是被动被驱逐)MGR。

MGR的组成员服务用于维护定义各活跃节点的信息,这些活跃节点信息也称之为组视图(view)。各节点的组视图是一致的,这表示在给定时刻组中有哪些活跃成员。

MGR各节点除了在事务提交时要保持一致外,也包括组视图发生变化时也要达成一致。当有新节点加入,或现有节点离开时,都会触发新的组视图变更。

当有节点主动离开集群时,它会触发集群自动重配置,剩下的节点会就新的组视图达成一致。但若节点是因为网络异常或宕机等原因意外离开集群时,则无法触发自动重配置,这时候集群故障检测机制会在该节点离开一段时间后识别到这个状态,并发出重配置组视图的提议。重配置组视图需要得到多数派成员的同意才行,当无法形成一致时,就无法实现自动重配置,需要人工介入处理。无法形成一致意见可能的原因有,剩下的节点数没达到总结点数的一半以上,也就是无法形成多数派。

为了解决这个问题,从MySQL 5.7.22开始,MGR会检查具有相同地址+端口的节点再次以新身份加入集群的情况,确认当前是否还有其旧身份存在。这时候其新身份不能加入,直到旧身份能从集群中删掉。注意:,选项 group_replication_member_expel_timeout 的作用是设置一个等待期,使得节点在被正式驱逐前有更多时间尝试重新加回集群,也就是说处于被怀疑状态的节点,在超时之前还可尝试重新加入集群,再次作为活跃节点。当节点超过 group_replication_member_expel_timeout 阈值并被从集群中驱逐时,或节点执行 STOP GROUP_REPLICATION 退出集群,或因节点宕机等情况下,该节点必须以新身份重新加入集群。

故障检测

MGR自带故障检测机制,它能发现并报告哪个节点处于静默状态,达到一定条件后会认为这个节点已死。它是个分布式的故障检测服务,提供了哪个节点处于(被怀疑)已死状态的信息。

当一个节点静默(不主动发信息,也不回复其他节点的信息)时,可能会触发被怀疑。当节点A在给定时间内还没有收到节点B的消息时,则发生消息超时并引发怀疑。在这之后,集群内其他成员如果一致同意(多数派达成一致)对该节点的怀疑是确定的话,则会判定该节点发生了故障。  

当网络不稳定时,随意两个节点间可能频繁断开和重连,理论上说可能会导致所有节点都会标记为驱逐,集群会退出并需要重建。为了避免这种情况,从MySQL 8.0.20开始,GCS会跟踪标记为驱逐的节点,并决定某个可疑节点是否还留在多数派节点中,这使得集群中至少有一个节点而不会退出。当被驱逐节点正式被从集群中移出时,GCS会删掉起被标记为驱逐的记录,使得它后面还能重新加回。  

容错机制

MGR是基于分布式的Paxos算法实现,因此要求有多数派节点存活以保证投票。这就决定了在不影响系统整体可用性前提下,可容忍发生故障的节点数量。假设总节点数是n,可容忍发生故障的节点数是f,则它们的关系是:n = 2*f + 1。简言之,容忍发生故障的节点数,不高于总节点数的一半。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/434635.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【考研数学】基础660太难了?一个办法搞定660

觉得题目太难,大概率是题目超出了自己当前的水平 题型没见过,或者太复杂,属于跳级学习了,正确的思路就是回归到自己的水平线,题目略难即可。 这样做题的话,大部分题目涉及的点不会超出自己的能力范围&…

Redis探秘:十大最佳应用场景揭示

文章目录 强烈推荐前言:应用场景:缓存:示例 会话管理:示例 队列:示例 计数器和统计:示例 发布/订阅:示例 分布式锁:示例 实时数据处理:示例 限流和速率控制:示例 会话存储和缓存:示例 地理位置应用:示例 总结:强烈推荐专栏集锦写在最后 强烈推荐 前些天…

爆肝!Claude3与ChatGPT-4到底谁厉害,看完你就知道了!

前言: 相信大家在pyq都被这张图片刷屏了把~ 昨天,为大家介绍了一下什么是Claude,今天咱终于弄到号了(再被ban了3个号之后终于是成功的登上去了,如果各位看官觉得咱文章写的不错,麻烦点个小小的关注~你们的…

AI发展历程和常用框架

AI发展历程 近几年的人工智能发展历程可以大致划分为以下几个阶段: 数据驱动的突破(2012-2015年):这一时期,随着大数据的兴起和计算能力的提升,深度学习技术开始取得突破。以AlexNet在2012年ImageNet图像…

考研数学——高数:多元函数微分法及其应用

因为复习阶段全篇很细节的写下来一来比较费时间,二容易导致为了记笔记而记。 接下来的内容只会保留上课中比较有意义的地方,以及有自己助于理解的想法 全微分 助记: 证明是否可微,首先判断两个偏导数是否存在,不存在则…

30m二级分类土地利用数据Arcgis预处理及获取

本篇以武汉市为例,主要介绍将土地利用数据转换成武汉市内各区土地利用详情的过程以及分区统计每个区内各地类面积情况,后面还有制作过程中遇到的面积制表后数据过小的解决方法以及一些相关的知识点: 示例数据下载链接:数据下载链…

(二) 数据库系统的结构抽象与演变

2.1三层模式与两层映像,物理独立性和逻辑独立性 从数据角度可以分为三层视图模式默认指的是全局模式,视图默认指的是外部视图 一个数据库只有一个内模式 DBMS要让用户定义三层模式,程序自动地实现两层映像 。 从外部视图到外模式的数据结构的…

03.axios数据提交和错误处理

一.axios常用请求方法和数据提交 1. 想要提交数据,先来了解什么是请求方法 请求方法是一些固定单词的英文,例如:GET,POST,PUT,DELETE,PATCH(这些都是http协议规定的)&am…

操作系统:进程

目录 1.进程 1.1.进程的基本概念 1.2.进程控制块(PCB) 1.3.进程与PCB 1.4.进程的其他知识 1.4.1.进程与父进程 1.4.2.Linux中进程的创建方式 1.4.3.进程详细信息查看 1.进程 1.1.进程的基本概念 *课本概念:程序的一个执行实例&…

【C++STL详解 —— string类】

【CSTL详解 —— string类】 CSTL详解 —— sring类一、string的定义方式二、string的插入三、string的拼接四、string的删除五、string的查找六、string的比较七、string的替换八、string的交换九、string的大小和容量十、string中元素的访问十一、string中运算符的使用十二、…

android开发基础有哪些,985研究生入职电网6个月

不好意思久等了 这篇文章让小伙伴们久等了。 一年多以来,关于嵌入式开发学习路线、规划、看什么书等问题,被问得没有一百,也有大几十次了。但是无奈自己对这方面了解有限,所以每次都没法交代,搞得实在不好意思。 但…

请说说你对Vue模板编译的理解

Vue模板编译是Vue.js框架的核心之一,它负责将Vue模板转换成渲染函数,从而实现模板的解析和渲染。要深入了解Vue模板编译,我们需要从编译过程、作用、特点等方面进行详细解析。 1. Vue模板编译的作用 Vue模板编译的主要作用是将Vue模板字符串…

【Web安全】SQL各类注入与绕过

【Web安全】SQL各类注入与绕过 【Web安全靶场】sqli-labs-master 1-20 BASIC-Injection 【Web安全靶场】sqli-labs-master 21-37 Advanced-Injection 【Web安全靶场】sqli-labs-master 38-53 Stacked-Injections 【Web安全靶场】sqli-labs-master 54-65 Challenges 与62关二…

LeetCode——二叉树(Java)

二叉树 简介[简单] 144. 二叉树的前序遍历、94. 二叉树的中序遍历、145. 二叉树的后序遍历二叉树层序遍历[中等] 102. 二叉树的层序遍历[中等] 107. 二叉树的层序遍历 II[中等] 199. 二叉树的右视图[简单] 637. 二叉树的层平均值[中等] 429. N 叉树的层序遍历[中等] 515. 在每个…

异地组网搭建方案

在这个信息爆炸的时代,人与人之间的联系变得越来越密切,而异地组网搭建方案也因此变得越 来越重要。无论是跨国企业、远程学习还是国际合作,构建一个快捷稳定的异地组网系统,已经 成为许多组织和个人不可或缺的需求。接下来&#…

强大的ps 命令 -o 自定义输出内容选项

强大的ps 命令 -o 自定义输出内容选项 1、ps命令介绍和作用2、问题描述 1、ps命令介绍和作用 ps 是一个 Unix 和类 Unix 操作系统中常用的命令,用于显示当前运行的进程信息。ps 命令的作用包括: 查看进程信息: ps 命令可以列出当前系统中正…

Matlab代码批处理全国地面气象站点日值数据集(2400站点数据集)

气象数据一直是一个价值较高的数据,它被广泛用于各个领域的研究当中。气象数据包括有气温、气压、相对湿度、降水、蒸发、风向风速、日照等多种指标,但是包含了这些全部指标的气象数据却较难获取,即使获取到了也不能随意分享。 1级目录 文件…

建站人的心酸:发了个官网加固通知,有公司关门的,还有吐槽的。

最近客户网站不是老被攻击么,所有节前发了个网站加固的通知,大部分客户都能理解和支持,也有客户倒闭的,也有想省钱结果费钱的,还有吐槽的。 尊敬的客户: 鉴于近期网络攻击频发,导致少部分客户…

可配置输入参数的接口如何设计

个人博客:无奈何杨(wnhyang) 个人语雀:wnhyang 共享语雀:在线知识共享 Github:wnhyang - Overview 作为程序员,我们绝大多数场景需要根据业务需求来设计系统,开发后端接口&#x…

java微服务技术选型,Java学习的三个终极问题及学习路线规划

前言 在网络技术中基于浏览器的B/S结构无论在PC端还是手机端都充当着至关重要的角色。 PC端自不必说,手机中很多应用虽然是以APP的形式存在,但它采用的还是B/S结构。如今日头条、微信的朋友圈等,这些应用在内部封装了浏览器,后端…