mysql主从复制出现Waiting for Slave Worker to release partition

简介: 修改一些文字错误

实为吾之愚见,望诸君酌之!闻过则喜,与君共勉 

第一节   并行复制

Mysql5.6的mts(并行复制)是基于database来分发事务的,coordinator(原来的sql thread)按照slave worker与db的对应关系进行处理来分发事务给相应的slave worker,slave worker代替了sql thread来执行事务中的event。并且mysql默认认为数据是以database来分布的,跨库的事务在slave应用的时候可能就需要等待了。

Waiting for Slave Worker to release partition第一次看到是在开启MTS的mysql5.6主从复制的时候,在Slave_SQL_Running_State:出现Waiting for Slave Worker to release partition,Slave_SQL_Running_State的状态比较多,但是这个状态翻译过来是指“等待slave worker 释放 分区(partitions)”,其中的partitions解释成中文不是很正确,partitions可以理解成”按照slave worker与db的对应关系进行分发事务后的对象”(有更好的解释请留言),它既不是事务也不是event,也不是单纯的对应关系,起码可以确定这种情况并不是异常的情况(大部分时候),slave worker正在应用coordinator分配的内容但是还没结束,coordinator需要等待之前分配的内容应用完成才可以继续分配(coordinator还没有将其放入slave worker的queue),下面尝试测试和复现Waiting for Slave Worker to release partition。

当不开启并行复制时(slave_parallel_workers 为0),show processlist是这样的:

1be0fce0fcc0befdee9f612c378e65d0cad4b2f0

当开启并行复制时(slave_parallel_workers为2),show processlist是这样的:

44a30bdd7fbeee1f7ca379e2701212fb871d6c15

区别是增加了两个slave worker进程,原来的sql thread变成了 coordinator。

 

第二节   测试和复现

2.1 创建测试数据

1,创建两个测试的database:slavetest,slavetest1

2,在这两个db中分布创建一张表test,向里面写入200w左右的测试数据

通过测试一些场景,通过其结果来反应一些问题,以下测试多是基于自建mysql进行

2.2 测试1

确认slave worker与db的在串行执行时对应关系,先打开一个session,分别执行

update slavetest.test set trade='slavetest';

update slavetest1.test set trade='slavetest1';

查看slave的slave worker状态,找到slavetest对应的slave worker

250de12139193c2cf3243f2f14f6c32307eec356

415ab02b4d15f19f3296cc6470f47580a731d2b7

8260139c77fa04b780d2f500f6c829890c5e8e5c

通过上面测试slavetest对应的slave worker的进程id为5812476

使用同样的方法,得出如下对应:

slavetest     5812476

slavetest1        5812475

这样单线程执行的时候,两个db在执行update更新时,coordinator都分配给了5812476的slave worker

2.3 测试2

确认slave worker与db的在并行执行时对应关系,同事打开2个session,每个session分别执行更新,中间间隔10s
update slavetest.test set trade='slavetest11';

update slavetest1.test set trade='slavetest22';

查看slave的slave worker状态,找到slavetest对应的slave worker(可以写一个脚本来循环执行show processlist监控)

0a19d5e44179efaa835733b0df98e36f8d6b54e8

5839a4b953a45aa7fd4a651c763de0ea54ace2bf

通过执行信息看,slavetest1的事务先完成,slavetest2的事务后完成,看下slave的进程信息:

93ad62e18f6540301315e128a4b5c61f62294327

f3fc005eff2f41a4817f04c14d166b3c7884e415

2988e97dc4812ef2c99d0498c86f335fdfbe3a4e

过滤后如下:

9df51f7679c7d9d3e611892cd3450481a27085a0

9e1c77581902c887880830562214be2618f3775e

aba24418a769a8384164b83fe794dcf7b565ea61

789806dae9267460f0c9cd8536b187cec9b3e6b8

86f1a98f44a3a0e13bcf93a53f4cca77b4e8090d

通过上面测试并不能在slave上执行完这两个事务的时候,保证一个slave worker完全对应其中的一个dbname(个人以为上一个事务里面,slave worker与db的对应是不会变的),暂且得出的结论是当并行执行两个db的事务的时候,其中的两个slave worker都产生了影响。

这样多线程执行的时候,两个db在执行update更新时,coordinator会把事务分配给两个slave worker同时并行执行,并且也出现了Waiting for Slave Worker to release partition,并且还出现了Waiting for Slave Worker queue,按照之前的描述,mysql假设数据是按照database来分布的,所以不会存在跨库的情况,下面进行事务跨库的测试

2.4 测试3

确认slave worker与db的在一个事务里跨库执行时对应关系,只打开1个session,执行:
begin;

update slavetest.test set trade='slavetest1';

update slavetest1.test set trade='slavetest2';

commit;

查看slave的slave worker状态,找到slavetest对应的slave worker(可以写一个脚本来循环执行show processlist监控)

6aecc4ff937f4ba61c0b97bac6901ab203075b5d

模拟一个事务内跨库执行更新,查看slave的进程信息:

d4f7e9c82554b2199f6b87a10ca8b0bd551d5f8d

b8e31e5ce9d7a9eae23e2941fb9eafadb83afc23


通过过滤的结果看,执行event的进程只有一个5812476,coordinator并没有分配给5812475的slave worker来执行,且也出现了Waiting for Slave Worker to release partition

 

通过测试和复现问题,Waiting for Slave Worker to release partition一般来说是一个正常的中间状态,但是也有可能出现问题,有一些特殊情况可以参考:

https://bugs.mysql.com/bug.php?id=73066

https://bugs.mysql.com/bug.php?id=72794

另外包括Waiting for Slave Worker queue,System lock等状态大部分也是正常的中间状态

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
Oracle 关系型数据库
Oracle expdp 导出数据遇到奇葩的快照过旧异常处理
expdp导库的时候,日志提示: ORA-31693: Table data object "YN01700_FRAME"."TAPAGEREVIEW" failed to load/unload and is being skipped due to error: ORA-02354: err.
3541 0
|
存储 缓存 监控
常用的mysql监控指标
常用的mysql监控指标
5943 0
|
机器学习/深度学习 PyTorch TensorFlow
深度学习工具和框架详细指南:PyTorch、TensorFlow、Keras
在深度学习的世界中,PyTorch、TensorFlow和Keras是最受欢迎的工具和框架,它们为研究者和开发者提供了强大且易于使用的接口。在本文中,我们将深入探索这三个框架,涵盖如何用它们实现经典深度学习模型,并通过代码实例详细讲解这些工具的使用方法。
1508 0
|
负载均衡 芯片 异构计算
NSDI'24 | 阿里云飞天洛神云网络论文解读——《LuoShen》揭秘新型融合网关 洛神云网关
NSDI‘24于4月16-18日在美国圣塔克拉拉市举办,阿里云飞天洛神云网络首次中稿NSDI,两篇论文入选。其中《LuoShen: A Hyper-Converged Programmable Gateway for Multi-Tenant Multi-Service Edge Clouds》提出超融合网关LuoShen,基于Tofino、FPGA和CPU的新型硬件形态,将公有云VPC设施部署到边缘机柜中,实现小型化、低成本和高性能。该方案使成本降低75%,空间占用减少87%,并提供1.2Tbps吞吐量,展示了强大的技术竞争力。
|
Oracle 关系型数据库 数据安全/隐私保护
在Oracle中,ORA-01017 invalid username password; logon denied原因有哪些
在Oracle中,ORA-01017 invalid username password; logon denied原因有哪些
4016 0
|
SQL 缓存 关系型数据库
MySQL 深潜 - Semijoin 丛林小道全览
作者深入内核讲述了 MySQL semijoin 从识别到优化器根据代价决定最优执行策略,以及执行方式的全过程,掌握 MySQL semijoin 这一篇就够了!
|
存储 SQL 关系型数据库
MySQL数据库——存储过程-介绍以及基本语法(特点、创建、调用、查看、删除、示例)
MySQL数据库——存储过程-介绍以及基本语法(特点、创建、调用、查看、删除、示例)
1977 0
|
关系型数据库 Linux API
Linux 内存管理新特性:Memory folios 解读
本文主要讲解folio ,极其在应用中的直接价值。
|
Prometheus 监控 Cloud Native
微服务框架(十九)Spring Boot 可视化监控 Prometheus + Grafana
  此系列文章将会描述Java框架Spring Boot、服务治理框架Dubbo、应用容器引擎Docker,及使用Spring Boot集成Dubbo、Mybatis等开源框架,其中穿插着Spring Boot中日志切面等技术的实现,然后通过gitlab-CI以持续集成为Docker镜像。   本文为Spring Boot 通过 micrometer 的监控门面,实现Prometheus + G...

热门文章

最新文章