MYSQL--架构--MGR--理论--02--架构

2023-11-16

MYSQL–架构–MGR–理论–02–架构


1、架构图

在这里插入图片描述

1.1、主要组成

  1. APIs接口层
  2. 组件层
  3. 复制协议模块层
  4. GCS API+Paxos 引擎层

1.2、事务进入 MGR 层内部处理过程

  1. 应用发来的事务从 MySQL Server 经过 MGR 的 APIs接口层 分发到组件层。
  2. 组件层去 处理 事务相关信息,然后经过复制协议层进行事务传输,最后经过 GCS API+Paxos 引擎层保证事务在各个节点数据最终一致性

2、单主模式(single-primary mode)

在这里插入图片描述

2.1、介绍

  1. 主节点1个,且可写可读,从节点N个,且只读
  2. 当主节点故障时,会自动选举一个新的主节点,选举成功后,它将设置为可写,其他slave将指向这个新的主节点。
  3. 多数情况下都是配置单主模型的MGR
  4. 优点:
    1. 没有数据不一致的危险
    2. 限制少
    3. 配置简单
    4. 学习成本低
  5. 缺点:性能比多主模型差

2.2、选举

2.2.1、指定主节点

  1. 使用group_replication_set_as_primary()指定特定成员作为新的主节点
  2. MySQL 8.0.13或 更高版本

2.2.2、自动选举主节点(优先级从高到低)

  1. 哪个成员运行的MySQL 版本最低最优先。低版本优先是考虑到高版本同步到低版本,高版本可能有一些新特性,无法在从库正常回放,导致同步出现问题。
    1. MySQL 8.0.17或以上版本:组成员将首先按照发布的补丁版本进行排序。
    2. MySQL 8.0.16或以下版本:成员将首先按其发布的主要版本排序,并忽略补丁版本。
  2. 版本号一致的情况下会按照节点自身存在权重设置进行选举,权重高的优先选举
    1. 由group_replication_member_weight参数控制,默认50
  3. 如果上述条件无法完成选主则按照server_uuid排序进行选举,选取UUID最小的成员作为主成员

2.3、从节点提升为主前,要处理积压的事务

  1. 可靠性优先:如果有积压的事务,需要等积压的事务全被应用完,才能在新主上进行读写操作。
    1. group_replication_consistency=BEFORE_ON_PRIMARY_FAILOVER
  2. 可用性优先:不管是否有积压的事务,直接在新主上进行读写操作,性能最好,单主模式下基本适用;
    1. group_replication_consistency=EVENTUAL

3、多主模式(multi-primary mode)

在这里插入图片描述

3.1、介绍

  1. 任何一个节点都可写可读,都是主节点,是真正意义上的并发,这种部署对于高并发有很好的的处理能力。
  2. 通过Group Replication Protocol协议及Paxos协议,形成的整体高可用解决方案
  3. 只要突然故障的节点数量不太多,这个多主模式就能继续可用。
  4. 优点:性能比单主模型高
  5. 缺点:
    1. 必须要深入理解组复制的理论
    2. 限制较多,其一致性、安全性还需要多做测试。

3.2、选举

不存在选举主节点,因为所有节点都是主节点。

3.3、缺陷

  1. 不支持SERIALIZABLE事务隔离级别
  2. 不能完全支持级联外键约束。

3.4、事务冲突检查

  1. 增加了certify的概念,负责检查事务是否允许提交,是否与其它事务存在冲突。
  2. Group Replication是由多个节点共同组成一个数据库集群,每个节点都可以单独执行事务,但是readwrite(rw)的操作只有在组内验证后才可以commit,Read-only (RO)事务是不需要验证,可以立即执行,当一个事务在一个节点上提交之前,会在组内自动进行原子性的广播,告知其他节点变更了什么内容,执行了什么事务,然后为该事务建立一个全局的排序,最终,这意味着所有的服务器都以相同的顺序接收相同的事务集。因此,所有服务器都按照相同的顺序应用相同的变更集,因此它们在组中保持一致。

4、复制原理

节点一个事务提交时,会将事务修改记录相关的信息和事务产生的BINLOG事件打包生成一个写集(WRITE SET),将写集发送给所有节点,并通过至少N个节点投票通过才能事务提交成功。

在这里插入图片描述

5、故障检测

5.1、MGR成员相互监听

MGR的成员之间会互相发送检测消息,当 服务器A 在给定的时间内没有接收到 服务器B 的消息时,会发生超时并产生怀疑。认为 服务器B 可能挂了

5.2、投票

如果MGR的成员 同意怀疑可能是真的,这意味着组中其他成员采取协调一致的决定来驱逐 服务器B。

5.3、注意

在网络不稳定的情况下,成员之间可能会多次断开和重连,极端情况,一个组最终可能会将所有成员标记为驱逐,之后组不复存在,必须重建。

为了应对这种情况,从 MySQL 8.0.20 开始,组通信系统(GCS)跟踪已经被标记为驱逐的成员,然后决定是否有大多数成员将其标记为怀疑。这样可以确保至少有一个成员留在主中,当被剔除的成员实际上已经从组中删除时,GCS 将删除该成员被剔除的记录,以便该成员可以在恢复之后重新加入组。

6、流控

在多主模式中,速度较慢的成员还可能积累过多的事务以进行认证和应用,可能会导致冲突、认证失败或者读到过期数据等风险。为了解决这些问题,可以激活和调优 Group Replication 的流控制机制,以最小化快成员和慢成员之间的差异。

6.1、loose_group_replication_flow_control_mode = DISABLED

 
1. 关闭流控机制
2. 默认:QUOTA: 开启
3. DISABLE:关闭流控机制
4. 建议:由于判断机制不太准确,并且性能损耗严重,建议DISABLE  

6.2、触发流控的两种情况

6.2.1、证书队列中等待的事务数超过 下面设置的值

# 触发流控的待认证队列长度
group_replication_flow_control_certifier_threshold=25000

6.2.2、应用程序队列中等待的事务数超过 下面设置的值

# 触发流控的待执行队列长度 
group_replication_flow_control_applier_threshold=25000 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MYSQL--架构--MGR--理论--02--架构 的相关文章

  • MySQL PHP邮政编码比较具体距离

    我试图找出比较一个邮政编码 用户提供的 和一大堆其他邮政编码 现在大约有 200 个邮政编码 之间的距离的最有效方法 相对于加载时间 但它会随着时间的推移而增加 我不需要任何精确的东西 只是在球场上 我下载了整个美国的邮政编码 csv 文件
  • Mysql 中 UNION 子句的替代方案

    我有两张桌子 表 a 表 b table a ID 1 2 3 4 5 7 table b ID 2 3 4 5 6 我必须得到这样的输出而无需UNION命令 ID 1 2 3 4 5 6 7 注意 我有一个联合解决方案 select fr
  • 在 MySQL 中使用 COUNT 时如何返回 0 而不是 null

    我使用此查询返回存储在 sTable 中的歌曲列表以及存储在 sTable2 中的总项目数 SQL queries Get data to display sQuery SELECT SQL CALC FOUND ROWS str repl
  • MySQL连接字符集问题

    我在 Mac 上使用带有 MySQL 的 velosurf 没有任何编码问题 但是当我切换到 Linux 计算机时 从 velosurf 获得的值未正确编码 我发现这可能是默认连接字符集的问题 在 Mac 上我得到 mysql gt sho
  • Flask-login:无法理解它是如何工作的

    我试图理解如何Flask Login https flask login readthedocs org en latest works 我在他们的文档中看到他们使用预先填充的用户列表 我想使用数据库存储的用户列表 但是 我不明白其中的一些
  • 如何从shell脚本自动登录MySQL?

    我有一个 MySQL 服务器 其中有一个用户和密码 我想在 shell 脚本中执行一些 SQL 查询而不指定密码 如下所示 config sh MYSQL ROOT root MYSQL PASS password mysql sh sou
  • 映射 mysql 中同一个表的多个值

    您好 我必须使用另一个表中的值 id 获取文本值 表 1 包含值 ID 表 2 包含名称和值 ID 表 1 SEVERITY OCCURENCE DETECTABILITY 2 3 4 表 2 id name value 1 Very Hi
  • Mysql 时间匹配连接

    我有两个表cpuinfo和jobinfo 我想使用这两种数据创建报告 tabes CREATE TABLE cpuinfo id int 11 NOT NULL AUTO INCREMENT usagetime datetime DEFAU
  • 显示标准化数据

    跟进问题 添加 2 个不同表的总和 https stackoverflow com questions 39717541 adding sum from 2 different tables 我创建了3个表 members videos v
  • MySql - 复制监控工具[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有一个主 从 MySql 复制 我正在寻找一个允许我监视复制的工具 查看它没有错误 检查滞后等 我更喜
  • 在 C# 中,当有人插入、删除或修改记录时,如何从 MySQL 获取事件?

    我正在 WPF Net 中开发一个程序 我需要知道何时有人对数据库的任何表进行更改 这个想法是在数据库发生更改时从数据库接收一个事件 我读了很多文章 但找不到解决我的问题的方法 亲切的问候 最好的解决方案是使用消息队列 在您的应用程序向数据
  • 如何在mysql中选择具有相同值集的列?

    我的桌子是 patients pid name city disease did dname has disease did pid 我想列出具有相同疾病组的患者 pid 和 did 分别是患者和疾病表中的主键 并且是 has diseas
  • MySQL - 从临时表插入

    这看起来非常简单 但我坚持使用简单的插入语句 见下文 begin work CREATE TEMPORARY TABLE IF NOT EXISTS insert table AS select r resource id fr file
  • MySQL 和 Hibernate 之间的主键自增由谁负责?

    MySQL CREATE TABLE role id role INT 11 unsigned NOT NULL AUTO INCREMENT PRIMARY KEY id role AUTO INCREMENT 1 休眠 Entity p
  • covertJSONtoSQL 在 NiFi 中返回空值

    我正在设计一项工作 使用以下命令将数据从 MySQL 中的数据库转移到另一个数据库 MySQL 执行SQL处理器随后将Avro转换为Json then 将Json转换为SQL then PutSQL如下流程图所示 将JSON转换为SQL返回
  • 合并两个 MYSQL SELECT 查询[重复]

    这个问题在这里已经有答案了 可能的重复 如何将两个 Post Category 表 MYSQL SELECT 查询合并为一个 https stackoverflow com questions 12972130 how to combine
  • 什么时候应该使用 C++ 而不是 SQL?

    我是一名 C 程序员 偶尔使用 MySQL 来处理数据库 但我的 SQL 知识相当有限 但我肯定愿意改变这一点 目前 我正在尝试仅使用 SQL 查询对数据库中的数据进行分析 但我准备放弃了 转而将数据导入到C 中 用C 代码进行分析 我和同
  • mysql 中的二进制、十六进制和八进制值

    我对在 mysql 数据库中使用二进制 十六进制和八进制系统非常感兴趣 首先 请给我一个建议 为什么我们在存储信息时需要它们 因为信息太多 或者为什么 另外 哪种类型的值必须存储在标记系统中 另外这里还有像 这是例子 gt SELECT 5
  • 如何从批量数据中的mysql列中删除所有非数字字符

    我想从列中删除所有非数字字符 我的数据库中有大量数据 目前我正在使用以下链接中描述的方法 http venerableagents wordpress com 2011 01 29 mysql numeric functions http
  • 如何在MYSQL中将整个字符串小写并保持第一个大写[重复]

    这个问题在这里已经有答案了 我的表栏目 我预期的输出会在列中发生变化 Smith Allen Doyle Dennis Baker Waker 这是我尝试过的 但不起作用 UPDATE TABLE employee SET last nam

随机推荐

  • 2019年‘泰迪杯’数据分析职业技能大赛A题——个人代码分享

    目录 题目 任务 1 数据预处理与统计 任务 2 数据分析与可视化 代码展示 任务一 任务二 题目 任务 1 数据预处理与统计 任务 1 1 对数据作必要的预处理 在报告中列出处理步骤 将处理后的结 国保存为 task1 1 csv 任务
  • C++之string赋值

    string s string a abcdefg 1 将字符串a的元素赋值逐一赋值给另一字符串s s a i 2 将字符串a完全赋值给新字符串s s assign a 3 将字符串a的一部分赋值给新的字符串s start是截取字符串的首位
  • 【转】mysql索引(最左匹配原则)

    阐述 通常我们在建立联合索引的时候 相信建立过索引的同学们会发现 无论是Oracle 还是 MySQL 都会让我们选择索引的顺序 比如我们想在 a b c 三个字段上建立一个联合索引 我们可以选择自己想要的优先级 a b c 或是 b a
  • 常用语言的线程模型(Java、go、C++、python3)

    背景知识 软件是如何驱动硬件的 硬件是需要相关的驱动程序才能执行 而驱动程序是安装在操作系统内核中 如果写了一个程序A A程序想操作硬件工作 首先需要进行系统调用 由内核去找对应的驱动程序驱使硬件工作 而驱动程序怎么让硬件工作的呢 驱动程序
  • STM8L在IAR编译时出现Warning[Pe188]: enumerated type mixed with another type

    STM8L在IAR编译时出现Warning Pe188 enumerated type mixed with another type 给枚举变量赋值了其它类型 产生的原因可能和编译器有关 具体原因尚不清楚 但可以在调用处加入强制类型转换下
  • Cow Marathon(树的直径)(暂存)

    Cow Marathon After hearing about the epidemic of obesity in the USA Farmer John wants his cows to get more exercise so h
  • dedecms织梦后台添加变量提示Request var not allow

    一共找到了两种解决方案 第一种解决方案 根目录打开include common inc php找到下面内容 检查和注册外部提交的变量 2011 8 10 修改登录时相关过滤 function CheckRequest val if is a
  • 贵阳个税系统代理服务器地址,贵阳金三个税服务器地址

    贵阳金三个税服务器地址 内容精选 换一换 文章目录一 keepalived 1 keepalived是什么 2 keepalived工作原理二 配置步骤 第一步 配置两台DR第二步 配置第一台节点服务器web1第三步 配置第二台节点服务器w
  • 设计模式 - 外观模式

    1 介绍 1 1定义 定义了一个高层 统一的接口 外部与通过这个统一的接口对子系统中的一群接口进行访问 1 2 主要作用 实现客户类与子系统类的松耦合 降低原有系统的复杂度 提高了客户端使用的便捷性 使得客户端无须关心子系统的工作细节 通过
  • TCP/IP介绍001

    自下而上分为 网络接口层 网络层 传输层 应用层四部分 其各层作用分为 网络接口层 TCP IP最底层 负责接收IP数据包并通过网络发送 或者从网络上接收物理帧 抽出IP数据报 交给IP层 网络层 是TCP IP协议族中非常关键的一层 主要
  • Oracle11.2.0.4升级补丁包

    Oracle11 2 0 4升级补丁包 说明 系统版本 RedHat 7 6 Oracle版本 11 2 0 4 64位 OPatch补丁版本 p6880880 112000 Linux x86 64 zip Oracle补丁版本 p317
  • Android Studio JDK设置详解

    Android Studio JDK设置详解 Android Studio是当前广泛用于Android应用开发的集成开发环境 IDE 在使用Android Studio进行开发时 必须配置Java Development Kit JDK 以
  • unity用虚拟相机截图

    1 工程 2 脚本 Capture cs using System Collections using System Collections Generic using UnityEngine using System IO public
  • Javascript 脚本语言

    JavaScript代码可以直接嵌在网页的任何地方 不过通常我们都把JavaScript代码放到中 JavaScript代码块一般放在script标签中 1 外链式 用script引入外部的js文件 2 内嵌式 在script标签之间直接写
  • kibana解决Kibana server is not ready yet问题

    我使用的是Docker进行安装的Elasticsearch7 8 0和Kibana7 8 0 安装之后 访问Elasticsearch的9200端口 能正常访问 但是访问Kibana的5601端口 则出现的了 Kibana server i
  • ubuntu 下安装vnc-server

    Ubuntu下安装VNC server 尽管我们在大部分情况下用ssh登录Ubuntu服务器就好了 但是有时候我们的程序需要在图形界面下运行 这时我们就要用到vnc server这个软件了 在Ubuntu下安装vnc server很简单的
  • Docker部署Redis

    Docker部署Redis 准备工作 在CentOS或者Linux创建部署目录 用于存放容器的配置和Redis数据 目的是当重装或者升级容器时 配置文件和数据不会丢失 执行以下命令 a 创建目录 mkdir p container redi
  • 17. 线性代数 - 矩阵的逆

    文章目录 矩阵的转置 矩阵的逆 Hi 您好 我是茶桁 我们已经学习过很多关于矩阵的知识点 今天依然还是矩阵的相关知识 我们来学一个相关操作 矩阵的转置 更重要的是我们需要认识 矩阵的逆 矩阵的转置 关于矩阵的转置 咱们导论课里有提到过 转置
  • 单片机程序中遇到的错误和警告小结

    warning C316 unterminated conditionals 头文件中条件编译或预编译错误 注意 ifndef和 endif的对应即可 还有一种警告情况是定义的参数没有用到 很多都忘记了 先贴这么多吧
  • MYSQL--架构--MGR--理论--02--架构

    MYSQL 架构 MGR 理论 02 架构 1 架构图 1 1 主要组成 APIs接口层 组件层 复制协议模块层 GCS API Paxos 引擎层 1 2 事务进入 MGR 层内部处理过程 应用发来的事务从 MySQL Server 经过