主库 Innodb_deadlocks 一天 0 次,从库错误日志里 1213 出现 200 多次,复制线程频繁重试,Seconds_Behind_Master 在 30 秒上下波动。乍看像缓存或者权限的锅,追下去往往不是。

SHOW VARIABLES LIKE 'slave_parallel_workers';
SHOW VARIABLES LIKE 'slave_parallel_type';
SHOW SLAVE STATUS\G

追下去是这么回事:并行复制把不同事务分给多个 worker 同时应用,主库上串行执行时不会形成的环,在从库上可能形成。worker 之间争同一行就会死锁,复制线程回滚后重放,延迟就是这么涨起来的。

「从库并行复制死锁」相关的验证我通常做两遍,改完一次、隔天再看一次,确认不是临时生效。一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。

先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。别只看报错的最后一行,往上看几行,真正的起因通常在上面。

具体做法是,确认从库开了并行复制以及 worker 数量;把 slave_parallel_type 调整成按主键分发 减少交叉;单库写入热点高就降低 worker 数;观察延迟是否随 worker 减少而收敛。

验收就看一点,从库 1213 次数明显下降 Seconds_Behind_Master 回到 1 秒以内并保持稳定。

作者 9823189