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
测试sql类型
#随机数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并行复制从节点复制线程死锁的更多相关文章

  1. Centos7.5部署MySQL5.7基于GTID主从复制+并行复制+半同步复制+读写分离(ProxySQL) 环境- 运维笔记 (完整版)

    之前已经详细介绍了Mysql基于GTID主从复制的概念,原理和配置,下面整体记录下MySQL5.7基于GTID主从复制+并行复制+增强半同步复制+读写分离环境的实现过程,以便加深对mysql新特性GT ...

  2. c#Winform程序调用app.config文件配置数据库连接字符串 SQL Server文章目录 浅谈SQL Server中统计对于查询的影响 有关索引的DMV SQL Server中的执行引擎入门 【译】表变量和临时表的比较 对于表列数据类型选择的一点思考 SQL Server复制入门(一)----复制简介 操作系统中的进程与线程

    c#Winform程序调用app.config文件配置数据库连接字符串 你新建winform项目的时候,会有一个app.config的配置文件,写在里面的<connectionStrings n ...

  3. MySQL 5.7 基于GTID主从复制+并行复制+半同步复制

    环境准备 IP HOSTNAME SERVICE SYSTEM 192.168.131.129 mysql-master1 mysql CentOS7.6 192.168.131.130 mysql- ...

  4. HDFS源码分析数据块复制选取复制源节点

    数据块的复制当然需要一个源数据节点,从其上拷贝数据块至目标数据节点.那么数据块复制是如何选取复制源节点的呢?本文我们将针对这一问题进行研究. 在BlockManager中,chooseSourceDa ...

  5. MySQL组复制MGR(二)-- 组复制搭建

    (一)主机操作 (1)路由信息vmnet5 192.168.10.0 (2)主机信息 主机名称 IP地址 操作系统版本 数据库版本 mgr-node1 192.168.10.11 centos 7.4 ...

  6. Python并发编程-进程 线程 同步锁 线程死锁和递归锁

    进程是最小的资源单位,线程是最小的执行单位 一.进程 进程:就是一个程序在一个数据集上的一次动态执行过程. 进程由三部分组成: 1.程序:我们编写的程序用来描述进程要完成哪些功能以及如何完成 2.数据 ...

  7. 实现mysql的读写分离(mysql-proxy)____1(mysql的主从复制,基于gtid的主从复制,半同步复制,组复制)

    主从复制原理: 从库生成两个线程,一个I/O线程,一个SQL线程: i/o线程去请求主库 的binlog,并将得到的binlog日志写到relay log(中继日志) 文件中:主库会生成一个 log ...

  8. 尝试解决在构造函数中同步调用Dns.GetHostAddressesAsync()引起的线程死锁

    (最终采用的是方法4) 问题详情见:.NET Core中遇到奇怪的线程死锁问题:内存与线程数不停地增长 看看在 Linux 与 Windows 上发生线程死锁的后果. Linux: Microsoft ...

  9. Java——线程死锁问题

    body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...

随机推荐

  1. 干货 | 10分钟带你全面掌握branch and bound(分支定界)算法-概念篇

    00 前言 之前一直做启发式算法,最近突然对精确算法感兴趣了.但是这玩意儿说实话是真的难,刚好boss又叫我学学column generation求解VRP相关的内容.一看里面有好多知识需要重新把握, ...

  2. 【cf比赛练习记录】Codeforces Round #579 (Div. 3)

    思考之后再看题解,是与别人灵魂之间的沟通与碰撞 A. Circle of Students 题意 给出n个数,问它们向左或者向右是否都能成一个环.比如样例5是从1开始向左绕了一圈 [3, 2, 1, ...

  3. SDN阅读作业

    阅读文章<软件定义网络(SDN)研究进展>,并根据所阅读的文章,书写一篇博客,回答以下问题(至少3个): 1.为什么需要SDN?SDN特点? 随着网络规模的不断扩大,传统网络设备繁复的协议 ...

  4. jmeter(四十四)常用性能指标分析

    概述 我们在用jmeter做性能测试的时候,有一些关键性的性能指标需要去分析.但是由于开源工具本身的局限性,这些指标在工具中的命名极易对我们造成混淆.所以我们需要对这些指标一一进行剖析. 指标分析 响 ...

  5. 获取当前服务的IP和端口号

    package com.movitech.product.datahub.util; import org.slf4j.Logger; import org.slf4j.LoggerFactory; ...

  6. 团队作业-Beta冲刺(1/4)

    队名:软工9组 组长博客:https://www.cnblogs.com/cmlei/ 作业博客:https://edu.cnblogs.com/campus/fzu/SoftwareEngineer ...

  7. 【转】ANDROIDROM制作(一)——ROM结构介绍、精简和内置、一般刷机过程

    作为对Rom制作的一个总结,本节主要介绍以下内容:  1.Rom介绍  2.Rom文件结构  3.app的精简与内置  4.Recovery简介  5.radio包简介  6.一般刷机过程.刷机过程中 ...

  8. win7下查看进程端口

    一. 查看所有进程占用的端口 在开始-运行-cmd,输入:netstat –ano 可以查看所有进程 二.查看占用指定端口的程序 当你在用tomcat发布程序时,经常会遇到端口被占用的情况,我们想知道 ...

  9. https://www.cnblogs.com/LBSer/p/3310455.html

    https://www.cnblogs.com/LBSer/p/3310455.html

  10. GIS地理工具案例教程——批量合并影像-批量镶嵌栅格

    GIS地理工具案例教程--批量合并影像-批量镶嵌栅格 商务合作,科技咨询,版权转让:向日葵,135-4855__4328,xiexiaokui#qq.com 关键词:批量.迭代.循环.自动.智能.地理 ...