初识MYSQL组复制MGR

news2024/11/26 8:25:58

注:本文翻译自https://dev.mysql.com/doc/refman/8.0/en/group-replication.html

背景

创建容错系统的最常见方法是使组件冗余,换句话说,可以删除组件,而系统应继续按预期运行。这就产生了一系列挑战,将这类系统的复杂性提升到了一个完全不同的水平。具体来说,复制数据库必须处理这样一个事实,即它们需要维护和管理多台服务器,而不仅仅是一台服务器。此外,当服务器一起协作创建组时,必须处理其他几个经典的分布式系统问题,例如网络分区或分裂大脑场景。
因此,最终的挑战是将数据库和数据复制的逻辑与以一致和简单的方式协调多个服务器的逻辑融合在一起。换句话说,要让多个服务器就系统的状态和系统所经历的每次更改的数据达成一致。这可以概括为让服务器在每个数据库状态转换上达成一致,以便它们都作为一个数据库前进,或者它们最终收敛到相同的状态。这意味着它们需要作为(分布式)状态机进行操作。
MySQL组复制提供分布式状态机复制,在服务器之间具有很强的协调性。当服务器属于同一组时,它们会自动进行协调。该组可以在具有自动主选举的单主模式下运行,其中一次只有一个服务器接受更新。或者,对于更高级的用户,可以将组部署在多主模式中,其中所有服务器都可以接受更新,即使它们是并发发布的。这种能力的代价是应用程序必须绕过这种部署所施加的限制。
有一个内置的组成员服务,它可以保持组视图的一致性,并在任何给定的时间点对所有服务器可用。服务器可以离开或加入组,视图也会相应地更新。有时,服务器可能会意外地离开组,在这种情况下,故障检测机制会检测到这种情况,并通知组视图已更改。这都是自动的。
为了提交事务,组中的大多数成员必须就给定事务在全局事务序列中的顺序达成一致。决定提交或中止事务是由每个服务器单独完成的,但所有服务器都做出相同的决定。如果存在网络分区,导致成员无法达成协议的分裂,则系统不会继续进行,直到此问题得到解决。因此,也有一个内置的,自动的,分裂的大脑保护机制。
所有这些都由提供的组通信系统(GCS)协议提供支持。它们提供了故障检测机制、组成员服务以及安全且完全有序的消息传递。所有这些属性对于创建一个确保数据在服务器组之间一致复制的系统至关重要。该技术的核心是Paxos算法的实现。它充当群组通信引擎。

传统复制技术

传统的MySQL Replication提供了一种简单的从源到副本的复制方法。源是主要的,有一个或多个副本,它们是次要的。源应用事务,提交它们,然后(因此是异步的)将它们发送到副本,以便重新执行(在基于语句的复制中)或应用(在基于行的复制中)。它是一个无共享的系统,默认情况下,所有服务器都有数据的完整副本。
在这里插入图片描述

还有一种半同步复制,它在协议中添加了一个同步步骤。这意味着主服务器在应用时等待辅助服务器确认它已接收到事务。只有这样,主服务器才能恢复提交操作。
在这里插入图片描述

在这两张图中,有一个经典的异步MySQL复制协议的示意图(以及它的半同步变体)。不同实例之间的箭头表示服务器之间交换的消息或服务器与客户端应用程序之间交换的消息。

组复制

组复制是一种可用于实现容错系统的技术。复制组是一组服务器,每个服务器都有自己的完整数据副本(无共享复制方案),并通过消息传递相互交互。通信层提供了一组保证,例如原子消息和总订单消息传递。这些都是非常强大的属性,可以转化为非常有用的抽象,可以用来构建更高级的数据库复制解决方案。
MySQL组复制建立在这样的属性和抽象之上,并实现了一个多源更新无处不在的复制协议。复制组由多个服务器组成,组中的每个服务器可以在任何时候独立执行事务。然而,所有读写事务只有在被组批准后才会提交。换句话说,对于任何读写事务,组需要决定是否提交,因此提交操作不是来自原始服务器的单方面决定。只读事务不需要组内的协调,可以立即提交。
当读写事务准备在原始服务器上提交时,服务器会自动广播写值(已更改的行)和相应的写集(已更新行的唯一标识符)。因为事务是通过原子广播发送的,所以要么组中的所有服务器都接收到事务,要么没有服务器接收到事务。如果他们收到它,那么他们都以与之前发送的其他交易相同的顺序收到它。因此,所有服务器都以相同的顺序接收相同的事务集,并为这些事务建立一个全局总顺序。
但是,在不同服务器上并发执行的事务之间可能存在冲突。这种冲突是通过检查和比较两个不同并发事务的写集来检测的,这个过程称为认证。在认证期间,冲突检测是在行级别执行的:如果在不同服务器上执行的两个并发事务更新了同一行,那么就存在冲突。冲突解决过程声明,首先排序的事务在所有服务器上提交,然后排序的事务终止,因此在原始服务器上回滚,并由组中的其他服务器删除。例如,如果t1和t2在不同的站点并发执行,都更改同一行,并且t2在t1之前排序,则t2在冲突中获胜,t1被回滚。这实际上是一个分布式的先提交获胜规则。请注意,如果两个事务经常发生冲突,那么最好在同一台服务器上启动它们,这样它们就有机会在本地锁管理器上同步,而不是由于认证而回滚。
为了应用和外部化经过认证的事务,如果不破坏一致性和有效性,Group Replication允许服务器偏离商定的事务顺序。Group Replication是一个最终一致性系统,这意味着一旦传入流量减慢或停止,所有组成员都具有相同的数据内容。当流量流动时,事务可以以稍微不同的顺序外部化,或者在其他成员之前外部化一些成员。例如,在多主模式下,本地事务可能会在认证之后立即外部化,尽管还没有应用全局顺序中较早的远程事务。当认证过程确定事务之间不存在冲突时,这是允许的。在单主模式下,在主服务器上,并发的、无冲突的本地事务可能以与Group Replication商定的全局顺序不同的顺序提交和外部化。在不接受客户端写的辅助服务器上,事务总是按照约定的顺序提交和外部化。
下图描述了MySQL组复制协议,并将其与MySQL复制(甚至MySQL半同步复制)进行比较,您可以看到一些差异。为了清晰起见,在这幅图中遗漏了一些潜在的共识和与Paxos相关的信息。
在这里插入图片描述

多主模式和单主模式

组复制可以在单主模式或多主模式下运行。组的模式是组范围的配置设置,由系统变量group_replication_single_primary_mode指定,该变量在所有成员上必须相同。ON表示默认模式为单主模式,OFF表示多主模式。不可能将组的成员部署在不同的模式中,例如,一个成员配置为多主模式,而另一个成员配置为单主模式。
当“组复制”正在运行时,不能手动修改“group_replication_single_primary_mode”的值。从MySQL 8.0.13开始,您可以使用group_replication_switch_to_single_primary_mode()和group_replication_switch_to_multi_primary_mode()函数在组复制仍在运行时将组从一种模式移动到另一种模式。这些功能管理更改组模式的过程,并确保数据的安全性和一致性。在早期版本中,要更改组的模式,必须停止group Replication并在所有成员上更改group_replication_single_primary_mode的值。然后执行组的完全重新启动(由服务器启动,其中group_replication_bootstrap_group=ON),以实现对新操作配置的更改。不需要重新启动服务器。
无论采用何种部署模式,Group Replication都不处理客户端故障转移。这必须由中间件框架(如MySQL Router 8.0)、代理、连接器或应用程序本身来处理。

组复制插件架构

MySQL Group Replication是一个MySQL插件,它建立在现有的MySQL复制基础设施上,利用了二进制日志、基于行的日志记录和全局事务标识符等特性。它集成了当前的MySQL框架,如性能模式或插件和服务基础设施。下图是一个描述MySQL组复制整体架构的框图。
在这里插入图片描述

MySQL Group Replication插件包括一组用于捕获、应用和生命周期的api,这些api控制插件如何与MySQL服务器交互。有一些接口可以使信息流从服务器流向插件,反之亦然。这些接口将MySQL Server核心与Group Replication插件隔离开来,并且大多数是放置在事务执行管道中的钩子。在一个方向上,从服务器到插件,有事件通知,例如服务器启动、服务器恢复、服务器准备接受连接以及服务器即将提交事务。在另一个方向上,插件指示服务器执行诸如提交或中止正在进行的事务,或在中继日志中排队事务等操作。
Group Replication插件体系结构的下一层是一组组件,当通知路由到它们时,它们会做出反应。捕获组件负责跟踪与正在执行的事务相关的上下文。应用程序组件负责在数据库上执行远程事务。恢复组件管理分布式恢复,并负责通过选择提供者、管理赶上过程和对提供者失败作出反应,使加入组的服务器保持最新状态。
沿着堆栈向下,复制协议模块包含复制协议的特定逻辑。它处理冲突检测,接收事务并将其传播到组。
组复制插件架构的最后两层是组通信系统(GCS) API和基于paxos的组通信引擎(XCom)的实现。GCS API是一个高级API,它抽象了构建复制状态机所需的属性。因此,它将消息传递层的实现与插件的其余上层解耦。组通信引擎处理与复制组成员的通信。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构与算法·第5章【数组和广义表】

数组 基本操作 InitArray(&A, n, bound1, ..., boundn)DestroyArray(&A)Value(A, &e, index1, ..., indexn)Assign(&A, e, index1, ..., indexn)数组的顺序表示 两种顺序映象的方式: 以行序为主序(低下标优先);以列序为主序(高下标优先)。 而 n…

Go语言学习-创建Go模块(1)

这是介绍Go语言基础特性的第一部分教程。如果你是开开开始学习Go,请确保你看了关于介绍Go语言语法,Go模块的简洁代码文章:启动Go 在本教程中,你将会创建两个模块。第一个模块是个库来被用作其他库或者应用程序来引用。第二个模块是…

msvcp140.dll重新安装的三个解决方法,解决找不到msvcp140.dll问题

msvcp140.dll是Microsoft Visual C Redistributable for Visual Studio 2015的一个重要组件,它是一个动态链接库文件(DLL),包含许多用于开发和执行C程序的函数。如果它不在您的计算机上或不正确,您将收到一个错误消息&…

linux 部署mysql

本文介绍下Centos7中mysql的安装(Centos7以下版本中有些命令和centos7中有些不同,安时需注意下自己的linux版本) 事先准备 1、查看系统中是否自带安装mysql yum list installed | grep mysql ![在这里插入图片描述](https://img-blog.csdnimg.cn/e322b2f4036c4d9…

不愧是华为出来的,太强了。。。

前言 实习去了博彦科技(外包),做的就是螺丝钉的活,后面还因为人效不佳,被开了。 正式毕业后去了另外一个做电子发票的公司,但是都是功能测试和一点点APP测试,然后经常被开发怼,测试…

【Linux】13. 文件操作

1. 重新认识文件 经过之前的linux命令操作、进程相关概念的学习,我们对于文件也并不陌生 首先需要明确以下概念: 即使是空文件,也要在磁盘当中占据空间文件 文件内容 文件属性文件操作 对文件内容的操作 或者 对文件属性的操作 或者 二者…

软件测试人到30岁+,还有出路吗???

最近一个学生也可以说是朋友,他遇到了一个让他困扰的职场难题,背景如下: 1)他们公司准备搞安全测试了,现在有人员培训的计划,所以全组有学习安全测试课程的安排。 2)他自己目前专职性能测试1年了…

基于SSM的物流仓库管理系统

摘 要 随着社会的发展,社会的方方面面都在利用信息化时代的优势。互联网的优势和普及使得各种系统的开发成为必需。 本文以实际运用为开发背景,运用软件工程原理和开发方法,它主要是采用java语言技术和mysql数据库来完成对系统的设计。整个…

“专精特新”发展概况

专精特新概念自2011年开始萌芽,2021年上升为国家战略,2022年写进二十大报告,顶层设计持续推进,旨在聚焦产业链关键环节,加强技术创新,破解核心技术“卡脖子”问题。全国各地政府从企业调研、整体设计、培育…

AI崛起:哪些职位将首当其冲?

随着人工智能的迅猛发展,人们普遍担心自己的工作是否会被AI取代。虽然是否能毁灭人类尚难以确定,但可以肯定的是,AI绝对会抢走某些职位。以下是十个职业,它们很可能是被AI取代的首批。 制造业:随着自动化机器人的进步…

docker-compose 搭建 zipkin 服务端

目录 基于docker-compose搭建服务端 数据库 服务器 docker-compose.yaml 问题 测试 基于docker-compose搭建服务端 数据库 我这边存储选择了Mysql存储,新建了 zipkin库,数据库脚本如下 -- -- Copyright 2015-2019 The OpenZipkin Authors -- -- Li…

Java单元测试学习(二)

Java单元测试学习&#xff08;二&#xff09; 使用测试框架JUnitMockito和单元测试覆盖率框架JaCoCo 目录结构 依赖—很好&#xff0c;这里又有个小插曲 打开页面查看覆盖率时一直显示0/0---->最后的解决方式是①添加了maven-surefire-plugin插件 <?xml version&quo…

C++中流的分类

前言 关于流本质的问题&#xff0c;其实从我刚开始学习C的时候&#xff0c;就已经存在了。当时找了不少的资料&#xff0c;不过一直处于那种知其然而不知其所以然的状态&#xff0c;关于流的本质问题我还是一直没有搞通&#xff0c;始终就是懵懵懂懂的。 不过在今天&#xff0…

智能电能表采集失败的原因和解决方法

智能电能表采集失败的原因和解决方法 智能电能表作为现代电力系统中的重要组成部分&#xff0c;在电能计量、电费结算等方面发挥着关键作用。然而&#xff0c;在实际应用过程中&#xff0c;有时会出现电能表采集失败的情况&#xff0c;这可能源于网络连接故障、数据传输错误等…

数据结构基础-堆

堆实现 计算机科学中&#xff0c;堆是一种基于树的数据结构&#xff0c;通常用完全二叉树实现。堆的特性如下 在大顶堆中&#xff0c;任意节点 C 与它的父节点 P 符合 P.value \geq C.value而小顶堆中&#xff0c;任意节点 C 与它的父节点 P 符合 P.value \leq C.value最顶层…

维护嵌入式 Linux 内核——So Easy

导读Pengutronix 内核黑客 Jan Lbbe 总结了嵌入式 Linux 中正在不断增长的安全威胁&#xff0c;并在这次欧洲嵌入式 Linux 会议上概述了一个计划&#xff0c;以保持长期设备的安全和功能完整。 安全漏洞只发生在 Windows 上的好日子正在快速过去。恶意软件黑客和拒绝服务老手们…

【InsCode AI 创作助手】关于编程人员的未来发展趋势,看看AI们怎么说

一、你平时会使用这类AI工具吗&#xff1f;你对这类型的工具有什么看法&#xff1f; 1&#xff09;会经常使用AI工具吗&#xff1f; 是的&#xff0c;我在生活和工作中经常会使用AI工具&#xff0c;尤其是chatGPT&#xff08;3.5&#xff09;和文心一言&#xff0c;关于midjour…

【微信小程序开发】第 5 节 - 小程序代码的构成

欢迎来到博主 Apeiron 的博客&#xff0c;祝您旅程愉快 &#xff01; 时止则止&#xff0c;时行则行。动静不失其时&#xff0c;其道光明。 目录 1、缘起 2、了解项目的基本组成结构 3、小程序页面的组成部分 4、JSON 配置文件 4.1、json 配置文件的作用 4.2、app.json 文…

http首部(下)

开始头大&#xff0c;哈哈&#xff0c;这个东西真的很无聊且枯燥&#xff0c;奈何最近的学习中经常用到这些知识&#xff0c;还是过一遍比较放心。上一篇博客中我们讨论了http报文首部&#xff0c;其划分为请求头和响应头。请求头主要由请求行、请求字段、通用字段、实体字段组…

ChatGPT请不要和打工人争辩今天星期几

目录 1 今天星期几2 聊聊ChatGPT与工具的结合 1 今天星期几 周五了&#xff0c;一个星期快结束了&#xff0c;闲来问问chatgpt (gpt-3.5) 今天 ( 2023.06.03星期五&#xff09;星期几&#x1f601;&#xff0c;chatgpt给出的回答如下&#xff1a; 今天是2023年6月2号没错&…