Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >主从延迟调优思路

主从延迟调优思路

作者头像
GreatSQL社区
发布于 2024-04-18 12:04:49
发布于 2024-04-18 12:04:49
1680
举报

* GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。 1、什么是主从延迟? 本质是从库的回放跟不上主库,回放阶段的延迟

2、主从延迟常见的原因有哪些? 1、大事务,从库回放时间较长,导致主从延迟 2、主库写入过于频繁,从库回放跟不上 3、参数配置不合理 4、主从硬件差异 5、网络延迟 6、表没有主键或者索引大量频繁的更新 7、一些读写分离的架构,从库的压力比较大 3、解决主从延迟有哪些方法 1、对于大事务,拆分成小事务 2、开启并行复制 3、升级从库硬件 4、尽量都有主键 4、什么是并行复制,参数有哪些? 回顾MySQL并行复制的路程 MySQL5.6 是基于数据库级别的并行复制 slave-parallel-type=DATABASE(不同库的事务,没有锁冲突)

MySQL5.7 基于group commit的并行复制 slave-parallel-type=LOGICAL_CLOCK : Commit-Parent-Based模式(同一组的事务[last-commit相同]没有锁冲突. 同一组,肯定没有冲突,否则没办法成为同一组) 上面是从库的配置,并行复制依赖于主库的组提交(注意区分组复制)

代码语言:text
AI代码解释
复制
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个人直接走,这么人性化了很多,但是在业务不繁忙的情况下依然尴尬

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值是否一致,一致就可以并行回放,不一致只能串行

5、实战分析 5.1 查看线上主从延迟 Seconds_Behind_Master: 48828 可见延迟很高,接近14个小时,此时主库也在不断的写数据,大概是6分钟一个binlog,一个为500M 5.2 查看当前的复制配置 查看从库配置:

代码语言:text
AI代码解释
复制
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延迟一直在增长

代码语言:text
AI代码解释
复制
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 查看主库的参数配置:还是为组提交的规则

代码语言:text
AI代码解释
复制
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)

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

代码语言:text
AI代码解释
复制
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都不一样,表示不能并行

5.4 主库设置参数,再次解析其binlogbinlog_transaction_dependency_tracking改为WRITESET模式

代码语言:text
AI代码解释
复制
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,看到有很多都可以并行回放

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

Enjoy GreatSQL :)

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-04-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 GreatSQL社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MySQL复制从库延迟优化思路
2、主从延迟常见的原因有哪些? 1、大事务,从库回放时间较长,导致主从延迟 2、主库写入过于频繁,从库回放跟不上 3、参数配置不合理 4、主从硬件差异 5、网络延迟 6、表没有主键或者索引大量频繁的更新 7、一些读写分离的架构,从库的压力比较大 3、解决主从延迟有哪些方法 1、对于大事务,拆分成小事务 2、开启并行复制 3、升级从库硬件 4、尽量都有主键 4、什么是并行复制,参数有哪些? 先回顾MySQL并行复制的路程 a. MySQL5.6 是基于数据库级别的并行复制 slave-parallel-type=DATABASE(不同库的事务,没有锁冲突)
老叶茶馆
2024/05/09
5360
MySQL复制从库延迟优化思路
MySQL复制从库延迟原因深入分析
* GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。 背景介绍 近来一套业务系统,从库一直处于延迟状态,无法追上主库,导致业务风险较大。 从资源上看,从库的CPU、IO、网络使用率较低,不存在服务器压力过高导致回放慢的情况;从库开启了并行回放;在从库上执行 SHOW PROCESSLIST 看到没有回放线程阻塞,回放一直在持续;解析relay log日志文件,发现其中并没大事务回放。 过程分析 现象确认 收到运维同事的反馈,有一套从库延迟的非常厉害,提供了SHOW SLAVE STATUS延迟的截图信息
老叶茶馆
2024/05/08
2480
MySQL复制从库延迟原因深入分析
从库延迟案例分析
持续观察了一阵show slave status的变化,发现pos点位信息在不停的变化,Seconds_Behind_master也是不停的变化的,总体趋势还在不停的变大。 资源使用 观察了服务器资源使用情况,可以看到占用非常低
GreatSQL社区
2024/04/12
1300
从库延迟案例分析
由MySQL复制延迟说起
相信 slave 延迟是MySQL dba 遇到的一个老生长谈的问题了。我们先来分析一下slave延迟带来的风险
用户1278550
2019/04/25
1.4K0
由MySQL复制延迟说起
由MySQL复制延迟说起
杨奇龙,网名“北在南方”,7年DBA老兵,目前任职于杭州有赞科技DBA,主要负责数据库架构设计和运维平台开发工作,擅长数据库性能调优、故障诊断。
田帅萌
2019/05/13
1.1K0
由MySQL复制延迟说起
Mysql并行复制实践总结
一般Mysql主从复制有三个线程参与,都是单线程:Binlog Dump(主) -> IO Thread (从) -> SQL Thread(从)。
mingjie
2022/05/12
1.5K0
Mysql并行复制实践总结
MySQL拾遗-关于MySQL主从复制的数据同步延迟问题
这种主从复制环境在单机应用的时候没有问题,但是在实际的生产环境中,会存在复制延迟的问题。
行百里er
2020/12/03
1.1K0
MySQL拾遗-关于MySQL主从复制的数据同步延迟问题
mysql主从复制延迟问题记录
DML(data manipulation language):数据操纵语句,用于添加、删除、更新和查询数据库记录,并检查数据完整性,常用的语句有select、update、insert、delete
dogfei
2020/07/31
1.1K0
mysql复制系列5-多线程复制
mysql复制中最常见的问题就是主从复制延迟问题,mysql从一开始不支持并行复制,到一步一步的优化改进多线程复制,下面介绍一下mysql复制单线程到多线程复制的历程
wangwei-dba
2021/05/14
1.3K0
26 | 备库为什么会延迟好几个小时?
如果备库执行日志的速度持续低于主库生成日志的速度,那这个延迟就有可能成了小时级别。而且对于一个压力持续比较高的主库来说,备库很可能永远都追不上主库的节奏。
HaC
2020/12/30
5430
26 | 备库为什么会延迟好几个小时?
MySQL5.6版本的并行复制策略
MySQL5.6版本支持了并行复制,只是支持的粒度是按库并行。用于决定分发策略的hash表里,key是数据库名
用户8639654
2021/08/11
9700
MySQL 8.0复制性能的提升
MySQL复制从问世到现在已经经历了多个年头,它的稳定性和可靠性也在稳步的提高。这是一个不停进化的过程,由于MySQL的很多重要功能都是依赖于复制,所以复制的快速发展也是很容易理解的。
星哥玩云
2022/08/13
1.1K0
MySQL 8.0复制性能的提升
Xtrabackup在线搭建备库与并行复制延迟
为了兼容 MySQL 5.6 基于库的并行复制,5.7 引入了新的变量 slave-parallel-type,其可以配置的值有:
mingjie
2022/05/12
4850
Xtrabackup在线搭建备库与并行复制延迟
MySql主从复制
在MySql的生产环境中,由于单台MySql不能满足高可用性需求,一般通过主从复制(Master-Slave)方式同步数据,再通过读写分离(MySql-Proxy)来提升数据库并发负载能力。
春哥大魔王
2020/07/14
2.4K0
MySQL 8 复制(六)——拓扑与性能
可以在任意个主从库之间建立复杂的复制拓扑结构,如普通的一主一(多)从、双(多)主复制、级联复制,MySQL 5.7.2后新增的多源复制,特殊场景下使用的Blackhole引擎与日志服务器等等。复制中的MySQL服务器须要遵循以下基本原则:
用户1148526
2019/07/11
1.9K0
MySQL 8 复制(六)——拓扑与性能
MySQL5.7并发复制演进
MySQL5.5及以前的复制 一般主从复制有三个线程且都是单线程: Binlog Dump(主) --> IO Thread(从) --> SQL Thread(从)。 1、master节点的Bin
MySQL轻松学
2018/03/09
1.6K0
MySQL5.7并发复制演进
备库为什么会延迟好几个小时?
之前的文章谈到的事故原因,不论是偶发性的查询压力,还是备份,对备库延迟的影响一般是分钟级的,而且在备库恢复正常以后都能够追上来。
JavaEdge
2021/10/18
4520
Mysql解决主从慢同步问题(下)
5.6开始MySQL正式支持多线程复制,如下命令查看有多少个线程在同步。 show variables like '%slave_parallel%'
陈不成i
2021/06/17
2.6K0
数据库原理——主从复制
同时处于执行状态的所有事务,是否可以并行? 不可以。因为多个执行中的事务是由可能出现锁冲突的,锁冲突之后会产生锁等待问题。
全栈程序员站长
2021/05/21
7660
数据库原理——主从复制
mysql replication
复制是指将主库的ddl,dml等操作通过binlog日志,传输到复制服务器,副本进行回放这些日志,从而使得从库和主库数据保存同步的工作模式
萧晚歌
2022/03/22
4750
相关推荐
MySQL复制从库延迟优化思路
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档