MySQL从库io_thread接收binlog速度慢,怎么办?
- 内容介绍
- 文章标签
- 相关推荐

太魔幻了。 在线上的环境中,主从的数据是会强一致的,从库只会接受业务方的读流量,也许网络环境很恶劣从库同步的速度明显比主库写入到速度低,但是只要从库没有说跳过了某个binlog而少同步了某条记录,我们都可以认… 哎, 说实话,这种问题真的让人头大!明明主库写得飞起,到从库就卡住了感觉就像高速公路上突然堵车一样,憋得慌。下面的命令其实就会帮我们创建出username=mysqlsync password=mysqlsync123的账户专门用户主从同步使用。
问题背景:为什么我的从库这么慢?
前两天遇到一个主从延迟问题, 准备修改下相关参数来处理. 在此之前得先在测试环境对比下修改前后的区别. 搞来搞去发现根本不是并行的问题!主要还是IO瓶颈啊!
初步诊断:网速、IOPS、还是其他?
先说说想到的肯定是网络问题。毕竟数据是要通过网络传输的嘛。我们先用dstat看看网速,也是没谁了...。
翻旧账。 20MB每次IO的时候, 速度为: 601 MB/s
4MB每次IO的时候, 速度为: 579.42 MB/s
# 使用scp验证网速
scp MASTER:/binlog SLAVE/relay_log
# 使用wget验证3306附近端口的速度
wget MASTER:3307/binlog/xxxx
# 使用mysqlbinlog远程拉主库的binlog
mysqlbinlog --read-from-remote-server --raw --host=master --user='xx' --password='xx' --result-file=RELAY_DIR
代码语言:txt
| 产品名称 | 功能 | 价格 |
|---|---|---|
| 监控软件A | 实时监控MySQL性能 | ¥999 |
| IO优化工具B | 优化磁盘IO性能 | ¥599 |
| 网络诊断工具C | 检测网络延迟和丢包率 | ¥299 |
#!/usr/bin/env pythonimport timeimport osFILE不结盟E = '/tmp/testio'FILESIZE = 1102410241024BLOCKSIZE = 41024data = b"x"*BLOCKSIZEstarttime = with open as f: for x in range: stoptime = print,'sec')print,2) )print,2))代码语言:python,补救一下。 深入分析:到底卡在哪里了? 解决方案:关掉双一! 原因: 大量小事务 + 从库的低 IOPS导致本次来自酷延迟增大.. 解决方法:关闭或者调整innodb flush log at trx commit 和 sync binlong 再说说的话 万能重启大法失败了但是Perf可以使用所以也不算完全失败! 再说说希望大家多多学习多积累早日成为大神,我血槽空了。!
以上定位的问题也比较简单还有一些复杂的 IO 问题比如 bin log写入过大 bin log扫描过多同步线程阻塞临时表造成的 IO 过大等等问题都可以用此神器一窥究竟 dba lc select * from performance schema threads where thread os id=37012\\G *** 一行 *** THREAD ID : nine s 开搞。 ix 不结盟E : thread sql one connection TYPE : FOREGROUND PROCESSLIST ID : fifteen PROCESSLIST USER : dba PROCESSLIST HOST : NULL PROCESSLIST DB : sbtest PROCESSLIST COMMAND : Query PROCESSLIST 。
勇敢一点... .小事务太多了! 我当时有使用show processlist查看感觉sql线程比较闲明明延迟都那么大了却很少看到sql线程回放sql语句( binlog\_rows\_query\_log\_events=ON ).于是看了下relay log信息发现从库只有不到一百M B 的 bin log 和 relay log 主库那边已经产生了十加GB 的日志啊查看从库接受的 bin log 位置还对应主数据库第一个Bin log 。
可以看到耗时是在两阶段提交刷盘上也就是还是卡在IO上. iotop的本质是一个python脚本从proc中获取thread的IO信息进行汇总。. 从下图可以看出大部分的IO来源都来自于mysqld进程.延迟也很快降下来了. 所以问题大体上算是结了.# 使用perf采样并分析mysqld进程perf record -F 100 - p `pidof mysqld` -- sleep 120# 下载画图软件FlameGraphwget https:///brendangregg/FlameGraph/archive/refs/tags/tar -xvf cd FlameGraph-1.0# 画图FLAMEGRAPH\_DIR='/root/flamegraph'/FlameGraph-${FLAMEGRAPH\_DIR}/stackcollapse-| perl ${FLAMEGRAPH\_DIR}/> perf\_test\_io\_遇事不决先重启。
我坚信... 我这IOPS虽然有1400, 但实际场景是远不到这个值的. 也就是说iops很低, 刷盘又很频繁, 于是就刷不过来了. 这简直是噩梦!明明硬件看起来还不错,但实际性能却差强人意。仔细一看,发现问题出在刷盘上。 set global innodbflushlogattimeout = 0;set global syncbinlog = 0; 既然刷盘刷得慢, 那就不刷盘了! 于是我们直接关闭双1… 我们先来看下主从同步的逻辑: 主库发送binlog给从库的iothread, io_thread写入relay log, 然后sql线程去回放相关relay log 查看binlog大小限制mysql SHOW VARIABLES LIKE '%binlog_size%';.logs.com/.业内目前推荐使用的是row模式准确性高虽然说文件大但是现在有SSD和万兆光纤网络这些磁盘IO和网络IO都是可以接受的。

太魔幻了。 在线上的环境中,主从的数据是会强一致的,从库只会接受业务方的读流量,也许网络环境很恶劣从库同步的速度明显比主库写入到速度低,但是只要从库没有说跳过了某个binlog而少同步了某条记录,我们都可以认… 哎, 说实话,这种问题真的让人头大!明明主库写得飞起,到从库就卡住了感觉就像高速公路上突然堵车一样,憋得慌。下面的命令其实就会帮我们创建出username=mysqlsync password=mysqlsync123的账户专门用户主从同步使用。
问题背景:为什么我的从库这么慢?
前两天遇到一个主从延迟问题, 准备修改下相关参数来处理. 在此之前得先在测试环境对比下修改前后的区别. 搞来搞去发现根本不是并行的问题!主要还是IO瓶颈啊!
初步诊断:网速、IOPS、还是其他?
先说说想到的肯定是网络问题。毕竟数据是要通过网络传输的嘛。我们先用dstat看看网速,也是没谁了...。
翻旧账。 20MB每次IO的时候, 速度为: 601 MB/s
4MB每次IO的时候, 速度为: 579.42 MB/s
# 使用scp验证网速
scp MASTER:/binlog SLAVE/relay_log
# 使用wget验证3306附近端口的速度
wget MASTER:3307/binlog/xxxx
# 使用mysqlbinlog远程拉主库的binlog
mysqlbinlog --read-from-remote-server --raw --host=master --user='xx' --password='xx' --result-file=RELAY_DIR
代码语言:txt
| 产品名称 | 功能 | 价格 |
|---|---|---|
| 监控软件A | 实时监控MySQL性能 | ¥999 |
| IO优化工具B | 优化磁盘IO性能 | ¥599 |
| 网络诊断工具C | 检测网络延迟和丢包率 | ¥299 |
#!/usr/bin/env pythonimport timeimport osFILE不结盟E = '/tmp/testio'FILESIZE = 1102410241024BLOCKSIZE = 41024data = b"x"*BLOCKSIZEstarttime = with open as f: for x in range: stoptime = print,'sec')print,2) )print,2))代码语言:python,补救一下。 深入分析:到底卡在哪里了? 解决方案:关掉双一! 原因: 大量小事务 + 从库的低 IOPS导致本次来自酷延迟增大.. 解决方法:关闭或者调整innodb flush log at trx commit 和 sync binlong 再说说的话 万能重启大法失败了但是Perf可以使用所以也不算完全失败! 再说说希望大家多多学习多积累早日成为大神,我血槽空了。!
以上定位的问题也比较简单还有一些复杂的 IO 问题比如 bin log写入过大 bin log扫描过多同步线程阻塞临时表造成的 IO 过大等等问题都可以用此神器一窥究竟 dba lc select * from performance schema threads where thread os id=37012\\G *** 一行 *** THREAD ID : nine s 开搞。 ix 不结盟E : thread sql one connection TYPE : FOREGROUND PROCESSLIST ID : fifteen PROCESSLIST USER : dba PROCESSLIST HOST : NULL PROCESSLIST DB : sbtest PROCESSLIST COMMAND : Query PROCESSLIST 。
勇敢一点... .小事务太多了! 我当时有使用show processlist查看感觉sql线程比较闲明明延迟都那么大了却很少看到sql线程回放sql语句( binlog\_rows\_query\_log\_events=ON ).于是看了下relay log信息发现从库只有不到一百M B 的 bin log 和 relay log 主库那边已经产生了十加GB 的日志啊查看从库接受的 bin log 位置还对应主数据库第一个Bin log 。
可以看到耗时是在两阶段提交刷盘上也就是还是卡在IO上. iotop的本质是一个python脚本从proc中获取thread的IO信息进行汇总。. 从下图可以看出大部分的IO来源都来自于mysqld进程.延迟也很快降下来了. 所以问题大体上算是结了.# 使用perf采样并分析mysqld进程perf record -F 100 - p `pidof mysqld` -- sleep 120# 下载画图软件FlameGraphwget https:///brendangregg/FlameGraph/archive/refs/tags/tar -xvf cd FlameGraph-1.0# 画图FLAMEGRAPH\_DIR='/root/flamegraph'/FlameGraph-${FLAMEGRAPH\_DIR}/stackcollapse-| perl ${FLAMEGRAPH\_DIR}/> perf\_test\_io\_遇事不决先重启。
我坚信... 我这IOPS虽然有1400, 但实际场景是远不到这个值的. 也就是说iops很低, 刷盘又很频繁, 于是就刷不过来了. 这简直是噩梦!明明硬件看起来还不错,但实际性能却差强人意。仔细一看,发现问题出在刷盘上。 set global innodbflushlogattimeout = 0;set global syncbinlog = 0; 既然刷盘刷得慢, 那就不刷盘了! 于是我们直接关闭双1… 我们先来看下主从同步的逻辑: 主库发送binlog给从库的iothread, io_thread写入relay log, 然后sql线程去回放相关relay log 查看binlog大小限制mysql SHOW VARIABLES LIKE '%binlog_size%';.logs.com/.业内目前推荐使用的是row模式准确性高虽然说文件大但是现在有SSD和万兆光纤网络这些磁盘IO和网络IO都是可以接受的。

