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 ...
随机推荐
- form 编译命令
11i: Form:f60gen $AU_TOP/forms/ZHT/GLXJEENT.fmb userid=apps/tpsadbm output_file=$GL_TOP/forms/ZHT/GL ...
- js 小工具-- 原生 js 去除空格
// 原生js 去除字符串空格 <script type="text/javascript"> String.prototype.trim = function (){ ...
- 2016年 Delphi Roadmap
2016年delphi Roadmap 发布,这也是新公司的第一次发布路线图. 虽然稍微晚点( 原来说是1月份发布路线图),至少比过去积极点.喧嚣多年的靴子终于落地. Linux 的支持终于正式公布. ...
- django中自定义标签和过滤器
想要实现自定义标签和过滤器需要进行准备工作: 准备(必需)工作: 1 在某个app下创建一个名为templatetags(必需,且包名不可变)的包.假设我们在名为polls的app下创建了一个tem ...
- PHP 用html方式输出Excel文件时的数据格式设置
1) 文本:vnd.ms-excel.numberformat:@ 2) 日期:vnd.ms-excel.numberformat:yyyy/mm/dd 3) 数字:vnd.ms-excel.numb ...
- 2016.02.02 JS事件
今天看完JS事件部分,所剩时间不多,务必分秒珍惜.
- 《深入理解Nginx》阅读与实践(三):使用upstream和subrequest访问第三方服务
本文是对陶辉<深入理解Nginx>第5章内容的梳理以及实现,代码和注释基本出自此书. 一.upstream:以向nginx服务器的请求转化为向google服务器的搜索请求为例 (一)模块框 ...
- QT报错Error processing
执行命令:qmake modbus_ups_mlrl.pro modbus_ups_mlrl.pro文件内容: TEMPLATE = vclib CONFIG +=qt debug thread QT ...
- __iter__
[__iter__] 如果一个类想被用于for ... in循环,类似list或tuple那样,就必须实现一个__iter__()方法,该方法返回一个迭代对象,然后,Python的for循环就会不断调 ...
- ContentProvider 增删改查通讯录
一.通讯录应用介绍 通讯录应用是Android自带的应用程序,我们看到此应用的时候,可能只认为这是一个应用,用数据库存储数据,但是实际上不是这样的. 通讯录是ContentProvider的应用,通讯 ...