主从延迟过大核心在于从库sql线程串行回放,需主库、从库、binlog格式、事务设计四者协同实现真并行;先确认是否sql回放瓶颈,再启用logical_clock模式及writeset依赖追踪,并优化业务写法。

主从延迟过大,核心卡在从库 SQL 线程串行回放——主库几百个事务并发写入,从库却只靠一个线程“慢慢抄作业”。并行复制不是简单调个 slave_parallel_workers 就能见效,它需要主库、从库、binlog 格式、事务设计四者协同。关键不在于“开了没”,而在于“真并行了没”。
确认是否真卡在 SQL 回放环节
先排除干扰项,避免白调参数:
- 查
SHOW SLAVE STATUS\G中Retrieved_Gtid_Set和Executed_Gtid_Set差距:如果持续拉大,说明是 IO 线程拉日志慢(网络或主库 dump 压力),不是并行的问题; - 如果两者接近,但
Seconds_Behind_Master持续上涨,才是 SQL 线程回放瓶颈,适合上并行复制; - 执行
SELECT * FROM performance_schema.replication_applier_status_by_worker;,看各 worker 的WORKING_ON_TRANSACTION是否长期为空——空着,大概率是事务依赖阻塞,并行被锁死了。
MySQL 5.7+ 必须用 LOGICAL_CLOCK 模式
别用过时的 DATABASE 模式(仅多库有效,单库完全无效):
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 停复制:
STOP SLAVE; - 设类型:
SET GLOBAL slave_parallel_type = 'LOGICAL_CLOCK'; - 设线程数(建议 4–8,勿盲目堆高):
SET GLOBAL slave_parallel_workers = 8; - 重启复制:
START SLAVE; - 验证:
SHOW PROCESSLIST;应看到多个Worker线程,状态为Waiting for an event from Coordinator或Executing event。
主库必须配齐 WriteSet 依赖追踪
MySQL 8.0.22+ 才支持真正细粒度并行,靠的是主库把“哪些行被改了”精准标记出来。缺一不可:
-
binlog_transaction_dependency_tracking = WRITESET(必须) -
binlog_format = ROW(必须) -
binlog_row_image = FULL(必须,否则 WriteSet 计算不全) - 事务隔离级别为
REPEATABLE-READ(推荐) - 表必须有主键或唯一索引(否则 WriteSet 无法定位行,直接退化串行)
避开让并行失效的业务写法
再好的配置,也扛不住有问题的 SQL:
- 避免
UPDATE ... WHERE status=1这类非唯一条件更新——WriteSet 只能标记整张表,所有后续事务排队; - 拆分大事务:单事务更新超 5000 行?立刻按
LIMIT分批,每批独立提交; - 禁用
innodb_autoinc_lock_mode = 0(传统模式),改用2(交错模式),避免 AUTO_INCREMENT 冲突导致依赖误判; - 事务内别混 sleep、远程调用、大查询等耗时操作——它们拖长事务生命周期,间接扩大 WriteSet 范围。
并行复制不是银弹,但它能把原本分钟级的延迟压到秒级,前提是主库“给得清”,从库“分得明”,业务“写得对”。调完别忘持续观察 Seconds_Behind_Master 趋势和 worker 利用率,而不是只看参数开了没。










