Relay Log是MySQL主从复制架构中从库用于存储主库二进制日志的中间文件,从库的IO线程负责拉取主库的binlog并写入Relay Log,SQL线程则负责读取Relay Log中的事件在从库执行。当Relay Log出现积压时,通常表现为从库同步延迟持续升高,Relay Log文件数量不断增多且体积持续增大。

Relay Log积压的核心原因分类
Relay Log积压的本质是SQL线程的消费速度低于IO线程的生产速度,常见的诱因主要分为两类:一类是从库SQL线程本身存在性能瓶颈,另一类是磁盘IO性能不足导致Relay Log写入或读取效率低下。
一、从库SQL线程瓶颈排查方法
SQL线程是Relay Log消费的核心角色,其性能直接决定了Relay Log的处理速度,可通过以下步骤排查瓶颈:
1. 查看SQL线程运行状态
首先通过MySQL自带的状态查看命令确认SQL线程是否正常运行,以及当前的执行进度:
-- 查看从库复制状态,重点关注Relay_Log相关字段 SHOW SLAVE STATUSG -- 查看当前线程状态,筛选SQL线程相关信息 SHOW PROCESSLIST;
在SHOW SLAVE STATUS的输出中,需要重点关注以下几个字段:
- Slave_SQL_Running:表示SQL线程是否正在运行,值为Yes为正常,No则说明线程异常停止
- Relay_Log_File:当前SQL线程正在读取的Relay Log文件名
- Relay_Log_Pos:当前SQL线程在Relay Log中的读取位置
- Seconds_Behind_Master:从库落后主库的秒数,数值持续增大说明积压在加重
2. 分析SQL线程执行效率瓶颈
如果SQL线程正常运行但消费速度慢,需要进一步分析执行效率问题,常见的原因包括:
- 从库上执行了大量耗时的大事务,比如批量更新、大表DDL操作,导致SQL线程单次执行事件耗时过长
- 从库存在与主库不一致的索引结构,主库执行的操作在从库上需要全表扫描,执行效率大幅下降
- 从库开启了不必要的触发器、外键约束,增加了SQL线程执行事件的额外开销
- 从库参数
slave_parallel_workers设置不合理,未开启并行复制或者并行度不足
可以通过以下方式优化SQL线程性能:
-- 开启并行复制,设置并行工作线程数为4,根据从库CPU核心数调整 SET GLOBAL slave_parallel_workers = 4; -- 设置并行复制类型为逻辑时钟,适配大多数事务场景 SET GLOBAL slave_parallel_type = 'LOGICAL_CLOCK'; -- 关闭从库不必要的外键检查,减少执行开销 SET GLOBAL foreign_key_checks = 0;
二、磁盘IO性能优化方案
Relay Log的写入和读取都依赖磁盘IO,如果磁盘IO性能不足,会直接拖慢整个复制流程,可通过以下步骤排查和优化:
1. 磁盘IO性能排查
首先通过系统命令查看磁盘IO的使用情况,确认是否存在IO瓶颈:
-- 查看磁盘IO使用率,重点关注%util字段,接近100%说明IO饱和 iostat -x 1 5 -- 查看当前磁盘IO读写情况,定位占用IO较高的进程 iotop
如果Relay Log所在的磁盘%util持续处于高位,说明磁盘IO已经成为瓶颈,需要针对性优化。
2. 磁盘IO优化实操
针对Relay Log场景的磁盘IO优化可从以下几个方向入手:
- 将Relay Log存储目录迁移到性能更好的磁盘,比如SSD磁盘,避免和从库数据目录、日志目录放在同一块机械盘上
- 调整MySQL的Relay Log相关参数,减少不必要的磁盘刷写:
-- 设置Relay Log刷盘策略,2表示每次事务提交时只写到系统缓存,由系统定期刷盘,降低IO频率 SET GLOBAL sync_relay_log = 2; -- 设置Relay Log自动清理,避免文件过多占用磁盘空间,保留最近7天的Relay Log SET GLOBAL relay_log_purge = 1; SET GLOBAL relay_log_expire_logs_seconds = 604800;
- 调整系统IO调度策略,将机械盘的调度策略从cfq改为deadline,减少IO请求等待时间:
-- 查看当前磁盘的IO调度策略,假设磁盘为sda cat /sys/block/sda/queue/scheduler -- 临时修改为deadline调度策略 echo deadline > /sys/block/sda/queue/scheduler
总结排查流程
排查Relay Log积压问题可遵循以下标准化流程:首先通过SHOW SLAVE STATUS确认SQL线程状态和同步延迟情况,然后依次排查SQL线程性能瓶颈和磁盘IO性能瓶颈,定位到具体原因后针对性采取优化措施。优化后需要持续观察Seconds_Behind_Master指标和Relay Log文件的变化情况,确认积压问题得到解决。