MGR并行复制从节点复制线程死锁
1.故障现象
20191113-22:32 datax全量同步t_shop_info表到 eorder所在的实例,t_shop_info表有两个唯一约束。总数据量不超过1w行,同步完成后MGR从库复制线程死锁。导致同步停止,影响业务。
从库processlist 截图
2.故障复现
2.1 集群环境
MGR集群ip
|
端口
|
---|---|
10.204.55.205 | 3320 |
10.204.55.206 | 3320 |
10.204.55.207 | 3320 |
2.2 复现方法1 ,使用datax全量同步。
集群主要参数配置
SET GLOBAL transaction_isolation = 'READ-COMMITTED'
SET GLOBAL slave_parallel_type = 'LOGICAL_CLOCK';
SET GLOBAL slave_parallel_workers = 16;
SET GLOBAL slave_preserve_commit_order = ON;
用datax启动 replace into方式全量同步t_shop_info表到MGR测试集群。
结果:任务启动第二次从库复制线程必定hangs。
用datax启动 DUPLICATE KEY UPDATE 方式全量同步t_shop_info表到MGR测试集群
结果:任务启动5次都没有出现从库复制线程hangs。
2.3 复现方法2,使用 jmeter 并发40线程并行执行sql。
集群主要参数
SET GLOBAL slave_parallel_type = 'LOGICAL_CLOCK';
SET GLOBAL slave_parallel_workers = 16;
SET GLOBAL slave_preserve_commit_order = ON;
表结构
CREATE TABLE `replaceinto_deadlocktest` ( `fid` BIGINT (20) NOT NULL AUTO_INCREMENT, `fname` VARCHAR (10) DEFAULT NULL , `fdesc` VARCHAR (10) DEFAULT NULL , PRIMARY KEY (`fid`), UNIQUE KEY `fname` (`fname`) ) ENGINE=INNODB AUTO_INCREMENT=10754 DEFAULT CHARSET=utf8mb4 |
#随机数 replace into REPLACE INTO replaceinto_deadlocktest (fid,fname,fdesc) VALUES (@fid:= '${__Random(1,200000,)}' , @fname:=CONCAT( 'b' ,@fid), 'a2' ); #递增id replace into REPLACE INTO replaceinto_deadlocktest (fid,fname,fdesc) VALUES ( '${__intSum(${__counter(TRUE,)},1)}' , 'b${__intSum(${__counter(TRUE,)},1)}' , 'a2' ) #随机id DUPLICATE update INSERT INTO replaceinto_deadlocktest (fid,fname,fdesc) VALUES (@fid:= '${__Random(1,200000,)}' ,@fname:=CONCAT( 'b' ,@fid), 'a2' ) ON DUPLICATE KEY UPDATE fid=@fid,fname=@fname,fdesc= 'a2' ; #递增id DUPLICATE update INSERT INTO replaceinto_deadlocktest (fid,fname,fdesc) VALUES ( '${__intSum(${__counter(TRUE,)},1)}' , 'b${__intSum(${__counter(TRUE,)},1)}' , 'a2' ) ON DUPLICATE KEY UPDATE fid= '${__intSum(${__counter(TRUE,)},1)}' ,fname= 'b${__intSum(${__counter(TRUE,)},1)}' ,fdesc= 'a2' ; |
结果:
随机数replace into 与 递增id replace into 都会出现从库复制线程hangs。并且jmeter会有一定的比例报线程死锁。
随机数DUPLICATE update 与 递增id DUPLICATE update 都没出现从库复制线程hangs。
jmeter死锁日志 Response code:40001 1213 Response message:com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction mysql死锁日志 TRANSACTION 10244303573, ACTIVE 0 sec inserting mysql TABLES IN USE 1, locked 1 LOCK WAIT 5 LOCK struct(s), HEAP size 1136, 4 ROW LOCK(s), UNDO LOG entries 2 MySQL thread id 39582, OS thread handle 140372828473088, QUERY id 11662118 10.201.3.1 WORK UPDATE REPLACE INTO replaceinto_deadlocktest (fid,fname,fdesc) VALUES (@fid:= '49' , @fname:=CONCAT( 'b' ,@fid), 'a2' ) *** (1) WAITING FOR THIS LOCK TO BE GRANTED: RECORD LOCKS SPACE id 734 page NO 4 n bits 120 INDEX fname of TABLE `dayutest`.`replaceinto_deadlocktest` trx id 10244303573 lock_mode X waiting *** (2) TRANSACTION : TRANSACTION 10244303574, ACTIVE 0 sec inserting mysql TABLES IN USE 1, locked 1 4 LOCK struct(s), HEAP size 1136, 3 ROW LOCK(s), UNDO LOG entries 2 MySQL thread id 39560, OS thread handle 140349632673536, QUERY id 11662119 10.201.3.1 WORK UPDATE REPLACE INTO replaceinto_deadlocktest (fid,fname,fdesc) VALUES (@fid:= '5' , @fname:=CONCAT( 'b' ,@fid), 'a2' ) *** (2) HOLDS THE LOCK(S): RECORD LOCKS SPACE id 734 page NO 4 n bits 120 INDEX fname of TABLE `dayutest`.`replaceinto_deadlocktest` trx id 10244303574 lock_mode X LOCKS rec but NOT gap *** (2) WAITING FOR THIS LOCK TO BE GRANTED: RECORD LOCKS SPACE id 734 page NO 4 n bits 120 INDEX fname of TABLE `dayutest`.`replaceinto_deadlocktest` trx id 10244303574 lock_mode X waiting *** WE ROLL BACK TRANSACTION (2) |
2.4 复现方法3,jmeter+(pt-osc,gh-ost)
jmeter并发写入带唯一索引的表,并且使用pt-osc 和gh-ost 分别修改表结构
结果:jmeter并发写入时,同时pt-osc出现从库复制线程hangs。
jmeter并发写入时,同时gh-ost没有出现从库复制线程hangs。
pt-online-schema-change --user=work --password=111111 --host=10.204.55.205 --port 3320 \
--alter="add index idx_fdesc(fdesc);" \
D=dayutest,t=replaceinto_deadlocktest \
--chunk-size=20 \
--nodrop-old-table \
--chunk-time=0.5 \
--max-lag=2 \
--check-interval=2 \
--charset=utf8 \
--critical-load="Threads_running=64" \
--max-load="Threads_running=32" \
--print \
--execute gh-ost --host='10.204.55.205' --port 3320 \
--user='work' \
--password='111111' \
--database='dayutest' \
--table='replaceinto_deadlocktest' \
--alter="add index idx_fdesc(fdesc);" \
--allow-on-master \
--verbose \
--initially-drop-ghost-table \
--throttle-flag-file /tmp/1.log \
--allow-master-master \
--ok-to-drop-table \
--approve-renamed-columns \
--max-lag-millis=2000 \
--chunk-size=2000 \
--max-load=Threads_running=20 \
--switch-to-rbr \
--execute
3.测试结论
MGR开启并行16线程复制,并且对带唯一约束表做replace into操作很高的几率导致MGR从库hangs。
replace into 场景包括(pt-osc,datax全量同步)。
后续改进措施,使用gh-ost替代pt-osc,datax全量同步调整为ON DUPLICATE KEY UPDATE 插入。
MGR并行复制从节点复制线程死锁的更多相关文章
- Centos7.5部署MySQL5.7基于GTID主从复制+并行复制+半同步复制+读写分离(ProxySQL) 环境- 运维笔记 (完整版)
之前已经详细介绍了Mysql基于GTID主从复制的概念,原理和配置,下面整体记录下MySQL5.7基于GTID主从复制+并行复制+增强半同步复制+读写分离环境的实现过程,以便加深对mysql新特性GT ...
- c#Winform程序调用app.config文件配置数据库连接字符串 SQL Server文章目录 浅谈SQL Server中统计对于查询的影响 有关索引的DMV SQL Server中的执行引擎入门 【译】表变量和临时表的比较 对于表列数据类型选择的一点思考 SQL Server复制入门(一)----复制简介 操作系统中的进程与线程
c#Winform程序调用app.config文件配置数据库连接字符串 你新建winform项目的时候,会有一个app.config的配置文件,写在里面的<connectionStrings n ...
- MySQL 5.7 基于GTID主从复制+并行复制+半同步复制
环境准备 IP HOSTNAME SERVICE SYSTEM 192.168.131.129 mysql-master1 mysql CentOS7.6 192.168.131.130 mysql- ...
- HDFS源码分析数据块复制选取复制源节点
数据块的复制当然需要一个源数据节点,从其上拷贝数据块至目标数据节点.那么数据块复制是如何选取复制源节点的呢?本文我们将针对这一问题进行研究. 在BlockManager中,chooseSourceDa ...
- MySQL组复制MGR(二)-- 组复制搭建
(一)主机操作 (1)路由信息vmnet5 192.168.10.0 (2)主机信息 主机名称 IP地址 操作系统版本 数据库版本 mgr-node1 192.168.10.11 centos 7.4 ...
- Python并发编程-进程 线程 同步锁 线程死锁和递归锁
进程是最小的资源单位,线程是最小的执行单位 一.进程 进程:就是一个程序在一个数据集上的一次动态执行过程. 进程由三部分组成: 1.程序:我们编写的程序用来描述进程要完成哪些功能以及如何完成 2.数据 ...
- 实现mysql的读写分离(mysql-proxy)____1(mysql的主从复制,基于gtid的主从复制,半同步复制,组复制)
主从复制原理: 从库生成两个线程,一个I/O线程,一个SQL线程: i/o线程去请求主库 的binlog,并将得到的binlog日志写到relay log(中继日志) 文件中:主库会生成一个 log ...
- 尝试解决在构造函数中同步调用Dns.GetHostAddressesAsync()引起的线程死锁
(最终采用的是方法4) 问题详情见:.NET Core中遇到奇怪的线程死锁问题:内存与线程数不停地增长 看看在 Linux 与 Windows 上发生线程死锁的后果. Linux: Microsoft ...
- Java——线程死锁问题
body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...
随机推荐
- Log4net 单独创建配置文件(三)
1.建立ASP.Net空的Web程序,添加Default.aspx窗体 2.添加web配置文件命名为:log4net.config,添加配置 <?xml version="1.0&qu ...
- NLP算法工程师(实习生)面试总结(持续更新)
爱奇艺 1. attention<attention is all you need> 2. 相关项目 3. 逻辑回归 4. linux的指令(重命名文件,vim替换,vim指向文章最末行 ...
- elasticsearch: can not run elasticsearch as root
进入bin目录启动elasticsearch: lunadeMacBook-Air:elasticsearch-6.1.0 luna$ cd bin/ lunadeMacBook-Air:bin lu ...
- linux定时执行shell脚本
写一个shell脚本,定时执行简单示例 很多时候我们有希望服务器定时去运行一个脚本来触发一个操作,比如说定时去备份服务器数据.数据库数据等 不适合人工经常做的一些操作这里简单说下 Shell俗称壳,类 ...
- 实现MyBatis批量查询
Service public List<DeviceBean> getDeviceList(Map<String, Object> parameter);Serv ...
- sip user Authentication and 401
https://www.vocal.com/sip-2/sip-user-authentication/ https://tools.ietf.org/html/rfc3261 SIP User Au ...
- 范仁义html+css课程---5、列表
范仁义html+css课程---5.列表 一.总结 一句话总结: 学会基本的使用有序列表.无序列表.定义列表,设置样式的话尽量通过css而不是属性 1.无序列表基本形式(实例)? ul标签包裹li标签 ...
- Netty执行流程分析与重要组件介绍
一.环境搭建 创建工程,引入Netty依赖 二.基于Netty的请求响应Demo 1.TestHttpServerHandle 处理器.读取客户端发送过来的请求,并且向客户端返回hello worl ...
- Post Setting Proxy 设置 代理
postman的代理使用篇(四) - codingstudy - SegmentFault 思否https://segmentfault.com/a/1190000012024844 postman ...
- JetBrainsIDEA-structure结构继承的图标说明
图标3表示重写继承类中方法 图标2表示实现继承类抽象方法或接口中的方法 图标1表示未使用继承类中的方法 类中方法并非只统计显示继承类或实现接口中方法,而是对该类中所有方法进行分类,有可能某些方法是继承 ...