SELECT COUNT(*) FROM information_schema.processlist
WHERE user = 'sync_user';
SHOW VARIABLES LIKE 'max_connections';

同步任务失败后固定 1 秒重试 10 次,目标库连接数从 120 冲到 800,直接返回 Too many connections,连监控都查不了。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。

追下去是这么回事:多个分片同时失败,重试没有随机抖动,退避时间也一样。十路重试在同一秒打过去,连接池瞬间被占满。失败的任务还在队列里排队,压力叠着往上涨。

「同步重试打满下游」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。

把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。

处理上按这个顺序:重试改成指数退避加随机抖动 1 秒 2 秒 4 秒 最多 5 次;按分片限流 全局并发不超过目标库连接数的三分之一;出现连接拒绝就熔断 隔一分钟再探;重试次数和间隔写进配置 不要硬编码。

确认没问题再收工,同样制造一次失败 目标库连接数峰值不到 200 没有出现 1040。

作者 9823189