《MySQL——备库多线程复制策略。》

目录

    • 备库并行复制能力
    • MySQL5.6版本 并行复制策略
    • MariaDB 并行复制策略
    • MySQL5.7版本 并行复制策略
    • MySQL5.7.22版本 并行复制策略
    • 总结

备库并行复制能力

主要涉及两个方面的并行度:

1、客户端写入主库的能力

2、备库上sql_thread执行中转日志relay log

1的并行能力比2强。

主库上由于InnoDB支持行锁,对业务并行度的支持比较友好。

备库上如果用单线程,会导致备库应用日志不够快,造成主备延迟。

现在MySQL使用的是多线程复制
在这里插入图片描述

coordinator 就是原来的sql_thread,不过现在它不再直接更新数据了,只负责读取中转日志和分发事务。真正更新日志的,是worker线程。线程个数由slave_parallel_workers决定,一般设置为8~16。

coordinator在分发事务的时候,要遵循两个要求:

  • 不能造成更新覆盖。也就是说更新同一行的两个事务必须被分发到同一个worker中。
  • 同一个事务不能被拆开,必须放到同一个worker中。

MySQL5.6版本 并行复制策略

支持粒度:库

用于决定分发策略的hash表key值:数据库名

优势:

1、构造hash值快;一个实例上的DB数目不会很多。

2、不要求binlog格式。row和statement格式的binlog都可以拿到库名。

缺点:

1、主库表在同一个DB中,策略失效

2、不同DB热点不同,起不到并行效果

MariaDB 并行复制策略

策略:

1、能够在同一组里提交的事务,一定不会修改同一行

2、主库上可以并行执行的事务,备库上一定是可以并行执行的

为了实现该策略,MariaDB实现方法为:

1、在一组里面一起提交的事务,有一个相同的commit_id,下一组就是commit_id+1

2、commit_id直接写到binlog里

3、传到备库应用的时候,相同commit_id的事务分发到多个worker执行

4、一组全部执行完后,coordinator再去取下一批

这个策略目标就是备库模拟主库的并行模式。

不过主库再一组事务commit的时候,下一组事务实际上是处于"执行中"状态的。

而按照MariaDB策略,在备库上执行的时候,要等一组事务完全执行完,下一组事务才能开始执行,这样系统的吞吐量就不够。

这个策略,对于长事务来说不友好。如果一组里有一个超大事务线程,该组其他线程执行完后要等待这个线程执行完,之后才能切换到下一组。这段时间,只有一个线程进行工作,浪费了资源。

MySQL5.7版本 并行复制策略

策略思想:

1、同时处于prepare状态的事务,在备库执行时是可以并行的

2、处于prepare状态的事务,与处于commit状态的事务之间,在备库执行时也是可以并行的

通过调节binlog_group_commit_sync_delaybinlog_group_commit_sync_no_delay_count参数

来来拉长binlog从write到fsync的时间,以此减少binlog’的写盘次数。同时在并行复制策略里,可以用来制造更多“同时处于prepare阶段的事务”。这样就能增加备库复制的并行度。

通俗来讲,这两个参数,既可以让主库提交慢一点,又可以让备库执行快一点。在MySQL5.7处理备库延迟时,可以调节这两个参数,达到提升备库复制并行度的目的。

MySQL5.7.22版本 并行复制策略

新增了一个参数binlog-transaction-dependency-tracking,用来控制是否启用这个新策略。

可选值:

1、COMMIT_ORDER,表示根据同时进入prepare和commit来判断是否可以并行

2、WRITESET,表示对于事务涉及更新的每一行,计算出这一行的hash值,组成集合writeset。如果两个事务没有操作相同的行,即writeset没有交集,就可以并行。

3、WRITESET_SESSION,在WRITESET基础上多了一个约束:在主库上同一线程先后执行的两个事务,在备库执行的时候,要保证相同的先后顺序

为了唯一标识,hash通过"库名+表名+索引名+值"计算。如果表上除了主键索引外,还有其他唯一索引,那么对于每个唯一索引,insert语句对应的writeset就要多增加一个hash值。

这个版本的好处在于:

--1、writeset是在主库生成后直接写入到binlog里的,在备库执行的时候,不需要解析binlog内容,节省了备库计算量
--2、不需要把整个事务的binlog都扫一边才能决定分发到哪个worker,更加节省内存
--3、备库的分发策略不依赖于binlog内容,所以binlog是statement格式也是可以的

对于表上没有主键和外键约束的场景,WRITSET策略也没有办法并行,会暂时退化为单线程模型。 所以,表是否有主键,也是影响主备同步延迟原因之一。

总结

单线程复制能力低于多线程复制,对于更新压力较大的主库,备库可能一直追不上主库。

MySQL备库并行策略,修改了binlog的内容,也就是说不是向上兼容的,所以需要注意。

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

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

相关文章

人脸是门大生意

我们正处在一个新时代的入口。人有70%的能量是被大脑消耗,大脑90%的能量用来处理视觉信息,人脸则承载了绝大部分的视觉信息。我们要讨论的是一个比Google Glass更酷的世界。文/程苓峰-云科技网易邮箱的用户已经可以用人脸而不是密码来验证登陆。安卓4.0实…

【SQL】sql版Split函数。用于拆分字符串为单列表格

【SQL】sql版Split函数。用于拆分字符串为单列表格 功能与.net版string.Split函数类似,只不过.net返回的是数组,这个返回的是一个单列表格,每个拆分出来的子串占一行。可选是否移除空格子串和重复项。市面上类似的函数不算少,但大…

线描算法

线描算法 (Line drawing algorithms) The equation for a straight line is ymxb 直线方程为y mx b In this m represent a slope of a line which can be calculated by the my2-y1/x2-x1 where (x1, y1) are the starting position of the points and (x2, y2) are the end…

为移动端网页构造快速响应按钮

背景 在谷歌,我们不断地推测手机网页应用的可能性。像HTML5这样的技术使我们网页版的应用以及运行在手机设备上的原生应用。而这些技术的成就之一就是我们开发了一种新的创建按钮的方法,使按钮的响应时间远远快于一般的HTML按钮。在此之前的按钮或者其他…

Red Gate系列之一 SQL Compare 10.4.8.87 Edition 数据库比较工具 完全破解+使用教程

Red Gate系列之一 SQL Compare 10.4.8.87 Edition 数据库比较工具 完全破解使用教程 Red Gate系列文章: Red Gate系列之一 SQL Compare 10.4.8.87 Edition 数据库比较工具 完全破解使用教程 Red Gate系列之二 SQL Source Control 3.0.13.4214 Edition 数据库版本控制…

《MySQL——基于位点orGTID的主备切换协议》

一主多从的设置,用于读写分离,主库负责所有的写入和一部分读,其他读请求则由从库分担。 一主多从架构下,主库故障后的主备切换问题。相比于一主一备,多了从库指向新主库的过程。 基于位点的主备切换同步 把节点B设…

数据科学和统计学_数据科学中的统计

数据科学和统计学统计 (Statistics) Statistics are utilized to process complex issues in reality with the goal that Data Scientists and Analysts can search for important patterns and changes in Data. In straightforward words, Statistics can be utilized to ge…

java随机数生成(固定位数)

随机生成 a 到 b (不包含b)的整数:(int)(Math.random()*(b-a))a; 随机生成 a 到 b (包含b)的整数:(int)(Math.random()*(b-a1))a;转载于:https://www.cnblogs.com/zhwl/p/3624726.html

POJ 3670 Eating Together

POJ_3670 由于递增和递减是类似的,下面不妨只讨论变成递增序列的情况。 由于Di只有三个数,所以可以考虑将序列分割成三部分,第一部分全部变成1,第二部分全部变成2,第三部分全部变成3。然后我们枚举3开始的位置&#xf…

《MySQL——如何解决一主多从的读写分离的过期读问题》

目录两种架构两种架构特点强制走主库方案Sleep方案判断主备无延迟方案配合semi-sync等主库位点方案GTID方案两种架构 基于一主多从的读写分离,如何处理主备延迟导致的读写分离问题。 读写分离的主要目标:分摊主库压力。 有两种架构: 1、客…

json/ 发送形式_24/7的完整形式是什么?

json/ 发送形式24/7:二十四 (24/7: Twenty-Four Seven) 24/7 or 24-7 service, which generally marked "twenty-four seven" is service that is existing at any time and typically, every day in trade business and industry. Substitute orthograph…

《MySQL tips:并发查询与并发连接区别》

并发连接与并发查询,并不是一个概念。 在执行show processlist的结果里,看到了几千个连接,指的是并发连接。 而"当前正在执行"的语句,才是并发查询。 并发连接数多影响的是内存。 并发查询太高对CPU不利。一个机器的…

对上拉下拉电阻的作用作个总结(想了解的过来看看)(转载)

转自:http://www.amobbs.com/thread-5475279-1-3.html 一、定义:上拉就是将不确定的信号通过一个电阻嵌位在高电平!电阻同时起限流作用!下拉同理!上拉是对器件注入电流,下拉是输出电流;弱强只是…

给用户传入的变量进行转义操作

先看代码实现: /* 对用户传入的变量进行转义操作。*/ if (!get_magic_quotes_gpc()) {if (!empty($_GET)){$_GET addslashes_deep($_GET);}if (!empty($_POST)){$_POST addslashes_deep($_POST);}$_COOKIE addslashes_deep($_COOKIE);$_REQUEST addslashes_…

《MySQL——外部检测与内部统计 判断 主库是否出现问题》

目录select1判断查表判断更新判断外部检测弊端内部统计一主一备的双M架构里,主备切换只需要把客户端流量切换到备库。 在一主多从的架构里,主备切换要把客户端流量切换到备库,也需要把从库接到新主库上。 切换有两种场景:1、主动…

NIM的完整形式是什么?

NIM:无内部消息 (NIM: No Internal Message) NIM is an abbreviation of "No Internal Message". NIM是“无内部消息”的缩写。 It is an expression, which is commonly used in the Gmail platform. It is written in the subject of the mail, if the…

[Json] C#ConvertJson|List转成Json|对象|集合|DataSet|DataTable|DataReader转成Json (转载)...

点击下载 ConvertJson.rar 本类实现了 C#ConvertJson|List转成Json|对象|集合|DataSet|DataTable|DataReader转成Json|等功能大家先预览一下 请看代码 /// <summary> /// 类说明&#xff1a;Assistant /// 编 码 人&#xff1a;苏飞 /// 联系方式&#xff1a;361983679 …

let 只能在严格模式下吗_LET的完整形式是什么?

let 只能在严格模式下吗LET&#xff1a;今天早早离开 (LET: Leaving Early Today) LET is an abbreviation of "Leaving Early Today". LET是“ Leaveing Today Today”的缩写 。 It is an expression, which is commonly used in the Gmail platform. It is writt…

js 遮罩层 loading 效果

//调用方法 //关闭事件<button οnclickLayerHide()>关闭</button>&#xff0c;在loadDiv(text)中&#xff0c;剔除出来 //调用LayerShow(text)&#xff0c;text为参数&#xff0c;可以写入想要写入的提示语 //本方法在调用时会自动生成一个添加到body的div&#x…

centos6.5安装配置LDAP服务[转]

centos6.5安装配置LDAP服务[转] 安装之前查一下 1find / -name openldap*centos6.4默认安装了LDAP&#xff0c;但没有装ldap-server和ldap-client 于是yum安装 1su root2yum install -y openldap openldap-servers openldap-clients不建议编译源码包&#xff0c;有依赖比较麻烦…