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 ...
随机推荐
- json和字符串转换
json对象转js字符串 JSON.stringify(json) js字符串转json对象 var json= $.parseJSON(str);
- spring2.0包说明【转】
Spring压缩包目录说明 关键字: sring jar 1. Spring压缩包目录说明 aspectj目录下是在Spring框架下使用aspectj的源代码和测试程序文件. Aspectj是jav ...
- JavaScript 对象 之继承对象 学习笔记
假设,我们有个这样的需求: 两个种族,每个种族都有 名字.血量(默认200).行为(行为有 跳跃.移动速度 这些属性)等共有属性. 人族能量值比兽人多10%,兽人血量比人族多10%. 职业有战士和法师 ...
- Spark 集群安装
一.安装jdk 二.安装scala 三.安装Spark 1.解压 tar -zxvf spark-1.5.1-bin-hadoop2.6.tgz 2.cp spark-env.sh.template ...
- TListView Header重绘和高度设置
TListView 的 Header 部分默认 BtnFace 颜色,高度也不能改变.我们可以通过编写一些代码来实现这些功能: 获得TListView 的Header 的句柄: TListView的H ...
- MySQL_财务统计各产品品类各城市上周收入毛利表_20161202
注:财务需要统计各产品品类各城市上周毛利情况 下面这样的表是沟通后展现的形式.数据展现形式我认为的大都是行列转 列转行的转置 从财务角度这样展现形式比较适合. 由于黄色部分为汇总项目,因此我拆分成9个 ...
- 根据日期 读取三个csv不留指定日期的内容 新保存一个文件
using System;using System.Collections.Generic;using System.Drawing;using System.Globalization;using ...
- Python str方法总结
1.返回第一个字母大写 S.capitalize(...) S.capitalize() -> string 1 2 3 4 >>>a = 'shaw' >>> ...
- device tree 生成device node 到 platform_device
http://blog.csdn.net/lichengtongxiazai/article/details/38942033 http://blog.csdn.net/mcgrady_tracy/a ...
- (三) 一起学 Unix 环境高级编程 (APUE) 之 文件和目录
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...