适用场景

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

配置步骤(治理手段与业务配合)

-- 1) 并行复制(需要重启或动态设置)
SET GLOBAL slave_parallel_workers = 8;
SET GLOBAL slave_parallel_type = 'LOGICAL_CLOCK';
SET GLOBAL slave_preserve_commit_order = ON;

-- 2) 大事务拆分(应用侧)
-- 原来:一次 INSERT 20 万行
-- 改为:每批 1000 行,批间 sleep 20ms

-- 3) DDL 与批量任务错峰
-- 大表变更放到低峰,批量导入与备份错开
# 业务侧约定
1) 延迟敏感接口(支付结果、订单状态)读主库
2) 列表与统计读从库,允许秒级延迟
3) 从库延迟超阈值自动从读库池摘除
4) 批量导入走专用通道,避开业务高峰

关键参数与建议

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

容易踩的坑

  • 并行复制开了但没开 commit order,从库数据出现短暂不一致
  • 大事务只让应用「注意」,没有代码评审约束
  • 全部业务读从库,延迟一涨全站异常
  • 从库摘除机制没有恢复逻辑,节点长期不回流
  • 备份与批量导入同窗口,延迟反复
  • 没有延迟历史数据,无法判断是否在恶化

验证与巡检

# 治理效果
mysql -e 'SHOW SLAVE STATUS\G' | grep Seconds_Behind
# 记录一周:延迟最大值、超阈值次数、摘除次数

# 大事务审计:慢日志中事务行数分布
  • 巡检:周报含延迟峰值、摘除/回流记录、大事务拆分效果

小结

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

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