主从延迟调优思路

MySQL主从延迟的解决方案 之前项目中基于 MySQL 主从复制以及 AOP 的方式实现了读写分离,也写了博客记录了这个实现过程,《SpringBoot实现MySQL读写分离》。 既然配置了 MySQL 主从复制,那么自然会存在主从延迟,如何尽可能减小主从延迟对应用系统的影响是很有必要的思考点,我个人认为主从延迟的解决方案正是实现读写分离、MySQL 主从复制的精髓。 关于这个话题其实我之前就想着写篇博客分享一下,但一直没有提上日程。最近有读者在《SpringBoot实现MySQL读写分离》 这篇博客中留言问到了这个问题,这也激励我写 阅读详情

主从延迟调优思路

1、什么是主从延迟?

本质是从库的回放跟不上主库,回放阶段的延迟

file

2、主从延迟常见的原因有哪些?

1、大事务,从库回放时间较长,导致主从延迟

2、主库写入过于频繁,从库回放跟不上

3、参数配置不合理

4、主从硬件差异

5、网络延迟

6、表没有主键或者索引大量频繁的更新

7、一些读写分离的架构,从库的压力比较大

3、解决主从延迟有哪些方法

1、对于大事务,拆分成小事务

2、开启并行复制

3、升级从库硬件

4、尽量都有主键

4、什么是并行复制,参数有哪些?

回顾MySQL并行复制的路程

MySQL5.6 是基于数据库级别的并行复制

slave-parallel-type=DATABASE(不同库的事务,没有锁冲突)

file

MySQL5.7 基于group commit的并行复制

slave-parallel-type=LOGICAL_CLOCK : Commit-Parent-Based模式(同一组的事务[last-commit相同]没有锁冲突. 同一组,肯定没有冲突,否则没办法成为同一组)

上面是从库的配置,并行复制依赖于主库的组提交(注意区分组复制)

greatsql> show variables like '%group%delay%';
+-----------------------------------------+-------+
| Variable_name                           | Value |
+-----------------------------------------+-------+
| binlog_group_commit_sync_delay          | 0     |
| binlog_group_commit_sync_no_delay_count | 0     |
+-----------------------------------------+-------+
2 rows in set (0.01 sec)
  • binlog_group_commit_sync_delay:等待多少时间后才进行组提交

  • binlog_group_commit_sync_no_delay_count:等待多少个事务后才进行组提交

以上参数都依赖于主库业务繁忙的情况下,如果业务不频繁,就会很尴尬

  • binlog_group_commit_sync_no_delay_count:这个参数设置成2个

比如只有一个线程执行一个事务,第二个事务在24h之后执行,那么这个事务需要等待24h才能提交,十分坑

  • binlog_group_commit_sync_delay

假如设置成200ms,只有一个线程执行一个事务,本来10ms可以提交,还必须等待200ms才可以

线上一般是两个都设置,举个例子,就像是小船运人过河

假设我们的参数这么设置:

binlog_group_commit_sync_delay=200;
binlog_group_commit_sync_no_delay_count=2

要么满足200ms直接走,要么满足2个人直接走,这么人性化了很多,但是在业务不繁忙的情况下依然尴尬

file

MySQL8.0 基于write-set的并行复制

基于主键的冲突检测(binlog_transaction_depandency_tracking = COMMIT_ORDERE|WRITESET|WRITESET_SESSION, 修改的row的主键或非空唯一键没有冲突,即可并行)

事务检测算法:transaction_write_set_extraction = XXHASH64

MySQL会有一个变量来存储已经提交的事务HASH值,所有已经提交的事务所修改的主键(或唯一键)的值经过hash后都会与那个变量的集合进行对比,来判断改行是否与其冲突,并以此来确定依赖关系

这里说的变量,可以通过这个设置大小:binlog_transaction_dependency_history_size

这样的粒度,就到了 row 级别了,就是此时并行的粒度更加精细,并行的速度会更快,某些情况下,说slave的并行度超越master也不为过(master是单线程的写,slave也可以并行回放)

简单来说就是基于行去并行回放,rc级别下不同的行不会有锁冲突

组提交的表现:

看主库binlog的last_committed值是否一致,一致就可以并行回放,不一致只能串行

file

5、实战分析

5.1 查看线上主从延迟

Seconds_Behind_Master: 48828

可见延迟很高,接近14个小时,此时主库也在不断的写数据,大概是6分钟一个binlog,一个为500M

5.2 查看当前的复制配置

查看从库配置:

greatsql> show variables like '%slave%para%';
+------------------------+---------------+
| Variable_name      | Value     |
+------------------------+---------------+
| slave_parallel_type   | LOGICAL_CLOCK |
| slave_parallel_workers | 128      |
+------------------------+---------------+
2 rows in set (0.02 sec)

延迟现象:

从库一直在追,说明不是大事务,但是Seconds_Behind_Master延迟一直在增长

Retrieved_Gtid_Set: 00000000-0000-0024-0046-41a8003b4b99:242966351-253068975,
00000000-0000-0040-0095-5fff003b4b99:91056629-110569633,
00000000-0000-005c-0ced-7bae003b4b99:150292055-160253193,
31f4399f-ade5-11ed-a544-00163ebdeb51:1-12,
​      Executed_Gtid_Set: 00000000-0000-0024-0046-41a8003b4b99:1-252250235,
00000000-0000-0040-0095-5fff003b4b99:1-109120315,
00000000-0000-005c-0ced-7bae003b4b99:1-159504296,
31f4399f-ade5-11ed-a544-00163ebdeb51:1-12,
​        Auto_Position: 1

此时怀疑并没有并行复制,主库可能没设置组提交(只是一个猜想)

5.3 进一步验证,查看主库的binlog

查看主库的参数配置:还是为组提交的规则

greatsql> show variables like '%binlog_transac%';
+--------------------------------------------+----------+
| Variable_name                              | Value    |
+--------------------------------------------+----------+
| binlog_transaction_compression             | OFF      |
| binlog_transaction_compression_level_zstd  | 3        |
| binlog_transaction_dependency_history_size | 25000    |
| binlog_transaction_dependency_tracking     | WRITESET |
+--------------------------------------------+----------+
4 rows in set (0.02 sec)

再看其组提交的配置:表示没有开组提交

greatsql> show variables like '%group%delay%';
+-----------------------------------------+-------+
| Variable_name                           | Value |
+-----------------------------------------+-------+
| binlog_group_commit_sync_delay          | 0     |
| binlog_group_commit_sync_no_delay_count | 0     |
+-----------------------------------------+-------+
2 rows in set (0.01 sec)

进一步验证,看其binlog,发现果然last_committed都不一样,表示不能并行

file

5.4 主库设置参数,再次解析其binlog

将binlog_transaction_dependency_tracking改为WRITESET模式

greatsql> show variables like '%transaction%';
+----------------------------------------------------------+-----------------+
| Variable_name                                            | Value           |
+----------------------------------------------------------+-----------------+
| binlog_direct_non_transactional_updates                  | OFF             |
| binlog_transaction_compression                           | OFF             |
| binlog_transaction_compression_level_zstd                | 3               |
| binlog_transaction_dependency_history_size               | 25000           |
| binlog_transaction_dependency_tracking                   | WRITESET        |
| kill_idle_transaction                                    | 300             |
| performance_schema_events_transactions_history_long_size | 10000           |
| performance_schema_events_transactions_history_size      | 10              |
| replica_transaction_retries                              | 10              |
| session_track_transaction_info                           | OFF             |
| slave_transaction_retries                                | 10              |
| transaction_alloc_block_size                             | 8192            |
| transaction_allow_batching                               | OFF             |
| transaction_isolation                                    | REPEATABLE-READ |
| transaction_prealloc_size                                | 4096            |
| transaction_read_only                                    | OFF             |
| transaction_write_set_extraction                         | XXHASH64        |
+----------------------------------------------------------+-----------------+
17 rows in set (0.00 sec)

再次查看其binlog,看到有很多都可以并行回放

file

5.5 优化完成

即使主库在大批量的写入,但延迟正在慢慢缩减,追上只是时间问题,今天就是0了

file


Enjoy GreatSQL :)

关于 GreatSQL

GreatSQL是适用于金融级应用的国内自主开源数据库,具备高性能、高可靠、高易用性、高安全等多个核心特性,可以作为MySQL或Percona Server的可选替换,用于线上生产环境,且完全免费并兼容MySQL或Percona Server。

相关链接: GreatSQL社区 Gitee GitHub Bilibili

GreatSQL社区:

image

社区有奖建议反馈: https://greatsql.cn/thread-54-1-1.html

社区博客有奖征稿详情: https://greatsql.cn/thread-100-1-1.html

(对文章有疑问或者有独到见解都可以去社区官网提出或分享哦~)

技术交流群:

微信&QQ群:

QQ群:533341697

微信群:添加GreatSQL社区助手(微信号:wanlidbc )好友,待社区助手拉您进群。

MySQL5.7主从延迟高排查优化思路 MySQL主从同步高延迟问题排查与解决 问题描述:基于GTID的MySQL 5.7.32主从环境,出现从库同步延迟高达4784150秒,执行50-100万数据的DELETE语句耗时异常。 排查思路: 检查从库状态和事务,发现存在长时间运行的DELETE大事务 服务器资源监控显示CPU使用正常但磁盘IO异常 使用fio工具测试SSD磁盘性能,发现: 磁盘利用率达99.91%,接近满负荷 读取IOPS 6810,写入IOPS 2665 读取吞吐112MB/s,写入47.9MB/s 解决方案: 优化大事务处理 检 阅读详情

相关推荐

MySQL主从复制延迟原因及处理思路

MySQL主从复制延迟原因及处理思路 在异步或半同步的复制结构中,从库出现延迟是一件十分正常的事。 虽出现延迟正常,但是否需要关注,则一般是由业务来评估。 如:从库上有需要较高一致性的读业务,并且要求延迟小于某个值,那么则需要关注。 简单概述一下复制逻辑: 1、主库将对数据库实例的变更记录到binlog中。 2、主库会有线程实时监测binlog的变更并将这些新的events推给从库() 3、从库的...

HarveyH的博客 667

主从同步的延迟问题、原因及解决方案

MySQL主从延迟

Chen15968的博客 3572

主从同步的延迟问题解析及解决方案

主从同步是MySQL数据库中常用的数据复制机制,它允许将一台MySQL服务器(主服务器)上的数据实时复制到其他多台MySQL服务器(从服务器)。然而,在实际应用中,我们常常会遇到主从同步延迟的情况,即从服务器上的数据相对于主服务器有一定的时间差。不同的复制方式对主从同步延迟的影响不同,可以根据具体场景选择合适的复制方式来降低延迟。1.2 主服务器负载过高:如果主服务器的负载过高,例如处理大量的写入请求,就会导致主从同步延迟。可以将大事务拆分为较小的事务,或者采用批量提交的方式,减少对主从同步的影响。

VcyReact的博客 1082

MySQL主从同步延迟原因与解决方案

一、MySQL数据库主从同步延迟产生的原因 MySQL的主从复制都是单线程的操作,主库对所有DDL和DML产生的日志写进binlog,由于binlog是顺序写,所以效率很高。Slave的SQL Thread线程将主库的DDL和DML操作事件在slave中重放。DML和DDL的IO操作是随即的,不是顺序的,成本高很多。另一方面,由于SQL Thread也是单线程的,当主库的并发较高时,产生的DML数量超过slave的SQL Thread所能处理的速度,或者当slave中有大型query语句产生了锁等待那么延时

hsaxj的博客 9239

AI大模型开发——transformer模型超全完整版(0基础可懂)

为了更深入的了解transformer模型,我们首先从transformer的诞生聊起吧。transformer在2017年由Vaswani等人首次提出,它摒弃了之前流行的循环神经网络和卷积神经网络的架构,引入了自注意力机制( Self-Attention),显著提高了处理序列数据的能力和效率。transformer模型的这种设计使其在处理长距离依赖问题时, 相比于传统的循环神经网络和长短期记忆网络(LSTM)表现得更加出色,至此, 开启了NLP技术的新篇章。

m0_74922316的博客 2120

xilinx 暑期学校项目(二) 通过HLS实现二维傅里叶变换(2Dfft)及图像数据读入读出方法

要进行维纳滤波,首先就是要将图像矩阵通过二维fft变换到频域。 但是hls_fft.h中只有一维fft的函数,因此我们采用对行逐行进行一维fft,再对列逐行进行一维fft来实现二维fft的效果。 文章目录自带的fft例程二维fft的实现数据的读入和读出读入读出维纳滤波操作 自带的fft例程 自带的fft例程中包括有如下四个函数 void dummy_proc_fe( bool direction, config_t* config, cmpxData in[FFT_LENGTH],

战斗果冻的训练中心 2329

mysql主从延迟时间是多少_MySQL主从延迟

1. 主从同步的延迟的原因我们知道, 一个服务器开放N个链接给客户端来连接的, 这样有会有大并发的更新操作, 但是从服务器的里面读取binlog 的线程仅有一个, 当某个SQL在从服务器上执行的时间稍长 或者由于某个SQL要进行锁表就会导致,主服务器的SQL大量积压,未被同步到从服务器里。这就导致了主从不一致, 也就是主从延迟。2. 主从同步延迟的解决办法实际上主从同步延迟根本没有什么一招制敌的办...

weixin_33066433的博客 2227

基于RK3588与Gstreamer的端侧实时视频流AI推理系统构建

本文详细介绍了基于RK3588芯片与Gstreamer框架构建端侧实时视频流AI推理系统的完整方案。通过硬件选型、环境配置、OpenCV编译优化、视频流处理实战及模型部署等关键环节的深入解析,展示了如何利用RK3588的6TOPS NPU算力与Gstreamer的低延迟特性,实现工业质检、智能交通等场景下的高效边缘计算。特别针对RTSP推拉流优化、RKNN模型转换等核心技术难点提供了实用解决方案。

weixin_30516243的博客 381

MySQL调优实战:慢查询定位与索引优化的系统方法

数据库性能优化是保障业务稳定运行的关键环节,涉及从硬件架构到SQL写法的多个层面。理解MySQL的执行原理,尤其是慢查询日志与EXPLAIN执行计划,是定位性能瓶颈的基础。通过合理设计索引、优化SQL写法以及调整InnoDB关键参数,能够显著提升系统吞吐与响应速度。无论是高频交易系统、电商平台还是报表分析场景,都离不开对数据库查询路径的精细化管理。围绕常见性能问题,系统梳理从监控定位到参数调整的完整优化路径,帮助后端开发与运维人员高效提升MySQL运行效率。

weixin_31236101的博客 213

CentOS 7 安装 Python 3.10

我这里已经软链接了,正常未链接之前是python->python2.7而不是python3.10。python2.7默认安装是在 /usr/bin目录中,切换到/usr/bin/更改yum配置,因为其要用到python2才能执行,否则会导致yum不能正常使用。2. 安装 Python 3.10 必需的 openssl >= 1.1.1。默认的centos7是没有安装pip,先添加epel扩展源。/usr/bin/python 修改为如下。添加软链接,将原来的链接备份。添加python3的软链接。

bensonyang888的博客 2905

树莓派通过TTL3.3转485 Modbus采集水表

所需道具 树莓派0,我用的是树莓派zero wh; 具有光电直读功能的有线水表,我用的是咸鱼淘的埃美柯LXSY-20E1; TTL3.3 转 485模块,带隔离的贵些; 5V转12V升压模块。 原理 树莓派有UART(GPIO14 Tx 和 GPIO15 Rx)串口通讯功能,电器特性是3.3V TTL,直读远传水表支持M-Bus/485通讯接口,我买的光电直读水表485要求12V供电(根据仪表厂家说明书)。TTL和485虽然都是串口通讯,但电器特性不一样,不能直接接!我已经烧掉一个树莓派...

xhydongda的博客 3443

AliSQL实战:MySQL主从复制延迟诊断与内核优化

在数据库运维中,主从复制是保障高可用与读写分离的基石,然而复制延迟问题始终是DBA面临的核心挑战。理解MySQL复制原理,掌握从库回放机制,是定位延迟根源的基础。传统排查依赖瞬时状态,难以捕捉趋势,而基于指标采集与异常检测的诊断思路能更高效地识别瓶颈。无论是网络传输、大事务执行,还是单线程回放能力不足,都需要系统化的分析与优化策略。AliSQL作为MySQL的专业分支,通过增强并行复制调度、优化DDL处理及更细粒度的状态暴露,显著提升了从库回放吞吐。结合合理的参数调优,如调整并行worker数量与组提交策略

weixin_26905487的博客 339

告别糊涂账!用CKM3底表逻辑自建物料成本监控报表(含ABAP代码片段)

本文详细介绍了如何利用CKM3底表逻辑自建物料成本监控报表,解决标准报表无法穿透成本差异根源的问题。通过ABAP代码片段和四步架构法,帮助财务团队精准分析成本构成,优化成本核算批量处理,实现多维透视差异分析,提升成本监控效率。

weixin_30740295的博客 267

JVM调优-调优原则与思路

一、实施过程中的原则 在调优之前,我们需要记住下面的原则: 1、在应用上线之前,先考虑将机器的JVM参数设置到最优(最适合)。 2、多数导致GC问题的Java应用,都不是因为我们参数设置错误,而是代码问题。同时多数的Java应用不需要在服务器上进行GC优化。 3、减少使用全局变量和大对象,同时注意减少创建对象的数量;这也是Spring框架单例模式的一个优点。 4、在实际使用中,分析GC情况优化代码比优化GC参数要多得多,GC优化往往是最后的手段; ...

Simon111Qiu的博客 4145

【DRAM存储器二】Sense Amplifier

详述DRAM颗粒中感应放大器功能、电路结构、工作原理和操作波形

highman110的博客 7201

Qt界面美化-飞扬青云自绘控件插件的使用-避免采坑

1、先上一个集成到QtCreater中的效果图: 2、飞扬青云自绘控件插件下载地址:https://gitcode.net/mirrors/feiyangqingyun/qucsdk?utm_source=csdn_github_accelerator 3、集成插件到QtCreater中的方法: (1)、查看自己使用的QtCreater的版本信息,我的:Qt 5.15.2 MSVC2019 64位 (2)插件下载下来后工程预览: 我选择msvc版本的SDK,打开找到匹配的SDK:...

小米的修行之路 2792

Tomcat 性能调优思路

Tomcat 性能调优是一个系统性的工程,需要从硬件资源、操作系统配置、Tomcat 本身的设置、JVM 参数、应用程序优化以及持续的监控与分析等多个层面入手。通过综合运用上述调优思路,结合实际业务需求和应用场景,能够显著提升 Tomcat 的性能和稳定性,确保应用在高并发和大流量环境下依然高效运行。在性能调优过程中,建议采用循序渐进的方法,逐步调整和测试每一项参数,避免一次性大规模修改导致不可预期的问题。同时,保持良好的监控和日志记录习惯,有助于及时发现和解决性能瓶颈,提升整体系统的可靠性和用户体验。

GDL_MPY的博客 2546

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

JVM调优,基本思路是什么

jvm调优主要是针对垃圾收集器的收集性能优化,令运行在虚拟机上的应用能够使用更少的内存以及延迟获取更大的吞吐量。 1、性能定义 要查找和评估器性能瓶颈,首先要知道性能定义,对于jvm调优来说,我们需要知道以下三个定义属性,依作为评估基础: 吞吐量:重要指标之一,是指不考虑垃圾收集引起的停顿时间或内存消耗,垃圾收集器能支撑应用达到的最高性能指标。 延迟:其度量标准是缩短由于垃圾啊收集引起的停顿时间或...

乐乐的博客 3425

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

谈谈jvm的调优思路

本文介绍了JVM调优的实践方法,包括四大监控指标(内存使用、GC频率、线程状态、类加载)和常见性能问题类型(频繁GC、停顿时间长、OOM等)。详细讲解了G1、CMS等垃圾回收器的特点及适用场景,并提供了推荐JVM参数配置。通过SpringBoot实战案例,演示了如何通过参数调整和代码优化(如使用StringBuilder替代字符串拼接)显著降低GC停顿时间(从180ms降至60ms),消除FullGC,提升接口响应速度(平均RT降低75%)。文章强调JVM调优应遵循"观测→分析→调整→验证&quo

weixin_50055999的博客 1766

谈谈你的GC调优思路?

我发现,目前不少外部资料对G1的介绍大多还停留在JDK 7或更早期的实现,很多结论已经存在较大偏差,甚至一些过去的GC选项已经不再推荐使用。所以,今天我会选取新版JDK中的默认G1 GC作为重点进行详解,并且我会从调优实践的角度,分析典型场景和调优思路。下面我们一起来更新下这方面的知识。今天我要问你的问题是,谈谈你的GC调优思路?

qq_33240556的博客 1246

JVM调优思路

一篇文章让你通关jvm调优

zhiyuanIT的专栏 987

谈谈你的GC调优思路

我发现,目前不少外部资料对 G1 的介绍大多还停留在 JDK 7 或更早期的实现,很多结论已经存在较大偏差,甚至一些过去的 GC 选项已经不再推荐使用。所以,今天我会选取新版 JDK 中的默认 G1 GC 作为重点进行详解,并且我会从调优实践的角度,分析典型场景和调优思路。下面我们一起来更新下这方面的知识。今天我要问你的问题是,谈谈你的 GC 调优思路?典型回答谈到调优,这一定是针对特定场景、特定目的的事情, 对于 GC 调优来说,首先就需要清楚调优的目标是什么?从性能的角度看,通常关注三个方面,内存占用(

TimeFriends 636

数据库主从延迟导致查询不准确的解决思路

【前言】 当数据达到一定量的时候,数据库会成为整个系统的瓶颈,一般采取的优化策略为读写分离,数据库通过分主库从库从而实现读写分离(写请求操作主库,读请求操作从库); 【解决数据延迟思路】 一、主从同步原理(在此以目前最普及的MySQL为例) 以下是一张经典的MySQL通过binlog实现主从数据同步的原理图: ...

通往精英的成长之路 6710

Redis主从复制高延迟问题解决思路

通过以上综合性的优化措施,可以有效解决短视频评论系统中欧洲用户遇到的高延迟问题,提升整体用户体验。

weixin_43290370的博客 1454

Linux 的性能调优的思路

更多Python学习内容:ipengtao.com在管理和维护 Linux 系统时,性能调优是一个至关重要的任务。优化系统性能可以提高系统的稳定性、响应速度和资源利用率,从而更好地满足用户和应用的需求。本文将探讨 Linux 的性能调优思路,包括识别瓶颈、优化关键资源、调整系统参数等方面,并提供丰富的示例代码,以帮助管理员更好地进行性能优化。识别性能瓶颈在进行性能调优之前,首先需要识别系统中的性能...

GitHub_miao的博客 503
上一篇: 从库延迟案例分析
下一篇: GreatSQL优化技巧:半连接(semijoin)优化
GreatSQL社区
博客等级 码龄5年 1210粉丝 390原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值