Writeset

优质博文:IT-BLOG-CN

MySQLWriteSet功能主要用于增强复制的并发性和一致性,特别是在主从复制环境中。WriteSetMySQL 5.7引入的一个特性,主要用于解决复制过程中可能出现的写冲突问题。

MySQL并行复制目前经历过三个比较关键的时间结点“库间并发”,“组提交”,“写集合”;

一、库间并发

库间并发:一个实例内可能会有多个库schema,不同的库之间没有什么依赖关系,所以在slave那边为每一个库schema单独起一个SQL线程,这样就能通过多线程并行复制的方式来提高主从复制的效率。

这个理论听起来没问题,但是事实上一个实例也就一个业务库,所以这种库间并发就没什么作用了;也就是说这个方式的适用场景比较少,针对这个不足直到“组提交”才解决!

二、组提交

组提交:如果多个事务他们能在同一时间内提交,这个就间接说明了这个几个事务锁上是没有冲突的,也是就说他们各自持有不同的锁,互不影响;逻辑上我们几个事务看一个组,在slave以“组”为单位分配给SQL线程执行,这样多个SQL线程就可以并行跑了;而且不在以库为并行的粒度,效果上要比“库间并发”要好一些。

这个事实上也有一些问题,因为它要求库上要有一定的并发度,不然就有可能变成每个组里面只有一个事务,这样就有串行没什么区别了,为了解决这个问题MySQL提供了两个参数就是希望在提交时先等一等,尽可能的让组内多一些事务,以提高并行复制的效率。

binlog_group_commit_sync_no_delay_count设置一个下水位,也就是说一个组要凑足多少个事务再提交;为子防止永远也凑不足。那么多个事务MySQL还以时间为维度给出了另一个参数binlog_group_commit_sync_delay这个参数就是最多等多久,超过这个时间长度后就算没有凑足也提交。

这两个参数特别难找到合的值,就算今天合适,过几天业务上有点变化后,又可能变的不合适了;如果MySQL能自己达到一个自适应的效果就好了;这个自适用要到WriteSet才完成(WriteSet并不是通过自动调整这两个参数来完成,它采用了完全不同的解决思路)。

三、WriteSet

WriteSet解决了“组提交”的问题

案例:假如第一天更新id=1的数据,第二天更新了id=2的数据,第三天有个slave同步数据了,以“组提交”的特点,这两个更新会被打包到不同的“组”,也就是说会有两个组;由于每个组内只有一个事务,所以逻辑上就串行起来了。

身为DBA可以看出来这两个事实上是可以打包到同一个组里来的,因为他们互不冲突,就算打包到同一个组也不引起数据的不一致。 于是你有两个办法:
【1】将binlog_group_commit_sync_no_delay_count设置成2,也就是说一个组至少要包含两个事务,并且把binlog_group_commit_sync_delay设置成24小时以上!如果你真的做了,你就可以回家了,你的数据库太慢了(第一条update等了一天),才完成!
【2】MySQL用一本小本子记下它最近改了什么,如果现在要改的数据和之前的数据不冲突,那么他们就可以把包到同一个组;刚才的例子,由于第二天改的值的id=2所以它和第一天的不冲突,那么它完全可以把第二天的更新和第一天的更新打包到同一个组。这样组里面就有两个事务了,在slave第三天回放时就会有一种并行的效果。

binlog_transaction_dependency_history_size这个参数可以设置小本子的容量了;mysql-5.7.22之后的版本小本子就是它生来就有的。

只要在master上新增两个参数开启writeSet

binlog_transaction_dependency_tracking  = WRITESET                 #    COMMIT_ORDER          
transaction_write_set_extraction        = XXHASH64
binlog_transaction_dependency_history_size = 500000

binlog_transaction_dependency_tracking这个参数用于配置二进制日志中事务依赖关系的跟踪方式。它的主要目的是提高从库的并行复制能力。可选值:
【1】COMMIT_ORDER:基于提交顺序的事务依赖跟踪。这是默认值,表示从库按照主库上事务的提交顺序来执行事务。
【2】WRITESET:基于写集的事务依赖跟踪。启用这个选项后,MySQL会生成每个事务的写集,并在从库上进行冲突检测,以允许并行执行不冲突的事务。
【3】WRITESET_SESSION:基于写集的事务依赖跟踪,但在会话级别进行。与WRITESET类似,但冲突检测仅在同一会话内进行。

transaction_write_set_extraction这个参数用于配置写集提取的算法。写集提取是生成事务写集的过程,主要用于冲突检测。可选值:
【1】OFF:禁用写集提取。这是默认值。
【2】XXHASH64:使用XXHASH64算法进行写集提取。XXHASH64是一种快速的非加密哈希算法,适用于高性能场景。

binlog_transaction_dependency_history_size是内存中保存的做冲突检测的数据行数量的上限值,该值越大,保存的数据行越多,事务间冲突检测后并发度越高。

实际上Writeset是一个集合,使用的是C++ STL中的set容器,在类Rpl_transaction_write_set_ctx中包含了如下定义:

std::set<uint64> write_set_unique;

集合中的每一个元素都是hash值,这个hash值和我们的transaction_write_set_extraction参数指定的算法有关,其来源就是行数据的主键和唯一键。每行数据包含了两种格式:
【1】字段值为二进制格式
【2】字段值为字符串格式

四、实现细节

【1】生成WriteSet 当一个事务在主库上提交时,MySQL会扫描事务中的所有写操作(如INSERTUPDATEDELETE),并将这些操作涉及的键生成一个WriteSet

假设我们有一个简单的事务,它在一个表users上执行了一些写操作:

START TRANSACTION;
INSERT INTO users (id, name) VALUES (1, 'Alice');
UPDATE users SET name = 'Bob' WHERE id = 2;
DELETE FROM users WHERE id = 3;
COMMIT;

在这个事务中,涉及的写操作包括一个插入操作、一个更新操作和一个删除操作。MySQL会生成一个WriteSet来表示这些操作涉及的键。

WriteSet示例:假设users表的主键是id,那么生成的WriteSet可能会包含以下信息:

INSERT 操作:插入了 id = 1 的记录。
UPDATE 操作:更新了 id = 2 的记录。
DELETE 操作:删除了 id = 3 的记录。

简化后的WriteSet可以表示为:

WriteSet = { (users, id, 1), (users, id, 2), (users, id, 3) }
WriteSet = { (users, id, 1), (users, id, 2), (users, id, 3) }

这里的(users, id, 1)表示在users表中主键为1的记录。

在实际实现中,WriteSet可能会使用更复杂的数据结构和算法来存储和处理这些信息。例如,MySQL可能会使用哈希表或其他高效的数据结构来存储这些键,并使用哈希算法(如XXHASH64)来生成键的哈希值。

【2】传播WriteSet 生成的WriteSet会随着二进制日志binlog一起传播到从库。在从库上,MySQL会解析这些日志并提取出WriteSet

【3】冲突检测和处理: 从库在执行事务前,会检查当前事务的WriteSet是否与正在执行的其他事务的WriteSet有冲突。如果有冲突,当前事务会被推迟执行,直到冲突消除。

冲突检测:当从库接收到这个事务时,它会使用WriteSet来进行冲突检测。假设从库上有另一个事务正在执行,它的WriteSet是:

WriteSet = { (users, id, 2), (users, id, 4) }

从库会检测两个WriteSet是否有交集。在这个例子中,两个WriteSet都有 (users, id, 2),说明存在写冲突。因此,从库会推迟执行这个事务,直到冲突消除。

五、WriteSet实践

我们要执行的目标SQL如下

create database tempdb;
use tempdb;
create table person(id int not null auto_increment primary key,name int);insert into person(name) values(1);
insert into person(name) values(2);
insert into person(name) values(3);
insert into person(name) values(5);

看一下组提交对上面SQL的分组情况

last_committed(组号)sequence_num(组内id)SQL语句
11create database tempdb
22create table person(id int not null auto_increment primary key,name int)
33insert into person(name) values(1)
44insert into person(name) values(2)
55insert into person(name) values(3)
66insert into person(name) values(5)

write_set的对“组提交”优化后的情况

last_committed(组号)sequence_num(组内id)SQL语句
11create database tempdb
22create table person(id int not null auto_increment primary key,name int)
33insert into person(name) values(1)
34insert into person(name) values(2)
35insert into person(name) values(3)
36insert into person(name) values(5)

可以看到各个insert是可以并行执行的,所以它们被分到了同个组last_committed相同。

last_committedsequence_number这两个值在binlog里面记着就有,我在解析binlog的时候习惯使用如下选项

mysqlbinlog -vvv --base64-output='decode-rows' mysql-bin.000002

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

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

相关文章

数据结构(7.3_4)——红黑树的定义和性质

红黑树和平衡排序二叉树的查插删时间 平衡二叉树的适用场景&#xff1a;适用以查为主、很少插入/删除vd场景 红黑树&#xff1a;适用于频繁插入、删除的场景&#xff0c;实用性更强 红黑树的考点 红黑树的定义&#xff1a; 红黑树的二叉排序树&#xff1a;左子树结点值<…

EvilScience靶机详解

主机发现 arp-scan -l 得到靶机ip 192.168.229.152 端口扫描 nmap -sV -A -T4 192.168.1.20 这段代码使用 nmap 命令来扫描目标主机 192.168.1.20&#xff0c;并执行以下操作&#xff1a;-sV&#xff1a;探测开放的端口&#xff0c;以确定服务/版本信息。-A&#xff1a;启…

【软件工程】可行性研究

一、目的 二、任务 三、步骤 四、结果&#xff1a;可行性研究报告 例题 选择题

Java基础-零拷贝

文章目录 什么是零拷贝&#xff1f;传统IO执行过程零拷贝的意义零拷贝的主要实现方式实际应用场景零拷贝的优势零拷贝的局限性 Java 中的零拷贝实现FileChannel.transferTo()FileChannel.transferFrom() 相关知识点解释什么是DMA内核空间和用户空间什么是用户态、内核态什么是上…

前端——实现时钟 附带小例子

创建日期对象 toLocaleDateString() 获取日期 console.log(date.toLocaleDateString()) toLocaleTimeString() 获取时间 console.log(date.toLocaleTimeString()) toLocaleString() 获取日期和时间 console.log(date.toLocaleString()) date.getDay() 获取星期几 周日为…

计算机毕业设计选题推荐-基于python+Django的全屋家具定制服务平台

精彩专栏推荐订阅&#xff1a;在下方主页&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f496;&#x1f525;作者主页&#xff1a;计算机毕设木哥&#x1f525; &#x1f496; 文章目录 一、全屋家具定制…

H264参考帧列表管理

P/SP/B帧的参考帧列表的初始化 参考H.264标准文档的8.2.4.2章节&#xff0c;暂不研究场编码。在初始化P/SP帧或B帧的参考帧列表过程中&#xff0c;DPB中至少要存在一个有效的、即被标记为“用于短期或长期参考”的参考帧。 P/SP Slice 参考帧列表初始化 P/SP Slice参考帧列表…

《算法岗面试宝典》正式发布

大家好&#xff0c;历时半年完善&#xff0c;《算法岗面试宝典》 终于可以跟大家见面了。 最近 ChatGPT 爆火&#xff0c;推动了技术圈对大模型算法场景落地的热情&#xff0c;就业市场招聘人数越来越多&#xff0c;算法岗一跃成为竞争难度第一的岗位。 岗位方向 从细分方向…

汽车总线之----CAN总线

Introduction 早期的车辆网络是点对点的模式&#xff0c;臃肿繁杂且效率低下 现在是以总线的模式&#xff0c;很明显线路简洁清爽了很多。 高速CAN可以支持1M/s的速率&#xff0c;低速CAN可以支持125k/s的速率 CAN节点的内部结构图(Structure of CAN-Bus and electronic C…

*C++:list

一.list简介 1. list 是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。 2. list 的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中通过指针指向其前一个元素和后一个元素…

redisson 延迟队列实现任务过期监听

一、需求&#xff1a; 任务超过一个小时以后&#xff0c;如果还为待执行状态&#xff0c;则自动转为结束状态。 二、实现: 创建延迟队列的监听任务RedisDelayedQueueListener&#xff0c;消费延迟队列&#xff1b;创建新增延迟队列的类&#xff0c;用于创建延迟队列&#xf…

ACM MM24 | Hi3D: 3D生成领域再突破!新视角生成和高分辨率生成双SOTA(复旦智象等)

文章链接&#xff1a;https://arxiv.org/pdf/2409.07452 Github 链接&#xff1a;https://github.com/yanghb22-fdu/Hi3D-Official 亮点直击 本文提出了高分辨率图像到3D模型&#xff08;Hi3D&#xff09;&#xff0c;这是一种基于视频扩散的新范式&#xff0c;将单个图像重新定…

Codeforces Round 974 (Div. 3) G. Milky Days

题目 题解 #include<bits/stdc.h> using namespace std; #define int long long #define ll long long #define ld long double #define pb push_back #define fi first #define se second #define pii pair<int, int> #define lson p << 1 #define rson p …

Mapper核心配置文件

文章目录 environment 数据库环境typeAlias 起别名 environment 数据库环境 typeAlias 起别名

PMBOK® 第六版 估算活动持续时间

目录 读后感—PMBOK第六版 目录 在项目管理中&#xff0c;尤其是在软件开发这样的复杂项目中&#xff0c;工作内容是多种多样的。从需求分析、设计、编码到测试和部署&#xff0c;每个阶段都有其独特的挑战和不确定性。 没有人能独自完成所有估算工作并做到绝对精准。估算涉及…

股指期货交割方式是什么?

说起股指期货&#xff0c;这可是个高大上的金融玩意儿。咱们平时买卖股票&#xff0c;那是看准了哪只股就下手&#xff0c;赚了就卖&#xff0c;赔了就扛&#xff0c;挺直接的。但股指期货呢&#xff0c;它玩的是未来的预期&#xff0c;就像是你跟人打赌明天天气好不好&#xf…

开源推理库介绍:ZML,Distributed Llama,EXO | LeetTalk Daily

“LeetTalk Daily”&#xff0c;每日科技前沿&#xff0c;由LeetTools AI精心筛选&#xff0c;为您带来最新鲜、最具洞察力的科技新闻。 开源推理库的出现为机器学习模型的部署、监控和扩展提供了强大的支持。我们介绍三个重要的开源推理库&#xff1a;ZML、Distributed Llama …

机器人速度雅可比矩阵求解(2自由度平面关节机器人)

关节速度和末端速度空间的映射需要计算雅可比矩阵的逆矩阵,在博途PLC里如何计算一个方阵的逆矩阵,大家可以参考下面这篇文章: 博途PLC矩阵求逆 矩阵求逆 博图SCL_博图矩阵运算-CSDN博客文章浏览阅读839次。本文介绍如何用C语言实现矩阵求逆的过程,详细解析了相关代码,适…

Spring实战——入门讲解

​ 博客主页: 南来_北往 系列专栏&#xff1a;Spring Boot实战 Spring介绍 Spring实战的入门讲解主要涵盖了Spring框架的基本概念、核心功能以及应用场景。以下是关于Spring实战入门的具体介绍&#xff1a; Spring框架概述&#xff1a;Spring是一个轻量级的Java开发框架…

【有啥问啥】探索累计推理(Cumulative Reasoning, CR)——大型语言模型中的复杂推理新框架

探索累计推理&#xff08;Cumulative Reasoning, CR&#xff09;——大型语言模型中的复杂推理新框架 引言 随着人工智能&#xff08;AI&#xff09;的快速发展&#xff0c;大型语言模型&#xff08;LLMs&#xff09;在自然语言处理上的表现令人瞩目。然而&#xff0c;LLMs在…