主从延迟调优思路
主从延迟调优思路
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相同]
没有锁冲突. 同一组,肯定没有冲突,否则没办法成为同一组)
上面是从库的配置,并行复制依赖于主库的组提交(注意区分组复制)
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 查看当前的复制配置
查看从库配置:
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都不一样,表示不能并行
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,看到有很多都可以并行回放
5.5 优化完成
即使主库在大批量的写入,但延迟正在慢慢缩减,追上只是时间问题,今天就是0了
Enjoy GreatSQL :)
关于 GreatSQL
GreatSQL是适用于金融级应用的国内自主开源数据库,具备高性能、高可靠、高易用性、高安全等多个核心特性,可以作为MySQL或Percona Server的可选替换,用于线上生产环境,且完全免费并兼容MySQL或Percona Server。
相关链接: GreatSQL社区 Gitee GitHub Bilibili
GreatSQL社区:
社区有奖建议反馈: https://greatsql.cn/thread-54-1-1.html
社区博客有奖征稿详情: https://greatsql.cn/thread-100-1-1.html
(对文章有疑问或者有独到见解都可以去社区官网提出或分享哦~)
技术交流群:
微信&QQ群:
QQ群:533341697
微信群:添加GreatSQL社区助手(微信号:wanlidbc
)好友,待社区助手拉您进群。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
低代码集成Java系列:高效构建自定义插件
前言 随着软件开发的快速发展和需求的不断增长,开发人员面临着更多的压力和挑战。传统的开发方法需要花费大量的时间和精力,而低代码开发平台的出现为开发人员提供了一种更加高效、快速的开发方式。今天小编就以构建命令插件为例,展示如何使用Java语言高效构建自定义插件。 环境准备 活字格插件构建工具-Java版(forguncyJavaPluginGenerator) 活字格设计器(v10.0版本及以上) IDE编译器(例如IntelliJ IDEA Community Edition) Java运行时环境(Java Runtime Environment) JDK8.0版本及以上 插件生成器 打开活字格插件构建工具-Java版链接(forguncyJavaPluginGenerator),下载【活字格Java扩展创建工具】。推荐使用压缩包版本创建。 打开【forguncyJavaExtensionGenerateTool.exe】,在如下界面配置插件的基础信息: 点击创建服务端命令插件,创建完成后,在设置的对应目录下会生成工程文件: 接下来使用IDE编译器打开MyPlugin工程,打开后,工程...
- 下一篇
openGauss环境搭建 | 新手指南
一、搭建准备 openGauss开发需要使用linux环境,先下载远程连接工具Xshell/MobaXterm 。 1. 使用工具连接远程linux服务器,使用root账号远程登录,创建个人账号。 useradd -d /home/xxx -m xxx 2. 设置密码。 passwd xxx 3. 切换到个人账号,以后连接也使用个人账号进行登录。 su - xxx 二、编译openGauss-server 编译openGauss-server需要用到openGauss-server源码和其依赖的第三方软件仓库openGauss-third_party。 在根目录/data/下创建一个自己名字命名的文件夹作为工作目录,进入文件夹,拉取openGauss-server最新源码,建议先fork到自己的gitee仓库,再进行代码拉取,方便后续社区开发代码合入流程,修改代码,提交PR。 mkdir xxx cd xxx git clone https://gitee.com/opengauss/openGauss-server.git openGauss的编译,需要提前把所依赖的开源第三方软件进...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- SpringBoot2全家桶,快速入门学习开发网站教程
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- 2048小游戏-低调大师作品
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS6,CentOS7官方镜像安装Oracle11G