MySQL8.0真正的并行复制writeset

news2024/11/18 5:32:16

MySQL 主从复制模型

在这里插入图片描述
MySQL的主从架构依赖于 MySQL Binlog 功能, Master节点上产生Binlog并将Binlog写入到Binlog文件中。Slave节点上启动两个线程:一个IO线程,从MySQL上捞取Binlog日志并写入到本地的RelayLog日志;另一个SQL线程,不断的从RelayLog日志中读取日志,并解析执行。这样通过在主机和从机上增加几个文件的顺序读写操作,就可以保证所有在主机上执行过的SQL语句都在从机上一摸一样的执行过一遍。而复制延迟,指的就是一个事务在Master执行完成以后,要多久以后才能在Slave上执行完成。

由于对Binlog文件以及RelayLog文件的读写均为顺序操作,在生产环境中,Slave上的IO线程对Binlog文件的Dump操作是很少产生延迟的。 实际上,从MySQL 5.5 开始,MySQL官方提供了半同步复制插件,每个事务的Binlog需要保证传输到Slave写入 RelayLog 后才能提交,这种架构在主从之间提供了数据完整性,保证了主机在发生故障后从机可以拥有完整的数据副本。因此,复制延迟通常发生在SQL线程执行的过程中。从架构图上可以看到,最早的主从复制模型中,只有一个线程负责执行 Relaylog,也就是说所有在主机上的操作,在从机上是串行回放的。 这就带来一个问题,如果主上写入压力比较大,那么从上的回放速度很有可能会一直跟不上主。(除此之外,MySQL的架构决定了Binlog只有在Commit阶段才会写入Binlog文件并Dump给从机,这也导致主从事务必然有执行延迟,这个问题在大事务中体现的特别明显,不过这个问题就不在本文的讨论范围内了)

既然主从延迟的问题是单线程回放RelayLog太慢,那么减少主从延迟的方案自然就是提高从机上回放RelayLog 的并行度。

并行复制的演进

MySQL5.6中的并行复制————Schema级别的并行复制
MySQL5.7中的并行复制————基于Group Commit 的并行复制
MySQL8.0 中的并行复制———真正的并行复制writeset

8.0开启writeset方式

主库

mysql> show variables like '%transaction_write_set_extraction%';
+----------------------------------+----------+
| Variable_name                    | Value    |
+----------------------------------+----------+
| transaction_write_set_extraction | XXHASH64 |
+----------------------------------+----------+

mysql> set global binlog_transaction_dependency_tracking = 'WRITESET';
Query OK, 0 rows affected (0.00 sec)

从库

stop slave sql_thread;
set global slave_parallel_type='logical_clock';
set global slave_parallel_workers=4;
start slave sql_thread;

不设置的情况下从库状态

从库在不设置slave_parallel_type和slave_parallel_workers的情况下,也就是说默认值database和0时,主库施加压力时,主从延迟是明显的

        Seconds_Behind_Master: 765
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 802
                  Master_UUID: 508dae34-936b-11ea-97c0-fec9c355c78f
             Master_Info_File: mysql.slave_master_info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Applying batch of row changes (write)
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 

SQL Thread和IO Thread相差2个relay log,在开启从库参数后,主从延迟降低明显,show processlist可以看到4个协同线程在疯狂的加班。Applying batch of row changes 批量的写入,batch表示批量!!

mysql> show processlist;
+----+-----------------+-----------------+------+------------------+---------+---------------------------------------------------------------+------------------+
| 61 | system user     |                 | NULL | Query            |       1 | Waiting for slave workers to process their queues             | NULL             |
| 62 | system user     |                 | mc   | Query            |     507 | Applying batch of row changes (write)                         | NULL             |
| 63 | system user     |                 | mc   | Query            |     517 | Applying batch of row changes (write)                         | NULL             |
| 64 | system user     |                 | mc   | Query            |     508 | Applying batch of row changes (write)                         | NULL             |
| 65 | system user     |                 | mc   | Query            |     519 | Applying batch of row changes (write)                         | NULL             |
+----+-----------------+-----------------+------+------------------+---------+---------------------------------------------------------------+------------------+

可以看到非常容易就在一组内,这就是并行复制效率提升的原因了,很多事务都在一组之内,可以组提交

mysqlbinlog mysql-bin.000026  | grep last_committed | awk '{print $1 , $2 , $10 , $11, $12}'
#210824 14:41:10 GTID last_committed=0 sequence_number=1
#210824 14:41:11 GTID last_committed=0 sequence_number=2
#210824 14:41:10 GTID last_committed=0 sequence_number=3
#210824 14:41:15 GTID last_committed=0 sequence_number=4
#210824 14:41:11 GTID last_committed=1 sequence_number=5
#210824 14:41:11 GTID last_committed=1 sequence_number=6
#210824 14:41:12 GTID last_committed=1 sequence_number=7

结论

影响主从延迟的因素有很多,比如:主从库负载和IO性能、主库metadata lock、网络带宽、SQL线程无法并行执行,表无主键。

如果您的数据库经常由于SQL线程无法跟上主库多并发事务带来的主从延迟的困扰,不妨升级到MySQL8.0

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

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

相关文章

硬盘分区数据恢复?这些方法助您解忧

案例:分区把电脑文件丢了,数据还能恢复吗? “急急急!!!本人电脑小白,在使用磁盘管理合并E、F分区的时候,不小心把D分区给删除了,D分区里面存放了很多重要的数据与文件&a…

CAD转换PDF格式怎么弄?教你几种方法轻松搞定!

CAD是从事与艺术创作相关等行业的打工人们必需的工作软件,可以用来完成建筑设计图、设计图纸等。在日常的工作中,一些伙伴经常需要传输图纸给合作方来完成探讨。但是CAD图纸需要使用专业软件才能打开,这就给文件传送带来了一定的困难。而且传…

使用pluginRegistrationTool注册插件

创建插件项目 打开Visual Studio并使用.NET Framework 4.5.2打开一个新的类库(.NET Framework)项目 安装除了画红圈的三个NuGet包 引用这个 在一个类里输入如下代码 public class FollowupPlugin : IPlugin{public void Execute(IServiceProvider servi…

第十七节 多态

多态 什么是多态? ●同类型的对象,执行同一个行为,会表现出不同的行为特征。 多态的常见形式 父类类型 对象名称new子类构造器; 接口 对象名称new 实现类构造器; 多态中成员访问特点 ●方法调用:编译看左边,运行看右边。 ●变量调用:编译看…

聊聊图像分割的DICE和IOU指标

目录 1. 介绍 2. dice 和 iou 的联系 3. 代码实现 3.1 dice 3.2 iou 3.3 test 3.4 dice 和 iou 的关系曲线 4. 代码 1. 介绍 dice 和 iou 都是衡量两个集合之间相似性的度量 dice计算公式: iou计算公式: iou的集合理解: iou 其实就…

linux本地yum挂载实践

本方法适用于:linux无法挂载官方yum源或无本地无yum仓库的场景,因为手动安装依赖包是极其麻烦的事,需要花费大量的时间寻找rpm包并导入到虚拟机去逐个安装。通过配置本地yum源,可以很容易地解决依赖问题。一、前提:lin…

90后老板用低代码整顿旅行社,创2000万年收,他是怎么做到的?(真实)

热爱旅游的92年成都小伙猴哥,大学毕业后开了一家旅行社,主要从事川藏、云南定制游服务。 从今年春节开始,国内各地旅游业开始复苏,向旅行社打电话咨询的人越来越多。 旅游的人多是好事,也是一种烦恼,因为…

Baklib客户故事:快递助手ERP

快递助手ERP以多平台多店铺订单管理为核心,集打单发货、商品、库存、采购、售后于一体,中小商家易上手的轻量级ERP,可以满足满足微商、自建商城、档口货源网、一件代发等不同类型客户的打单需求,通过开放平台API接口,自…

Leetcode.剑指 Offer II 022 链表中环的入口节点

题目链接 Leetcode.剑指 Offer II 022 链表中环的入口节点 mid 题目描述 给定一个链表,返回链表开始入环的第一个节点。 从链表的头节点开始沿着 next指针进入环的第一个节点为环的入口节点。如果链表无环,则返回 null。 为了表示给定链表中的环&#…

华为OD机试题,用 Java 解【分奖金】问题

华为Od必看系列 华为OD机试 全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典使用说明 参加华为od机试,一定要注意不…

vscode的远程开发与调试——以C/C++为例

一、背景vscode在1.35版本引入了remote development特性,该特性允许用户通过vscode进行远程开发。这意味着,用户可以在本地开启vscode编辑代码,但是代码本身存在远程服务器上,同时在本地debug,但是却使用远程服务器编译…

我的 System Verilog 学习记录(9)

引言 本文简单介绍 SystemVerilog 的类。 前文链接: 我的 System Verilog 学习记录(1) 我的 System Verilog 学习记录(2) 我的 System Verilog 学习记录(3) 我的 System Verilog 学习记录…

TypeScript深度剖析:TypeScript 中命名空间与模块的理解?区别?

一、模块 TypeScript 与 ECMAScript 2015 一样,任何包含顶级 import 或者 export 的文件都被当成一个模块 相反地,如果一个文件不带有顶级的import或者export声明,那么它的内容被视为全局可见的 例如我们在在一个 TypeScript 工程下建立一…

JavaScript 中的类型转换机制以及==和===的区别

目录一、概述二、显示转换Number()parseInt()String()Boolean()三、隐式转换自动转换成字符串自动转换成数值四、 和 区别1、等于操作符2、全等操作符3、区别小结一、概述 我们知道,JS中有六种简单数据类型:undefined、null、boolean、string、number、…

固定资产管理5大难题?一招破解,现学现用

随着国有企业改革的不断深化,国有固定资产管理越来越受到人们重视,然而国有固定资产管理的好坏在一定程度上影响着国有企业的经济效益,如果不处理好必定影响国有企业的发展。 固定资产存在的5大难题 01.资产流程和管理方式相对落后&#xff0…

分布式架构-流量治理-流量控制

系列目录 分布式架构-流量治理-服务容错 分布式架构-流量治理-流量控制 引子 任何一个系统的运算、存储、网络资源都不是无限的,当系统资源不足以支撑外部超过预期的突发流量时,便应该要有取舍,建立面对超额流量自我保护的机制,这…

企业新闻稿的格式和要求是什么?如何写好新闻稿?

新闻稿是企业自己撰写给媒体的新闻素材,媒体采纳你的稿件后就可以传播到更多的大众面前。 所以企业新闻稿的撰写一方面要让媒体认可,另外一方面是让用户认可你的品牌或是产品。 企业新闻稿的格式和要求是什么?如何写好新闻稿?今…

Unity之ASE实现影魔灵魂收集特效

前言 我们今天来实现一下Dota中的影魔死亡后,灵魂收集的特效。效果如下: 实现原理 1.先添加一张FlowMap图,这张图的UV是根据默认UV图,用PS按照我们希望的扭曲方向修改的如下图所示: 2.通过FlowMap图,我…

java - 数据结构,算法,排序

一、概念 1.1、排序 排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。 平时的上下文中,如果提到排序,通常指的是排升序(非降序)。 通常意义上的排序&#…

ESP32设备驱动-AM2301(DHT21)温度湿度传感器驱动

AM2301(DHT21)温度湿度传感器驱动 文章目录 AM2301(DHT21)温度湿度传感器驱动1、AM2301(DHT21)介绍2、硬件准备3、软件准备4、驱动实现1、AM2301(DHT21)介绍 AM2301 湿敏电容数字温湿度模块是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温…