mysql 5.6多库并行复制原理
首先,要开启这个并行复制,需要设定slave_parallel_workers参数,这个参数如果设定成0的话代表不使用并行,relaylog由sql线程执行,表现和之前版本一致。当这个参数设置成n时,会有n个worker线程,由它来执行event,原来的sql变成coordinator线程,由它来读取relaylog,并按照一定规则将读到的event分配给worker线程执行,从这里可以看出,如果slave_parallel_workers被设置成1的话不仅不会增加效率,相反还会有所下降。
我们先来看简单的情况,即不涉及多库操作。对于某一个库来说,它会被绑定到第一个执行它的线程上,这里的绑定不是说以后该数据库的事件都会由该线程执行,还受制于另一个条件:coordinator线程分配事件时以事务为单位,一个事务会分配给该事务中第一个库所绑定worker线程,不会被拆分。如果遇到一个新的库,不能按照上面的规则决定执行的数据库的(即没有绑定线程,而且是该事务中第一个库)则会寻找绑定库最少的worker线程来执行它。
再来看涉及多库操作的语句,在分配这个语句时,coordinator线程会等待这些库的绑定线程都执行完毕,然后再分配这个语句。而如何涉及到的库太多(大于254)或者是一个ddl语句,则会触发一次同步操作,即等待所有线程执行完毕,然后将它分配给0号worker线程。
每一个worker线程都有一个任务队列,所谓的分配事件也就是coordinator线程将该事件加入某个worker的任务队列中,而所有worker的队列中事件的总长度是有一个上限的,这个上限由slave_pending_jobs_size_max决定,它默认为16M,也就是说最多有16M的relaylog在worker的执行队列中。
在这整个过程中,coordinator线程会保存一个位置,这个位置表示最后一个被连续执行的事务的结束位置,也就是说在这个点以前的所有relaylog都已经被执行了。这个点在代码中被称为lwm(Low-Water-Mark)或者checkpoint,coordinator会定期计算这个点的位置。那么它是如何算出这个位置的呢,首先,coordinator将上个checkpoint之后的所有事务的信息保存在gaq(global assigned queue)中,其次,worker保存了一个bitmap,标志着所有由它执行的事务,这样coordinator就可以通过遍历所有worker线程来计算出当前的lwm。这个点被更新以后,coordinator会给worker置一个标志,worker在执行完一个事务以后就会根据这个标志来右移那个bitmap。由于这些信息会被用来在程序意外退出以后的恢复,因此他们会被保存到磁盘上,此外,checkpoint之后的事务数是有上限的,这个值由slave_checkpoint_group(默认为512)来决定,超过这个值的事务不会被继续分发。
至于crash后的恢复,其实比较简单,恢复过程中由coordinator线程(或者叫它sql更合适)串行执行上个保存的checkpoint后面的事务,根据worker保存的记录,当一个事务被执行过了的话那么就跳过它,在这个恢复过程中,MySQL是可以正常提供服务的。当所有上次分配了但是没有被执行的事务全部执行结束以后就会恢复原来的流程。
参考:http://tencentdba.com/blog/mysql-5-6_multi_thread_slave_replication/
mysql 5.6多库并行复制原理的更多相关文章
- 减少MySQL主从延迟的神器--并行复制大揭密
1. 简介 MySQL 5.6引入了基于schema的并行复制,即如果binlog events操作的是不同schema的对象,不是DDL,且操作的对象没有对其他schema的foreign key关 ...
- mysql 案例 ~ 主从复制延迟之并行复制
一 概念说明 1 模型 并行复制是典型的生产者.消费者模式,Coordinator作为生产者,worker线程作为消费者. 2 Waiting for preceding transactio ...
- MYSQL双主全库同步复制
环境: A.B两台服务器分别安装mysql-5.7.18服务端,配置成互为主从同步. linux系统版本为CentOS7 A服务器ip:192.168.1.7 主机名:test1 B服务器ip:1 ...
- MySQL主主配置及并行复制搭建
思路: 两台机器互为主从. 机器1:192.168.1.160 机器2:192.168.1.164 修改两台机器的my.cnf文件,server-id,log-bin,auto-increment-i ...
- MySQL 5.7 并行复制实现原理与调优
MySQL 5.7并行复制时代 众所周知,MySQL的复制延迟是一直被诟病的问题之一,然而在Inside君之前的两篇博客中(1,2)中都已经提到了MySQL 5.7版本已经支持“真正”的并行复制功能, ...
- 官方:MySQL 5.7 并行复制实现原理与调优 | InsideMySQL(转载)
MySQL 5.7并行复制时代 众所周知,MySQL的复制延迟是一直被诟病的问题之一,然而在Inside君之前的两篇博客中(1,2)中都已经提到了MySQL 5.7版本已经支持“真正”的并行复制功能, ...
- MySQL并行复制(MTS)原理(完整版)
目录 MySQL 5.6并行复制架构 MySQL 5.7并行复制原理 Master 组提交(group commit) 支持并行复制的GTID slave LOGICAL_CLOCK(由order c ...
- MySQL 并行复制从库发生自动重启分析
并行复制从库发生自动重启分析 背景 半同步复制从库在晚上凌晨2点半发生自动重启,另一个异步复制从库在第二天凌晨3点也发生了自动重启. 分析 版本mysql 5.7.16 mysql> show ...
- MySQL 并行复制演进及 MySQL 8.0 中基于 WriteSet 的优化
MySQL 8.0 可以说是MySQL发展历史上里程碑式的一个版本,包括了多个重大更新,目前 Generally Available 版本已经已经发布,正式版本即将发布,在此将介绍8.0版本中引入的一 ...
随机推荐
- Lucky Boy
Lucky Boy Problem Description Recently, Lur have a good luck. He is also the cleverest boy in his sc ...
- Jpa-Spec oracle函数bitand,instr等扩展
jpa-spec github: https://github.com/wenhao/jpa-spec 使用这个框架可以简化我们拼条件的复杂度,如下代码: public Page<Person& ...
- kNN分类算法实现
kNN算法就是计算每个点到其他所有点的距离,选出距离最小的k个点.在这k个点里,哪个类别的最多,就把待分类的点归到哪类. kNN.py: from numpy import * import oper ...
- vscode 热部署 spring-mvc
1.添加maven插件 <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId> ...
- Spring基础04——ApplicationContext
1.ApplicationContext简述 ApplicationContext代表IOC容器,在SpringIOC容器中读取Bean配置创建Bean实例之前,必须对它进行实例化,只有在容器实例化后 ...
- 【Git】error: RPC failed; HTTP 413 curl 22 The requested URL returned error:413 Request Entity Too Large
error: RPC failed; HTTP 413 curl 22 The requested URL returned error:413 Request Entity Too Large fa ...
- 【转】Linux下的磁盘分区方法
转自:https://www.cnblogs.com/lbole/p/8904298.html 一.硬盘接口类型 硬盘的接口主要有IDE.SATA.SCSI .SAS和光纤通道等五种类型.其中IDE和 ...
- Python format格式化时使用‘’{‘’或者‘’}‘’
用format格式化时,如果其中要用到‘’{‘’或者‘’}‘’,需要进行转义,否则报错 {{ ,}}使用同样的符号实现转义,而不是‘/’
- MacOS Mojave 安装sshpass
使用sshpass的场景 安装sshpass及各种常见小问题处理 测试 安全提示 使用sshpass的场景 在MacOS下使用ansible命令(inventory文件中使用了密码验证的方式)或者使用 ...
- codeforces 108D Basketball Team(简单组合)
D. Basketball Team time limit per test 2 seconds memory limit per test 256 megabytes input standard ...