MySQL复制底层技术——单线程复制、DATABASE并行复制

news2024/9/27 5:45:00

1. 单线程复制

单线程复制是MySQL最早出现的主从复制技术,本节我们将对单线程复制做进一步说明。

在MySQL5.6之前的版本中,从库复制不支持多线程,所以当主库写压力稍微大一点时,从库就会出现复制延迟。当然,目前的最新版本已经能够很好地支持并行复制了。为了便于理解复制的演进历程,这里简单地对单线程复制做一个小小的剖析。下面以在单线程复制中主库写入binlog中的日志解析记录为例,对单线程复制原理进行细化阐述。假设某个事务的INSERT操作在binlog中的记录如下:
在这里插入图片描述
从库的SQL线程从relay log中读取并解析主库的binlog变更日志,然后所有的事件依次串行执行。而binlog的写入时机是在事务完成对数据修改且事务发起Commit(提交)之后,也就是说,主库事务先执行,然后产生的binlog发送到从库执行。

从理论上讲,一前一后的时差必然会导致从库复制延迟,如果碰到大事务,则会急剧放大从库延迟(例如:主库执行一个大事务耗费1小时完成,从库收到这个事务之后开始执行时,就已经落后于主库1小时了)。也正是因为串行复制的诸多弊端,推动着串行复制向着并行复制发展。

提示:前面说到,在MySQL 5.6之前的版本中从库不支持并行复制,但实际上启用了binlog之后主库本身也不支持并行事务提交。当不启用binlog时,InnoDB存储引擎本身是支持Group Commit(即一次提交多个事务)的,但是当启用binlog之后,为了保证数据的一致性(也就是必须要保证MySQL服务器层和存储引擎层的提交顺序一致),启用了两阶段提交。

而两阶段提交中的Prepare(提交准备)阶段使用了prepare_commit_mutex互斥锁来强制事务串行提交,这也大大降低了数据库的写入效率。

2. DATABASE并行复制

顾名思义,DATABASE并行复制就是在串行复制的基础上进行的改进,是基于库级别的并行复制。从MySQL 5.6 开始,支持基于库级别的并行复制(这也是最早出现的并行复制机制),在binlog中记录的内容类似如下:
在这里插入图片描述
在这里插入图片描述
从以上对INSERT语句的binlog解析内容来看,与MySQL 5.5 版本比较几乎没有什么变化,那么从MySQL 5.6版本开始,对复制的改进点主要是什么呢?

对于实例自身而言(不区分主从库),在原先的两阶段提交中移除了prepare_commit_mutex互斥锁,为保证binlog的提交顺序和存储引擎层的提交顺序一致,引入了类似于InnoDB存储引擎层的Group Commit机制,称为Binary Log Group Commit(BLGC)。

在MySQL服务器层进行提交时,首先按照顺序将其放入一个队列中,队列中的第一个事务称为Leader(领队者),其他事务称为Follower(跟随者),Leader控制着Follower的行为。

一旦前一个阶段中的队列任务执行完成,后一个阶段队列中的Leader就会带领它的Follower进入前一个阶段的队列中执行,这样就使得并行提交可以源源不断地进行下去。

BLGC的步骤分为如图18-11所示的三个阶段(该图来自http://mysqlmusings.blogspot.com/)。

  • Flush(刷新)阶段,将每个事务的binlog写入内存中。
  • Sync(同步)阶段,将内存中的binlog同步到磁盘。
    若队列中有多个事务,那么仅一次fsync操作就完成了多个事务的binlog写入,这就是BLGC。
  • Commit(提交)阶段,Leader根据顺序调用存储引擎层事务的提交。
    InnoDB存储引擎本就支持Group Commit,因此修复了原先由prepare_commit_mutex互斥锁导致InnoDB 存储引擎层Group Commit失效的问题。这样一来,在启用binlog的情况下,数据库中的事务并行提交就得以实现了。

在这里插入图片描述

对于从库而言,主要的改进点是在从库复制的SQL线程上增加了一个SQL协调器(Coordinator)线程,真正干活的SQL线程被称之为Worker(工作)线程,当Worker线程数量为N(N>1)以及主库的schema数量为N时,从库就可以根据基于多个schema之间相互独立(彼此之间无锁冲突)的语句来实现并行复制;

反之,如果N=1,则仍然跟MySQL 5.6之前版本中的单线程复制没有太大区别。

主库无须设置任何参数,只需要在从库上修改设置Worker线程数量的参数即可,如下所示。
在这里插入图片描述

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

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

相关文章

网络音频广播RtpCast软件

RtpCast是一款基于Windows平台运行的网络音频广播软件。这款RTPCast软件可以以目标分组的方式播放电脑系统声卡(麦克风、喇叭和音频混合器)、MP3文件列表和网络Rtp音频流等音源到终端设备。此外,RtpCast网络音频广播软件支持方案调度&#xf…

【区块链 | EVM】深入理解学习EVM - 深入Solidity数据位置:Calldata

深入了解Solidity数据位置 - Calldata 原文链接: https://betterprogramming.pub/solidity-tutorial-all-about-calldata-aebbe998a5fc理解Solidity中以太坊交易的 "data" 字段 这是 深入Solidity数据存储位置 系列的第三篇 今天,我们将学习 calldata 的特殊性,以…

springboot项目使用SchedulingConfigurer实现多个定时任务

目录一、引入依赖二、配置文件属性配置三、代码目录结构四、示例代码4.1、定义 定时任务基础接口4.2、定义 定时任务一(每天几点几分执行)4.3、定义 定时任务二(每几分钟执行一次)4.4、定义 定时任务注册器4.5、运行springboot项目…

欧拉系统部署NextCloud与常见部署问题解决

欧拉系统部署NextCloud与常见部署问题解决一、欧拉系统安装二、openEuler安装图形界面Ukui三、yum安装的npm包进行本地保存设置(个人任务需要)四、部署nextCloud4.1构建LAMP环境基础4.1.1开启httpd,防火墙端口号4.1.2开启MariaDB服务4.1.3安装并测试php4…

2023/1/4总结

今天AC了三个题目: 第一个题目:P4913 【深基16.例3】二叉树深度 (1条消息) P4913 【深基16.例3】二叉树深度_lxh0113的博客-CSDN博客 第二个题目:P1229 遍历问题 (1条消息) P1229 遍历问题_lxh0113的博客-CSDN博客 第三个题目&#xff1…

药品市场信息查询-药品数据库(全面)

药品市场信息包含了药品招标、药品投标、药品集采、药品销售数据(医院、零售)、药品海关进出口数据、药品交易(药品license in/out)、价格、一致性评价、政策法规、药品公司等多个方面的数据信息,是医药行业市场信息工…

双向循环链表的讲解及实现(图解+代码/C语言)

本次为大家分享的是双向循环链表的增删查改等系列操作。 目录 一、图解双向循环链表结构 二、分步实现 (1)创建并初始化 (2)链表元素打印 (3)头插和尾插 (4)判断链表为空 &a…

MySQL调优-MySQL索引优化实战一

目录 MySQL调优-MySQL索引优化实战一 插入数据: 举一个大家不容易理解的综合例子: 1、联合索引第一个字段用范围不会走索引 2、强制走索引 什么是回表?为什么要回表?如何进行回表? 但是回表具有很大的弊端&#…

NetInside网络分析帮您解决系统性能问题(二)

前言 某大学信息中心负责人表示,有用户反馈,在通过VPN访问某一IP的80端口时连接时断时续。同时信息中心给到的信息是通过VPN:XXX.XXX.253.5访问IP地址XXX.XXX.130.200的80端口出现访问时断时续问题。 前一文章我们分析了系统整体性能分析&a…

学编程有哪些误区吗?避坑指南拿去不谢!

学习编程时信心满满,但反而效率不高,从“入门”到“放弃”,你肯定猜中了这些误区! 今天就专门写了一篇避坑指南,提前避开误区,有助于更好学习编程。 误区1:忽略基础,好高骛远 现在…

@Column写在属性和写在get方法上面的区别

📢📢📢📣📣📣 哈喽!大家好,我是「奇点」,江湖人称 singularity。刚工作几年,想和大家一同进步🤝🤝 一位上进心十足的【Java ToB端大厂…

【YOLOv7/YOLOv5系列改进NO.51】融入多分支空洞卷积结构RFB-Bottleneck改进PANet构成新特征融合网络

文章目录前言一、解决问题二、基本原理三、​添加方法四、总结前言 作为当前先进的深度学习目标检测算法YOLOv7,已经集合了大量的trick,但是还是有提高和改进的空间,针对具体应用场景下的检测难点,可以不同的改进方法。此后的系列…

axios中get、post请求传参区别及使用

axios 发送请求时 params 和 data 的区别 params 中的参数是通过地址栏传参,一般用于get请求data 是添加到请求体(body)中的, 一般用于post请求get请求只能传query参数,query参数都是拼在请求地址上的post可以传body和…

qt使用qxlsx实现xlsx、xls表格文件快速写入和读取

一、前言 本片文章主要记录和分享一下qt使用qxlsx开源文件读写xlsx表格文件用法。 目录一、前言二、环境三、正文1.读取指定xlsx文件2.保存xlsx文件3.保存xlsx文件内容过大崩溃解决方案一4.保存xlsx文件内容过大崩溃解决方案二四、结语二、环境 windows linux qt5.7 三、正文…

【财务】FMS财务管理系统---对账平台

人工进行对账工作是非常繁杂的,此时,就非常有必要建设一个对账平台。笔者在本文介绍了对账平台的相关内容,分享给大家。 前面介绍过应收对账、财务应付结算两部分内容;应收对账主要是调用第三方支付的接口获取支付流水信息与我司的…

C++设计模式:三种工厂模式详解(简单工厂,工厂模式,抽象工厂)

文章目录简单工厂模式简单工厂实现步骤简单工厂优缺点工厂模式工厂模式和简单工厂模式有什么不同?工厂模式实现步骤实现代码工厂模式优缺点抽象工厂模式抽象工厂模式实现步骤实现代码抽象工厂模式优缺点简单工厂模式 简单工厂模式属于类的创建型模式,又叫做静态工厂…

【算法】算法分析技术(第一章习题解答)

1 算法分析技术 1.1 假设 fff 和 ggg 是定义在自然数集合上的函数, 若对某个其他函数 hhh 有 fO(h)f O(h)fO(h)和 gO(h)g O(h)gO(h) 成立, 那么证明 fgO(h)f g O(h)fgO(h) 证明: 根据已知条件 fO(h)f O(h)fO(h),存在 c1>0c_{1}>0c1​>0 …

错题记录2:源码补码二进制转换

补码原码二进制一直是本人比较头疼的问题,今日找题目来做发现还是错得多,记录以下,再回顾一遍。 1.如下代码输出的是什么( ) char a101; int sum200; a27;suma; printf("%d\n",sum); A: 327 B: 99 C: 3…

【MySQL】详解MySQL数据库事务

MySQL数据库事务数据库事务特性事务的并发问题事务的隔离级别分布式事务解决方案1.XA 协议2.TCC3.消息一致性方案4.阿里云中的全局事务服务 GTS数据库事务特性 数据库事务具备ACID四大特性: 原子性:是指事务操作时具备原子操作的,就是说整…

分布式系统架构

分布式系统定义 分布式系统:硬件或软件组件分布在不同的网络计算机上,彼此之间仅仅通过消息传递进行通信和协调的系统。 为什么需要分布式系统 提升系统吞吐量:集群协同解决单机性能瓶颈提高系统可用性 :冗余部署,各…