适用场景

主从延迟的直接后果是读库数据不一致,业务侧表现为「刚提交查不到」。排查要分清是主库写入太快、从库回放太慢,还是被大事务卡住。不同原因,治理手段完全不同。

配置步骤(定位方法与常用命令)

-- 1) 基础状态
SHOW SLAVE STATUS\G
-- 关注:Seconds_Behind_Master、Slave_SQL_Running_State、Relay_Log_Pos

-- 2) 并行复制配置
SHOW VARIABLES LIKE 'slave_parallel%';
SHOW VARIABLES LIKE 'slave_preserve_commit_order';

-- 3) 主库当前事务与写入量
SHOW ENGINE INNODB STATUS\G        -- 看 TRANSACTIONS 段
SELECT * FROM information_schema.innodb_trx ORDER BY trx_started LIMIT 10;
SELECT sum(trx_rows_modified) FROM information_schema.innodb_trx;

-- 4) 从库回放瓶颈
SHOW PROCESSLIST;
-- 观察 SQL 线程是否在回放大事务(State: Waiting for ... commit)

关键参数与建议

  • 先看现象:Seconds_Behind_Master 是秒级波动还是持续上涨
  • 定位方向:大事务、DDL、批量导入、单线程回放、从库资源瓶颈
  • 并发回放:5.7+ 打开并行复制(slave_parallel_workers + logical clock)
  • 大事务拆分:批处理改小批,单事务控制在合理行数内
  • 读写分离:延迟敏感业务走主库或用延迟阈值剔除延迟从库
  • 资源保障:从库 IO 能力与主库匹配,别用低配机器当从库
  • 监控告警:延迟超过阈值告警,并记录发生时段的写入压力

容易踩的坑

  • 只看 Seconds_Behind_Master,不看到底卡在哪个事务
  • 用低配机器当从库,IO 能力不足回放慢
  • 大事务不拆分,一次插入几十万行
  • 备份与从库回放抢 IO,延迟被放大
  • 延迟上涨时先重启从库,掩盖了根因
  • 读写分离没有延迟剔除,读库读到旧数据

验证与巡检

# 延迟与回放状态
mysql -e 'SHOW SLAVE STATUS\G' | grep -E 'Seconds_Behind|Slave_SQL_Running_State|Retrieved_Gtid'

# 从库 IO 能力
sar -d 1 5
iostat -x 1 3 | head -20

# 主库写入压力
mysql -e 'SHOW GLOBAL STATUS LIKE "Com_insert";' ; sleep 60 ; mysql -e 'SHOW GLOBAL STATUS LIKE "Com_insert";'
  • 巡检:延迟 < 5 秒、并行复制已开启、无长期大事务、从库 IO 利用率 < 70%

小结

主从延迟治理验收:业务高峰下延迟稳定在秒级、有延迟剔除机制、大事务有拆分规范并纳入代码评审。

> 说明:文中命令为通用写法,不同型号/版本可能略有差异,落地前请对照设备实际版本的官方文档;带外管理与安全设备变更建议先在测试设备验证。