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

简介: 本文分享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 
相关文章
|
9月前
|
canal 关系型数据库 MySQL
Canal是怎么伪装成 MySQL slave?
Canal是怎么伪装成 MySQL slave?
10093 41
|
10月前
|
SQL 网络协议 关系型数据库
MySQL 主从复制
主从复制是 MySQL 实现数据冗余和高可用性的关键技术。主库通过 binlog 记录操作,从库异步获取并回放这些日志,确保数据一致性。搭建主从复制需满足:多个数据库实例、主库开启 binlog、不同 server_id、创建复制用户、从库恢复主库数据、配置复制信息并开启复制线程。通过 `change master to` 和 `start slave` 命令启动复制,使用 `show slave status` 检查同步状态。常见问题包括 IO 和 SQL 线程故障,可通过重置和重新配置解决。延时原因涉及主库写入延迟、DUMP 线程性能及从库 SQL 线程串行执行等,需优化配置或启用并行处理
257 40
|
10月前
|
关系型数据库 MySQL 数据库
RDS用多了,你还知道MySQL主从复制底层原理和实现方案吗?
随着数据量增长和业务扩展,单个数据库难以满足需求,需调整为集群模式以实现负载均衡和读写分离。MySQL主从复制是常见的高可用架构,通过binlog日志同步数据,确保主从数据一致性。本文详细介绍MySQL主从复制原理及配置步骤,包括一主二从集群的搭建过程,帮助读者实现稳定可靠的数据库高可用架构。
586 9
RDS用多了,你还知道MySQL主从复制底层原理和实现方案吗?
|
10月前
|
SQL 存储 关系型数据库
MySQL主从复制 —— 作用、原理、数据一致性,异步复制、半同步复制、组复制
MySQL主从复制 作用、原理—主库线程、I/O线程、SQL线程;主从同步要求,主从延迟原因及解决方案;数据一致性,异步复制、半同步复制、组复制
1124 11
|
关系型数据库 MySQL 数据库
docker高级篇(大厂进阶):安装mysql主从复制
docker高级篇(大厂进阶):安装mysql主从复制
295 24
|
12月前
|
NoSQL 关系型数据库 Redis
《docker高级篇(大厂进阶):1.Docker复杂安装详说》包括:安装mysql主从复制、安装redis集群
《docker高级篇(大厂进阶):1.Docker复杂安装详说》包括:安装mysql主从复制、安装redis集群
337 14
|
存储 关系型数据库 MySQL
MySQL主从复制原理和使用
本文介绍了MySQL主从复制的基本概念、原理及其实现方法,详细讲解了一主两从的架构设计,以及三种常见的复制模式(全同步、异步、半同步)的特点与适用场景。此外,文章还提供了Spring Boot环境下配置主从复制的具体代码示例,包括数据源配置、上下文切换、路由实现及切面编程等内容,帮助读者理解如何在实际项目中实现数据库的读写分离。
1471 1
MySQL主从复制原理和使用
|
SQL 关系型数据库 MySQL
Mysql中搭建主从复制原理和配置
主从复制在数据库管理中广泛应用,主要优点包括提高性能、实现高可用性、数据备份及灾难恢复。通过读写分离、从服务器接管、实时备份和地理分布等机制,有效增强系统的稳定性和数据安全性。主从复制涉及I/O线程和SQL线程,前者负责日志传输,后者负责日志应用,确保数据同步。配置过程中需开启二进制日志、设置唯一服务器ID,并创建复制用户,通过CHANGE MASTER TO命令配置从服务器连接主服务器,实现数据同步。实验部分展示了如何在两台CentOS 7服务器上配置MySQL 5.7主从复制,包括关闭防火墙、配置静态IP、设置域名解析、配置主从服务器、启动复制及验证同步效果。
425 0
Mysql中搭建主从复制原理和配置
|
3月前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
162 3
|
3月前
|
关系型数据库 MySQL 数据库
自建数据库如何迁移至RDS MySQL实例
数据库迁移是一项复杂且耗时的工程,需考虑数据安全、完整性及业务中断影响。使用阿里云数据传输服务DTS,可快速、平滑完成迁移任务,将应用停机时间降至分钟级。您还可通过全量备份自建数据库并恢复至RDS MySQL实例,实现间接迁移上云。

推荐镜像

更多