浅析MySQL的WriteSet并行复制
作者:蒋乐兴的技术随笔 发布时间:2024-01-18 04:28:11
【历史背景】
岁月更迭中我已经从事MySQL-DBA这个工作三个年头,见证MySQL从“基本可用”,“边缘系统可以用MySQL”,“哦操!你怎么不用MySQL”;
正所谓!“一个数据库的境遇既取决于历史的进程,取决于它的自我奋斗!”,关于“历史的进程”在此不表,关于“自我奋斗”这里也只想谈一下并行复制的几个关键时间结点
总的来说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有这本小本子吗? 如果你的mysql比mysql-5.7.22新的话,小本子就是它生来就有的。
也就是说“WriteSet”是站在“组提交”这个巨人的基础之间建立起来的,而且是在master上做的自“适应”打包分组,所以你只要在master上新增两个参数
binlog_transaction_dependency_tracking = WRITESET # COMMIT_ORDER
transaction_write_set_extraction = XXHASH64
理论说完了,下面我们看一下实践。
【WriteSet实践】
基于WriteSet的并行复制环境怎么搭建我这里就不说了,也就是比正常的“组提交”在master上多加两个参数,不讲了;我这里想直接给出两种并行复制方式下的行为变化。
1): 我们要执行的目标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);
2): 看一下组提交对上面SQL的分组情况
3): 看write_set的对“组提交”优化后的情况
可以看到各个insert是可以并行执行的,所以它们被分到了同个组(last_committed相同);last_committed,sequence_number,这两个值在binlog里面记着就有,我在解析binlog的时候习惯使用如下选项
mysqlbinlog -vvv --base64-output='decode-rows' mysql-bin.000002
【总结】
WriteSet是在“组提交”方式上建立起来的,一种新的并行复制实现;相比“组提交”来说更加灵活;当然,由于并发度上去了,相比“组提交”WriteSet在性能上会更加好一些,在一些WriteSet没有办法是否冲突时,能平滑过度到“组提交”模式。
来源:https://www.cnblogs.com/JiangLe/p/9650728.html
猜你喜欢
- 我就废话不多说了,大家还是直接看代码吧~import numpy as np kernel = np.array([1, 1, 1, 2])
- 目录完整项目地址:简介功能商家端顾客端服务器端主要代码完整项目地址:https://github.com/kongxiangchx/Shop
- FFmpeg简介FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录
- 华为2019在线笔试题,现整理如下,以供之后参考GitHub题目介绍####################################
- 查看表空间的名称及大小代码如下:SQL>select t.tablespace_name, round(sum(bytes/(1024
- 导语前段时间有小伙伴留言说想让我带大家写写桌面小挂件,今天就满足一下留过类似言的小伙伴的请求呗~不过感觉写桌面的挂历啥的没意思,就简单带大家
- 本文实例借鉴mvc模式,核心数据为model,维护1个矩阵,0表无雷,1表雷,-1表已经检测过。本例使用python的tkinter做gui
- 前言提到数据库,大家第一时间想到的可能是 sql 数据库,这种数据库非常好用,但是对于新手就不是很容易上手,需要熟悉一段时间才可以大概掌握。
- 受<! #include file="filename.asp" --> 宏限制必须存在该文件并且会预先编译
- 前言;Python基础知识+结构+数据类型Python基础学习列表+元组+字典+集合Python基础学习函数+模块+类今天给大家分享的是第四
- 本文实例为大家分享了Python读取MySQL数据库表数据的具体代码,供大家参考,具体内容如下环境:Python 3.6 ,Window 6
- 安装pillow(python的图形界面库)第一种方法在Dos界面输入pip install pillow(但是不知为何总是失败);搞了好几
- 内容摘要: Request和Response这两个对象是ASP所提供的内置对象中最常用的两个。在浏览器(或其他用户代理)和Web服
- MaxDB和MySQL是独立的数据库管理服务器。系统间的协同性是可能的,通过相应的方式,系统能够彼此交换数据。要想在MaxDB和MySQL之
- 1、pyecharts介绍 Echarts是一款由百度公司开发的开源数据可视化JS库,pyecharts是一款使用python调用echar
- 记录了mysql 8.0.21 的安装配置方法,分享给大家。一、下载1、下载安装包mysql下载路径直接点击链接也可以下载:mysql 8.
- 前言很多人会使用postman工具,或者熟悉python,但不一定会使用python来编写测试用例脚本,postman里面可以完整的将pyt
- 我们经常会遇这样一个需求:判断字符串中是否包含某个关键词,也就是特定的子字符串。比如从一堆书籍名称中找出含有“pytho
- 打算学习linux和考一下认证。学习HCIA-AI实验手册发现的小问题和记录贴,防止自己忘。我不知道这个手册是不是公开的,你们自己去华为下载