seconds_behind_master易失真,应通过read_master_log_pos与主库exec_master_log_pos差值判断是否“主库写得快”,通过exec_master_log_pos与read_master_log_pos差值判断是否“从库跑得慢”;pt-heartbeat可精准验证真实延迟。

看 SHOW SLAVE STATUS 里两个位点差值
延迟本质是“主库写得快”还是“从库跑得慢”,不能只盯 Seconds_Behind_Master。它在 IO 中断或大事务时会失真,比如网络卡住时显示为 0,实际已严重落后。
真正关键的是对比这两组位置:
-
Read_Master_Log_Pos(IO 线程拉到哪了)和主库当前Exec_Master_Log_Pos(用SHOW MASTER STATUS查)——差值大,说明 binlog 没传过来,问题在主库出口或网络 -
Exec_Master_Log_Pos(SQL 线程执行到哪了)和Read_Master_Log_Pos——差值大,说明 relay log 堆着没回放,问题在从库 SQL 层
查主库写入速度 vs 从库回放速度
如果 Read_Master_Log_Pos 跟得上主库,但 Exec_Master_Log_Pos 迟迟不动,就是从库“消费不动”。这时要确认是不是从库本身被拖慢了:
- 执行
SHOW PROCESSLIST看从库 SQL 线程状态:如果是Waiting for an event from Coordinator或executing卡住很久,大概率是单条大事务或 DDL 阻塞 - 用
pidstat -p $(pidof mysqld) 1和iostat -x 1同时观察:如果从库 CPU 持续低于 30%、磁盘 await 高、%util 接近 100%,说明磁盘 IO 是瓶颈,不是主库压力问题 - 检查有没有其他负载:比如备份任务(
FLUSH TABLES WITH READ LOCK)、慢查询、报表 JOIN 正在抢资源
用 pt-heartbeat 验证真实延迟
Seconds_Behind_Master 是基于时间戳算的,依赖系统时钟且对大事务不敏感。pt-heartbeat 绕过这个缺陷,直接测端到端延迟:
- 主库持续写心跳记录,从库读取并计算时间差,结果精确到毫秒
- 如果
pt-heartbeat显示延迟 300 秒,但SHOW SLAVE STATUS显示Seconds_Behind_Master = 0,基本可断定是 IO 层断连或 SQL 线程被锁死 - 注意:必须确保主从时钟同步(NTP),否则误差会放大
别忽略从库硬件配置差异
很多团队把从库当“备胎”,配低规格机器,结果一压就崩。这不是性能调优问题,是架构硬伤:
- 主库用 NVMe SSD + 32 核,从库用 SATA 云盘 + 8 核 → 即使开
slave_parallel_workers=16,磁盘吞吐也撑不住 - 对比
vmstat 1输出:如果从库wa(IO wait)长期 > 40%,而主库si/so(swap)很低,说明从库磁盘跟不上 - DDL 期间尤其明显:主库
ALTER TABLE几秒完成,从库可能卡住几分钟 —— 不是因为 SQL 写得差,而是从库 IO 线程根本写不完临时文件
真正难处理的,往往是主库看着风平浪静,但从库磁盘队列已堆满、SQL 线程在等一个没释放的 MDL 锁、或者备份脚本悄悄锁了表 —— 这些不会报错,只会让延迟无声扩大。











