mysql 5.6并行复制事件分发机制
并行复制相关线程
在MySQL 5.6并行复制中,当设置set global slave_parallel_workers=2时,共有4个复制相关的线程,如下:
+----+-------------+------+-------+---------+------+------------------------------------------------------------------+------+
| ID | USER | HOST | DB | COMMAND | TIME | STATE | INFO |
+----+-------------+------+-------+---------+------+------------------------------------------------------------------+------+
| 23 | system user | | NULL | Connect | 3 | Waiting for master to send event | NULL |
| 24 | system user | | mysql | Connect | 3 | Slave has read all relay log; waiting for the slave I/O thread t | NULL |
| 25 | system user | | NULL | Connect | 3 | Waiting for an event from Coordinator | NULL |
| 26 | system user | | NULL | Connect | 3 | Waiting for an event from Coordinator | NULL |
+----+-------------+------+-------+---------+------+------------------------------------------------------------------+------+
其中第一个为IO线程,负责从主库拉取binlog到备库并存为relay log;
第二个为分发线程,负责解析relay log,并将解析后的事件分发给worker线程处理;
其余两个为worker线程负责处理分发后的事件,类型非并行复制时的sql线程。
并行复制并发策略
目前MySQL(改进版)并行复制是以表级别进行分发的,即同一时刻,同一个表相关的操作只能在同一个worker线程中进行。
考虑两个事务,分别对表进行insert
trx1:
begin;
insert into t1 values(1);
comit;
trx2:
begin;
insert into t2 values(1);
comit;
那么这两个事务可能分别在两个worker中并行执行。
有些特殊情会影响worker的并发执行:
- 并行退化为串行的情况
- DDL语句串行处理(RDS MySQL正在优化DDL并行处理)
- binlog切换事件需串行处理
- 有外键关系的表需串行处理
- 并行等待的情况
当一个事务中包含多个表时,如下:
trx3:
begin;
insert into t1 values(3);
insert into t2 values(3);
comit;
如果当前worker1正在执行t1相关的事务,worker2正在执行t2相关的事务,那么分发线程在分发trx3的t2的事件时必须等待worker2的t2相关的事务执行完成。
并行复制worker分配
假设,worker线程正在执行的情况如下:
worker 1: trx1: insert t1
worker 2: trx2: insert t2; trx3: insert t3;
然后分发线程再来一个事务trx4:
trx4: insert t4;
分发线程该分配给哪个worker呢?
分配线程分配会分配给最空闲的worker(get_least_occupied_worker);
这里最空闲是指worker当前正在执行的事务涉及的表数越少越空闲。
worker1正在执行的事务涉及的表数为1,而worker2正在执行的事务涉及的表数为2,因此trx4会分配为worker1;
表和worker存在一一对应关系,为了快速找到表对应的worker,哈希表(mapping_db_to_worker)存储了这种映射关系。同时为了控制哈希表过大导致占用较多内存或哈希冲突,系统严格控制了哈希表的大小,不能超过16(硬编码mts_partition_hash_soft_max),当超过16时,会将当前没有执行的表从哈希表驱逐出去。
在表较多情况下,哈希表大小设为16显得过小,可能会频繁驱逐表,频繁新建哈希键值对的情况。
优化
- 表级并行复制下,哈希表的大小16(硬编码
mts_partition_hash_soft_max)过小,应设为动态可调; - 分配线程分配会分配给最空闲的
worker(get_least_occupied_worker)。
考虑如下情况:
worker 1: t1 1000个事务
worker 2: t2 10个事务 t3 10 个事务
当前worker1比worker2要繁忙,而按照当前正在执行的事务涉及的表数越少越空闲的原则,新来的事务(比如insert t4)会分配给worker1,这是不合理的。
因此,空闲的标准应改为当前正在执行的事务数越少越空闲,这样新来的事务会分配给worker2。
mysql 5.6并行复制事件分发机制的更多相关文章
- MySQL 5.7 并行复制实现原理与调优
MySQL 5.7并行复制时代 众所周知,MySQL的复制延迟是一直被诟病的问题之一,然而在Inside君之前的两篇博客中(1,2)中都已经提到了MySQL 5.7版本已经支持“真正”的并行复制功能, ...
- IOS 触摸事件分发机制详解
欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 作者:MelonTeam 前言 很多时候大家都不关心IOS触摸事件的分发机制的实现原理,当遇到以下几种情形的时候你很可能抓破头皮都找不到解决方案 ...
- 官方:MySQL 5.7 并行复制实现原理与调优 | InsideMySQL(转载)
MySQL 5.7并行复制时代 众所周知,MySQL的复制延迟是一直被诟病的问题之一,然而在Inside君之前的两篇博客中(1,2)中都已经提到了MySQL 5.7版本已经支持“真正”的并行复制功能, ...
- MySQL 5.7并行复制时代
众所周知,MySQL的复制延迟是一直被诟病的问题之一,然而在Inside君之前的两篇博客中(1,2)中都已经提到了MySQL 5.7版本已经支持“真正”的并行复制功能,官方称为为enhanced mu ...
- Android事件分发机制二:viewGroup与view对事件的处理
前言 很高兴遇见你~ 在上一篇文章 Android事件分发机制一:事件是如何到达activity的? 中,我们讨论了触摸信息从屏幕产生到发送给具体 的view处理的整体流程,这里先来简单回顾一下: 触 ...
- Android事件分发机制浅谈(一)
---恢复内容开始--- 一.是什么 我们首先要了解什么是事件分发,通俗的讲就是,当一个触摸事件发生的时候,从一个窗口到一个视图,再到一个视图,直至被消费的过程. 二.做什么 在深入学习android ...
- Android事件分发机制浅谈(二)--源码分析(ViewGroup篇)
上节我们大致了解了事件分发机制的内容,大概流程,这一节来分析下事件分发的源代码. 我们先来分析ViewGroup中dispatchTouchEvent()中的源码 public boolean dis ...
- Atitit View事件分发机制
1. Atitit View事件分发机制 1. Atitit View事件分发机制1 1.1. 三个关键方法 dispatchTouchEvent onInterceptTouchEvent onTo ...
- Android Touch事件分发机制学习
Android 事件分发机制 ViewGroup dispatchTouchEvent 返回true dispatchTouchEvent: Activity ACTION_DOWN Myrelat ...
随机推荐
- WampServer服务中MySQL无法正常启动解决方案
打开wampserver->mysql->my.ini,添加或修改innodb_force_recovery = 1 然后重启所有服务就大功告成了!
- 【译】为什么这样宏定义#define INT_MIN (-2147483647 - 1)?
2的32次方为2147483648*2,0~(2147483648*2-1)这是32位机上无符号整数代表的范围.而32机的int范围为-2147483648~+2147483647 stackover ...
- JS中的for/in语句和arguments参数
在js应用中,有时候我们会遇到希望定义一个函数可以被不同情况调用,比如参数个数不固定的情况. 可以使用for/in语句和arguments参数解决. 举个简单例子:定义一个计算总和的函数,需要计算的数 ...
- git常用操作
批量删除以bran开头的本地分支 git branch |grep 'bran'|xargs git branch -d
- ZOJ3778--一道水题
Description As we all know, Coach Gao is a talented chef, because he is able to cook M dishes in the ...
- SQL SERVER连接、合并查询
----创建测试表MyStudentInfoCREATE table MyStudentInfo( Id int not null primary key, Name varchar(16), ...
- mysql 索引分类
在数据库表中,对字段建立索引可以大大提高查询速度.通过善用这些索引,可以令 MySQL的查询和运行更加高效.索引是快速搜索的关键.MySQL索引的建立对于MySQL的高效运行是很重要的.下面介绍几种常 ...
- MySQL安装常见问题(找不到文件,系统服务无法启动...)
在安装mysql时总是会遇到问题,每次重新安装都会花很多时间来排查.在网上其实有很多相关的文章,但很多都只讲了方法,但没讲具体细节问题,导致无法解决问题.其实有时候知道问题的原因,但总是因为一些细节问 ...
- [原创]PCB知识补充
近期又要使用Altium进行PCB板的绘制,算起来从大学课上第一次接触Protel99SE到现在已经算是半个熟练工了.不过现在想来还是能回忆起第一次使用的情景,对着一幅简单的原理图使用着自动连线的功能 ...
- Sphinx中文分词详细安装配置及API调用实战
这几天项目中需要重新做一个关于商品的全文搜索功能,于是想到了用Sphinx,因为需要中文分词,所以选择了Sphinx for chinese,当然你也可以选择coreseek,建议这两个中选择一个,暂 ...