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

本文涉及的产品
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 本文分享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等状态大部分也是正常的中间状态


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
7天前
|
关系型数据库 MySQL 编译器
MySQL主从复制
MySQL主从复制
7 0
|
8天前
|
SQL 关系型数据库 MySQL
MySQL高可用架构设计:从主从复制到分布式集群
MySQL高可用性涉及主从复制、半同步复制和Group/InnoDB Cluster。主从复制通过二进制日志同步数据,保证故障时可切换。半同步复制确保事务在至少一个从服务器确认后才提交。Group Replication是多主复制,支持自动故障切换。InnoDB Cluster是8.0的集成解决方案,简化集群管理。使用这些技术能提升数据库的稳定性和可靠性。
111 2
|
14天前
|
负载均衡 关系型数据库 MySQL
MySQL 主主复制与主从复制对比
MySQL的主主复制和主从复制是两种常见的数据库复制配置方式,各有优缺点和适用场景。以下是对这两种复制方式的详细对比: ### 主从复制 (Master-Slave Replication) **特点:** 1. **单向复制**:数据从主服务器复制到一个或多个从服务器。从服务器只能从主服务器接收数据更新,不能向主服务器发送数据。 2. **读写分离**:主服务器处理写操作(INSERT、UPDATE、DELETE),从服务器处理读操作(SELECT),可以分担读负载,提高系统的整体性能。 3. **数据一致性**:数据在主服务器上是最新的,从服务器上可能会有一定的延迟。 **优点:**
|
14天前
|
SQL 运维 关系型数据库
MySQL数据库运维第一篇(日志与主从复制)
MySQL数据库运维第一篇(日志与主从复制)
|
15天前
|
存储 关系型数据库 MySQL
Java大佬必知必会——MySQL主从复制
如果你现在有两台MySQL,一台版本是03年的MySQL5.0,另一台是18年的MySQL8.0.11。新版本可以作为老版本的从服务器,但反过来是不可行的。如果二进制文件包含了已存在的数据,就会造成数据重复了。如果从服务器复制该二进制文件后的数据库状态是混乱无序的,那整个复制的过程就没有意义了。如果主、从服务器存储数据的顺序不一样,就会导致每次执行删除的数据都是不同的。,老版本可能无法解析新版本的新特性,甚至复制的文件格式都差异太大。MySQL从库只会复制它本身缺失的最新数据,利用二进制文件里的。
112 3
Java大佬必知必会——MySQL主从复制
|
28天前
|
SQL 关系型数据库 MySQL
mysql从库SHOW SLAVE STATUS字段详解
mysql从库SHOW SLAVE STATUS字段详解
18 0
|
28天前
|
SQL 负载均衡 关系型数据库
mysql主从复制,从搭建到使用
mysql主从复制,从搭建到使用
30 1
|
28天前
|
SQL 监控 关系型数据库
探秘MySQL主从复制的多种实现方式
探秘MySQL主从复制的多种实现方式
15 0
|
1天前
|
SQL 存储 关系型数据库
MySQL数据库—初识数据库 | DDL语句 | DML语句
MySQL数据库—初识数据库 | DDL语句 | DML语句
|
1天前
|
Java 关系型数据库 MySQL
使用MySQL JDBC连接数据库
使用MySQL JDBC连接数据库