《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,一经查实,立即删除!

相关文章

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

背景 在谷歌,我们不断地推测手机网页应用的可能性。像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…

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

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

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

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

[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 …

《MySQL——恢复数据-误删行、表、库》

目录误删行事前预防误删行数据方法误删表/库延迟复制备库事前预防误删库/表方法传统的架构不能预防误删数据&#xff0c;因为主库的一个drop table命令&#xff0c;会通过binlog传给所有从库和级联从库&#xff0c;进而导致整个集群的实例都会执行这个命令。 MySQL相关的误删除…

python图例位置_Python | 图例位置

python图例位置Legends are one of the key components of data visualization and plotting. Matplotlib can automatically define a position for a legend in addition to this, it allows us to locate it in our required positions. Following is the list of locations…

工作总结:文件对话框的分类(C++)

原文地址&#xff1a;http://www.jizhuomi.com/software/173.html 文件对话框分为打开文件对话框和保存文件对话框&#xff0c;相信大家在Windows系统中经常见到这两种文件对话框。例如&#xff0c;很多编辑软件像记事本等都有“打开”选项&#xff0c;选择“打开”后会弹出一个…

《MySQL——Innodb改进LRU算法》

Innodb改进LRU.算法&#xff0c;实质上将内存链表分成两段。 靠近头部的young和靠近末尾的old&#xff0c;取5/12段为分界。 新数据在一定时间内只能在old段的头部&#xff0c;当在old段保持了一定的时间后被再次访问才能升级到young。 实质上是分了两段lru&#xff0c;这样做的…

jQuery: 整理4---创建元素和添加元素

1.创建元素&#xff1a;$("内容") const p "<p>这是一个p标签</p>" console.log(p)console.log($(p)) 2. 添加元素 2.1 前追加子元素 1. 指定元素.prepend(内容) -> 在指定元素的内部的最前面追加内容&#xff0c;内容可以是字符串、…

Design a high performance cache for multi-threaded environment

如何设计一个支持高并发的高性能缓存库 不 考虑并发情况下的缓存的设计大家应该都比较清楚&#xff0c;基本上就是用map/hashmap存储键值&#xff0c;然后用双向链表记录一个LRU来用于缓存的清理。这篇文章 应该是讲得很清楚http://timday.bitbucket.org/lru.html。但是考虑到高…

LinkChecker 8.1 发布,网页链接检查

LinkChecker 8.1 可对检查时间和最大的 URL 数量进行配置&#xff1b;当使用 HTTP 请求时发送 do-not-track 头&#xff1b;生成 XML 的 sitemap 用于搜索引擎优化&#xff1b;检测 URL 长度和重复的页面内容&#xff1b;修复了很多检查的 bug。 LinkChecker 是一个网页链接检查…

c语言语言教程0基础_C语言基础

c语言语言教程0基础Hey, Folks here I am back with my second article on C language. Hope you are through with my previous article C language - History, Popularity reasons, Characteristics, Basic structure etc. In this one, I will cover some fundamental conce…

《MySQL——临时表》

内存表与临时表区别 临时表&#xff0c;一般是人手动创建。 内存表&#xff0c;是mysql自动创建和销毁的。 内存表&#xff0c;指的是使用Memory引擎的表&#xff0c;建表语法&#xff1a;create table ... engine memeory 表的数据存在内存里&#xff0c;系统重启后会被清…

drei

模拟9 T3 &#xff08;COGS上也有&#xff0c;链接http://218.28.19.228/cogs/problem/problem.php?pid1428&#xff09; 题目描述 输入a&#xff0c;p&#xff0c;求最小正整数x&#xff0c;使得a^x mod p 1。 分析 神奇的欧拉定理&#xff08;对于gcd&#xff08;a&#xf…

css中变量_CSS中的变量

css中变量CSS | 变数 (CSS | Variables) CSS variables allow you to create reusable values that can be used throughout a CSS document. CSS变量允许您创建可在CSS文档中使用的可重用值。 In CSS variable, function var() allows CSS variables to be accessed. 在CSS变…

SuperSpider——打造功能强大的爬虫利器

SuperSpider——打造功能强大的爬虫利器 博文作者&#xff1a;加菲 发布日期&#xff1a;2013-12-11 阅读次数&#xff1a;4506 博文内容&#xff1a; 1.爬虫的介绍 图1-1 爬虫&#xff08;spider) 网络爬虫(web spider)是一个自动的通过网络抓取互联网上的网页的程序&#xf…

《MySQL——关于grant赋权以及flush privileges》

先上总结图&#xff1a; 对于赋予权限或者收回权限还是创建用户&#xff0c;都会涉及两个操作&#xff1a; 1、磁盘&#xff0c;mysql.user表&#xff0c;用户行所有表示权限的字段的值的修改 2、内存&#xff0c;acl_users找到用户对应的对象&#xff0c;将access值修改 g…