多从库时半同步复制不工作的BUG分析

MySQL半同步复制源码解析 / 观察者模式,调用 Binlog_storage_observer 里面的repl_semi_report_binlog_update函数,将当前的 binlog 文件和最新的 pos 点记录到 active_tranxs_ 列表中。// 找到观察器调用, 这是是观察者模式。// 遍历 active_tranxs_ 活跃的事务链表, 找到大于等于 trx_wait_binlog_name 和 trx_wait_binlog_pos。其他 sync 队列。 阅读详情

作者:胡呈清、黄炎

阅读原文


问题描述

MySQL版本:5.7.16,5.7.17,5.7.21

存在多个半同步从库时,如果参数 rpl_semi_sync_master_wait_for_slave_count=1,启动第1个半同步从库时可以正常启动,启动第2个半同步从库后有很大概率 slave_io_thread 停滞(复制状态正常,Slave_IO_Running: Yes,Slave_SQL_Running: Yes,但是完全不同步主库 binlog )


复现步骤

1. 主库配置参数如下:


2. 启动从库A的半同步复制 start slave,查看从库A复制正常

3. 启动从库B的半同步复制 start slave,查看从库B,复制线程正常,但是不同步主库 binlog


分析过程
首先弄清楚这个问题 ,需要先结合MySQL其他的一些状态信息,尤其是主库的 dump 线程状态来进行分析:

1. 从库A启动复制后,主库的半同步状态已启动:


再看主库的 dump 线程,也已经启动:


再看主库的 error log,也显示 dump 线程(21824)启动成功,其启动的半同步复制:


2. 从库B启动复制后,主库的半同步状态,还是只有1个半同步从库 Rpl_semi_sync_master_clients=1:


再看主库的 dump 线程,这时有3个 dump 线程,但是新起的那两个一直为 starting 状态:



再看主库的 error log,21847 这个新的 dump 线程一直没起来,直到1分钟之后从库 retry ( Connect_Retry 和 Master_Retry_Count 相关),主库上又启动了1个 dump 线程 21850,还是起不来,并且 21847 这个僵尸线程还停不掉:


3. 到这里我们可以知道,从库B  slave_io_thread 停滞的根本原因是因为主库上对应的 dump 线程启动不了。

如何进一步分析线程调用情况?推荐使用 gstack 或者 pstack(实为gstack软链)来查看线程调用栈,其用法很简单:gstack <process-id>

4. 看主库的 gstack,可以看到 24102 线程(旧的复制 dump 线程)堆栈:


可以看到 24966 线程(新的复制 dump 线程)堆栈:


两线程都在等待 Ack_Receiver 的锁,而线程 21875 在持有锁,等待select:


理论上 select 不应hang, Ack_receiver 中的逻辑也不会死循环,请教公司大神黄炎进行一波源码分析。


5.  semisync_master_ack_receiver.cc 的以下代码形成了对互斥锁的抢占, 饿死了其他竞争者:


在 mysql_mutex_unlock 调用后,应适当增加其他线程的调度机会。
试验: 在 mysql_mutex_unlock 调用后增加 sched_yield();,可验证问题现象消失。


结论:
从库 slave_io_thread 停滞的根本原因是主库对应的 dump thread 启动不了;

rpl_semi_sync_master_wait_for_slave_count=1 时,启动第一个半同步后,主库 ack_receiver 线程会不断的循环判断收到的 ack 数量是否 >= rpl_semi_sync_master_wait_for_slave_count,此时判断为 true,ack_receiver基本不会空闲一直持有锁。此时启动第2个半同步,对应主库要启动第2个 dump thread,启动 dump thread 要等待 ack_receiver 锁释放,一直等不到,所以第2个 dump thread 启动不了。

相信各位DBA同学看了后会很震惊,“什么?居然还有这样的bug...”,这里要说明一点,这个bug 触发是有几率的,但是几率又很大。这个问题已经由我司大神在1月份提交了 bug 和 patch:https://bugs.mysql.com/bug.php?id=89370,加上本人提交SR后时不时的催一催,昨天官方终于确认将修复在 5.7.23(官方最终另有修复方法,没采纳这个 patch,期待我司大神下期分析官方的修复代码)。

最后或许会有疑问“既然是概率,有没有办法降低概率呢?”,尤其是不具备及时升级版本条件的同学,欢迎评论区留言讨论~


如何实现 MySQL 的读写分离?MySQL 主从复制原理是啥? 面试题 你有没有做 MySQL 读写分离?如何实现 MySQL 的读写分离?MySQL 主从复制原理的是啥?如何解决 MySQL 主从同步的延时问题? 考点分析 高并发这个阶段,肯定是需要做读写分离的,啥意思?因为实际上大部分的互联网公司,一些网站,或者是 app,其实都是读多写少。所以针对这个情况,就是写一个主库,但是主库挂多个从库,然后从多个从库来读,那不就可以支撑更高的读并发压力了吗? 面试题剖析 如何实现 MySQL 的读写分离? 其实很简单,就是基于主从复制架构,简单来说,就搞一个主库 阅读详情

相关推荐

Java面试突击(7):读写分离

目录 1、Mysql读写分离 1、Mysql读写分离 1.1、有没有做MySQL读写分离?如何实现mysql的读写分离?MySQL主从复制原理的是啥?如何解决mysql主从同步的延时问题? 1.2、面试官心里分析 高并发这个阶段,肯定是需要做读写分离的,因为实际上大部分的互联网公司,一些网站,或者是app,其实都是读多写少。所以针对这个情况,就是写一个主库,但是主库挂多个从库,然后从多个从库来读,那不就可以支撑更高的读并发压力了吗? 1.3、面试题剖析 (1)如何实现mysql...

mingyuli的博客 228

semi-sync插件崩溃导致MySQL重启故障详析

导读 semi-sync插件崩溃导致MySQL重启的故障分析全过程~ 作者:刘安 现为爱可生高级测试工程师,拥有丰富的自动测试开发经验;曾先后在文思海辉、Splunk担任测试工程师。 一、起因: 在公司测试MySQL高可用组件时发现一个异常。如下: 停止从库,高可用组件将从库自动启动后,主库发生了重启。然而,正常情况下,主库不应发生重启。 二、

老叶茶馆 1704

磁盘I/O %util特别高

磁盘I/O %util特别高

eagle89的专栏 3088

半同步复制中可能出现的异常情况以及应该如何应对?

文章目录半同步复制如何应对各种异常情况?一、准备知识事务提交会经历哪些阶段何为半同步复制二、可能出现哪些异常以及如何解决master 在flush binlog之前宕机master 在flush binlog 之后,send binlog之前宕机master 在send binlog之后,收到ack之前宕机 半同步复制如何应对各种异常情况? 全篇以MySQL-5.7 after_sync模式半同...

sunashe的个人随笔 1179

《iOS之一起进大厂》系列-秒杀面试官的RunLoop底层原理面试题

Runloop是iOS面试中的必考题,不管大厂小厂都会问到。 这里包括了Runloop几乎所有的面试题,还有中肯完整的答案解释。

空杯子 1151

多尺度Transformer+特征融合新范式,算力减半精度猛增

在大模型时代,多尺度特征融合与Transformer架构的结合正成为研究热点。多尺度特征融合能够捕捉数据在不同尺度上的关键信息,而Transformer架构凭借其强大的并行处理能力和对长距离依赖的建模能力,为复杂数据处理提供了新的思路。这种结合在处理多模态数据时展现出巨大潜力。

Tulingxueshu的博客 1057

问题分析 | 为什么主库Waiting for semi-sync ACK from slave会阻塞set global super_read_only=ON的执行

在 MDL 中 MDL_KEY 按照 namespace+DB+OBJECT_NAME 的方式进行表示,所谓的 namespace 也比较重要,调用 Global_read_lock::lock_global_read_lock 函数的其他位置与事务提交没太大关系,应与此无关。申请的 S 模式的 MDL_key::GLOBAL 锁,查阅手册(二、如果主库执行的是事务型的语句,比如。进程,之后在主库执行的新事务会处于。锁,S 模式,这两种模式是冲突的,状态的事务还未提交,也就未释放。

dbkernel 的博客 1996

CloudCompare点云变换保姆级教程:从平移、旋转到绕任意点旋转,一次搞定

本文提供CloudCompare点云变换的全面教程,涵盖从基础平移、旋转到绕任意点旋转的高级技巧。通过详细的操作步骤和实战案例,帮助用户掌握点云数据处理的核心技能,提升三维模型对齐和变换的效率与精度。

weixin_28717969的博客 289

mysql分布式实践 - 主从半同步复制

Mysql主从半同步复制 这里也是一系列的配置,结合原理才能了解主从半同步复制到底做了一件什么事。 1、mysql复制原理

BeALittleCat的专栏 545

SAP UI5 控件剖析系列之 sap.m.DatePicker:单日选择的工程化用法、最佳实践与常见坑

在 SAP UI5 的输入控件族里,是最常被使用的日期选择控件。它把一个可编辑的输入框与一个弹出的日历整合在一起,允许用户用触摸、鼠标或键盘在本地化格式下选择某一天;控件既可以从弹出的日历里点选,也可以直接在输入框里键入日期。官方 Fiori 设计规范对它的定位就是:完成单个日期的选择,不牵涉时间,也不负责跨天的范围选择。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 342

【ArcGIS Pro微课1000例】0067:ArcGIS Pro3.4.2学习版下载及安装教程

【ArcGIS Pro微课1000例】0067:ArcGIS Pro3.4.2学习版网盘下载及安装教程

智慧空间实验室 2384

深度分析 | 多从库时半同步复制不工作的BUG分析

原创作者:胡呈清 黄炎 前 言 本文是由爱可生运维团队出品的「MySQL专栏」系列文章,内容来自于运维团队一线实战经验,涵盖MySQL各种特性的实践,优化案例,数据库架构,HA,监控等,有扫雷功效。 爱可生开源社区持续运营维护的小目标: 每周至少推送一篇高质...

chiweiliu4439的博客 233

C# WinForm上位机:从串口调试工具到智能温控系统(Modbus RTU协议实战+完整源码)

做工业上位机开发时,我们常从串口调试工具入手:验证设备通信、查看数据帧,但面对实际场景(比如温控、电机控制),单纯的“收发数据”远远不够——需要解析工业标准协议(如Modbus RTU)、实时监控关键指标、实现自动化控制逻辑,还要有稳定的UI交互和数据记录。串口调试工具能收发数据,但看不懂Modbus RTU帧(地址、功能码、寄存器、CRC校验);想控制温控设备(如加热器、风扇),但不知道如何通过Modbus写入控制指令;手动调节目标温度时,温度波动大,需要PID算法实现精准控温,但不会集成;

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1300

note同步不及时 one_深度分析 | 多从库时半同步复制不工作的BUG分析

前 言本文是由爱可生运维团队出品的「MySQL专栏」系列文章,内容来自于运维团队一线实战经验,涵盖MySQL各种特性的实践,优化案例,数据库架构,HA,监控等,有扫雷功效。爱可生开源社区持续运营维护的小目标:每周至少推送一篇高质量技术文章每月研发团队发布开源组件新版每年1024开源一款企业级组件2019年至少25场社区活动欢迎大家持续关注~ 问题描述MySQL版本:5.7.16,5.7...

weixin_39772566的博客 160

数字逻辑Fundamentals of Digital Logic with Verilog Design | 3rd Edition Solutins Chapter 3(step by step)

第三章3-1~3-27全部习题解析和代码模块

weixin_62651190的博客 1946

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

第 52 期:MySQL 半同步复制频繁报错

配置问题原因:MySQL 的半同步复制配置不当,导致超时设置过短。解决方法:检查半同步复制相关的配置参数,例如 rpl_semi_sync_master_timeout,适当增加超时时间。网络延迟或不稳定原因:主从服务器之间的网络不稳定会导致 binlog 传输延迟或丢失。解决方法:检查和优化网络连接,确保主从服务器之间的网络稳定性。从服务器负载过高原因:从服务器的负载过高,无法及时处理主服务器发送的 binlog。解决方法:检查从服务器的性能,可能需要增加资源或优化查询。

ActionTech的博客 1242

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

MySQL 5.7 Replication 相关新功能说明

背景: MySQL5.7在主从复制上面相对之前版本多了一些新特性,包括多源复制、基于组提交的并行复制、在线修改Replication Filter、GTID增强、半同步复制增强等。因为都是和复制相关,所以本文将针对这些新特性放一起进行说明,篇幅可能稍长,本文使用的MySQL版本是5.7.13。 1,多源复制(多主一从) MySQL在5.7之后才支持多源复制,之前介绍过MariaDB 多...

eagle89的专栏 317

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

__MySQL 5.7 Replication 相关新功能说明

背景: MySQL5.7在主从复制上面相对之前版本多了一些新特性,包括多源复制、基于组提交的并行复制、在线修改Replication Filter、GTID增强、半同步复制增强等。因为都是和复制相关,所以本文将针对这些新特性放一起进行说明,篇幅可能稍长,本文使用的MySQL版本是5.7.13。 1,多源复制(多主一从) MySQL在5.7之后才支持多源复制,之前...

weixin_30654419的博客 171

Semi synchronous replication

目标 主库宕机不丢数据(Master Failover without data loss) facebook有两篇不错的文章: 2015/01: performance-issues-and-fixes-mysql-56 2014/04: semi-synchronous-replication-at-facebook 1. Loss Less Semis...

weixin_30819085的博客 197

MySQL 主从同步延时问题与解决方案

一、面试题 你们有没有做 MySQL 读写分离?如何实现 MySQL 的读写分离?MySQL 主从复制原理的是啥?如何解决 MySQL 主从同步的延时问题? 二、面试官心理分析 高并发这个阶段,肯定是需要做读写分离的,啥意思?因为实际上大部分的互联网公司,一些网站,或者是 app,其实都是读多写少。所以针对这...

小健健的博客 407

深度解析MySQL 主从复制原理 如何解决 MySQL读写分离的延时问题?

深度解析MySQL 主从复制原理 如何解决 MySQL读写分离的延时问题?   面试题 你们有没有做 MySQL 读写分离?如何实现 MySQL 的读写分离?MySQL 主从复制原理的是啥?如何解决 MySQL 主从同步的延时问题? 面试官心理分析 高并发这个阶段,肯定是需要做读写分离的,啥意思?因为实际上大部分的互联网公司,一些网站,或者是 app,其实都是读多写少。所以针对这个情...

wenlin_xie的专栏 505

分库分表的面试题5

1、面试题 你们有没有做MySQL读写分离?如何实现mysql的读写分离?MySQL主从复制原理的是啥?如何解决mysql主从同步的延时问题? 2、面试官心里分析 这个,高并发这个阶段,那肯定是需要做读写分离的,啥意思?因为实际上大部分的互联网公司,一些网站,或者是app,其实都是读多写少。所以针对这个情况,就是写一个主库,但是主库挂多个从库,然后从多个从库来读,那不...

weixin_33806300的博客 1729

mysql主从简单原理分析

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34365635的博客 185
上一篇: MySQL瓶颈分析与优化
下一篇: 最新资讯 | 爱可生@MySQL技术沙龙 · 成都站
爱可生开源社区
博客等级 码龄8年 1936粉丝 1004原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值