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 中的表

    我正在尝试清理表格 但没有摆脱表格的实际结构 我有一个id自动递增的列 我不需要保留ID号 但我确实需要它来保持其自动递增的特性 我发现了删除和截断 但我担心其中之一会完全删除整个表 从而使未来的插入命令变得无用 如何从表中删除所有记录以便
  • 'numpy.float64'对象没有属性'translate'在Python中将值插入Mysql

    import dataset db dataset connect table db 当我尝试向 Mysql 表中插入一些值时 发生了此错误 我插入表中的示例值 print Buy ticker price date OType OSize
  • 使用 try {} catch {} 与 if {} else {} 相比有何优势

    我正在从 php 中的普通 mysql 切换到 PDO 并且我注意到测试错误的常见方法是使用 try catch 组合而不是 if else 组合 该方法的优点是什么 我可以使用一个 try catch 块而不是多个嵌套的 if else
  • 如何使用 SQL 对项目进行排序,然后按另一个条件再次排序

    我正在使用 MySQL 我想对记录进行排序 或者我想对记录进行分组 然后按另一个条件再次对其进行排序 例如我有 6 个项目 Names Group Jack G1 Dian G2 Emily G2 Dean G1 Teddy G2 Gabe
  • 从 MySQL 将 500 万行加载到 Pandas 中

    我在 本地 网络上的 MySQL 数据库中有 500 万行 连接速度非常快 而不是在互联网上 与数据库的连接工作正常 但如果我尝试这样做 f pd read sql query SELECT FROM mytable engine inde
  • 使用 MySQL 的 CURDATE() 或 PHP 的 date() 更快?

    使用mysql查询是不是更快 SELECT CURDATE as today 或 PHP 语句 curdate date Y m d 同样的答案是否适用于使用date VS MySQL 的NOW and CURTIME 如果您只是执行查询以
  • 我不断收到此 mysql 错误代码 #1089

    CREATE TABLE movies movie movie id INT 3 NULL AUTO INCREMENT movie name VARCHAR 25 NULL movie embedded id VARCHAR 50 NUL
  • 用于全文搜索和 2 亿多条记录的数据库

    我即将创建一个包含至少 2 亿个条目的庞大数据库 数据库需要可使用全文进行搜索 并且速度应该很快 我的数据库从许多不同的数据源获取数据 我需要定期导入新的或更新的数据 将我的所有数据存储在像 mysql 这样的关系数据库中 然后创建一个 n
  • MySQL,连接两列

    MySQL 表中有两列 SUBJECT and YEAR 我想生成一个字母数字唯一编号 其中包含主题和年份的串联数据 我怎样才能做到这一点 是否可以使用像这样的简单运算符 您可以使用CONCAT http dev mysql com doc
  • MySQL InnoDB引擎是否对只读事务运行任何性能优化

    根据参考文档 只读事务标志可能会提示存储引擎运行一些优化 设置会话事务只读 如果事务访问模式设置为 READ ONLY 则对表进行更改 被禁止 这可能使存储引擎能够提高性能 不允许写入时可能进行的改进 InnoDB引擎是否对只读事务运行这样
  • 条件对列表的 In 子句

    有一个表 我需要通过在配对值列表中应用和条件来获取分页记录 下面是解释 假设我有一堂课Billoflading其中有各个领域 表中两个重要字段是 tenant billtype 我有一个包含值的对列表 tenant1 billtype1 t
  • Mysql 将 --secure-file-priv 选项设置为 NULL

    我在 Ubuntu 中运行 MySQL 我在运行特定的查询集时收到此错误 MySQL 服务器正在使用 secure file priv 选项运行 因此无法执行此语句 当我这样做的时候SELECT secure file priv 在我的 m
  • 在 SQL 中如何获得整数的最大值?

    我试图从 MySQL 数据库中找出整数 有符号或无符号 的最大值 有没有办法从数据库本身提取这些信息 是否有我可以使用的内置常量或函数 标准 SQL 或 MySQL 特定的 At http dev mysql com doc refman
  • 使用表白名单选项更新 Debezium MySQL 连接器

    我正在使用 Debezium 0 7 5 MySQL 连接器 并且我试图了解如果我想使用以下选项更新此配置 最好的方法是什么table whitelist 假设我创建了一个连接器 如下所示 curl i X POST H Accept ap
  • 将非常大的Python列表输出保存到mysql表中

    我想将 python 生成的列表的输出保存在 mysql 数据库的表中 该表如下所示 mysql 中的 myapc8 表 https i stack imgur com 4B4Hz png这是Python代码 在此输入图像描述 https
  • Monkeyrunner/jython 中未找到 JDBC 驱动程序错误

    我需要在中插入一些东西DB 我在用着JDBC as a connector jython the script mysql数据库和脚本正在运行CentOS 我的代码看起来像这样 from com android monkeyrunner i
  • MySQL 连接器 C++ 64 位在 Visual Studio 2012 中从源代码构建

    我正在尝试建立mySQL 连接器 C 从源头在视觉工作室2012为了64 bit建筑学 我知道这取决于一些boost头文件和C 连接器 跑步CMake生成一个项目文件 但该项目文件无法编译 因为有一大堆非常令人困惑的错误 这些错误可能与包含
  • 如何对字段数据进行分组?

    我有 sql 查询来显示数据 SELECT artikel foto naam fotografer id fotografer name fotografer customer first name customer last name
  • Mysql加密/存储敏感数据,

    我的 PHP 网站有以下内容 启用 SSL 饼干 session set cookie params cookieParams lifetime cookieParams path cookieParams domain secure ht
  • mysql 查询选择当月的所有行?

    我有一个名为 startdate 的日期时间类型的列 我必须获取当前月份的开始日期和结束日期之间的所有行 即从 1 11 2014 到 30 11 2014 select from your table where year curdate

随机推荐

  • 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 经过