MySQL 8.0 开启并行复制的核心是设置 slave_parallel_type 为 LOGICAL_CLOCK 并将 slave_parallel_workers 设为大于 0 的整数。该方案适合主库并发写入较高导致从库回放延迟的场景,风险在于从库内存消耗会增加,且某些 DDL 操作仍可能阻塞并行队列。
先说结论:开启并行复制能有效利用从库多核 CPU 缓解回放延迟,但需确保事务提交组足够大才能触发并行。
- 先定位:确认延迟是否由单线程回放引起
- 先做:修改参数并重启复制或动态生效
- 再验证:观察 Seconds_Behind_Master 及线程状态
命令速用版
以下命令可在从库直接执行,修改后需重启 SQL 线程或实例才能完全生效。
# 查看当前并行配置
SHOW VARIABLES LIKE 'slave_parallel%';
# 停止从库 SQL 线程
STOP SLAVE SQL_THREAD;
# 设置并行类型为逻辑时钟(MySQL 5.7.20+ 默认推荐)
SET GLOBAL slave_parallel_type = 'LOGICAL_CLOCK';
# 设置并行 worker 数量,建议设为 CPU 核数
SET GLOBAL slave_parallel_workers = 4;
# 启动从库 SQL 线程
START SLAVE SQL_THREAD;为什么会这样
单线程回放是主从延迟的根本原因,并行复制允许从库同时应用多个事务。
传统复制模式下,从库 SQL 线程只有一个,必须按顺序重放主库 binlog 中的事务,即使主库是并发写入的。开启并行复制后,从库依据主库的提交组(Commit Group)判断哪些事务可以安全并行执行。MySQL 8.0 默认使用 LOGICAL_CLOCK 策略,基于组提交信息决定并行度,相比基于库或表的并行策略,能更细粒度地利用并发。
分步处理
按顺序执行以下操作,确保配置持久化且不影响数据一致性。
步骤 1:确认版本与当前状态
执行 SELECT VERSION(); 确认版本为 8.0。执行 SHOW SLAVE STATUS\G 查看 Seconds_Behind_Master 是否持续大于 0 且 Slave_SQL_Running_State 显示为单线程执行状态。
步骤 2:修改配置文件(推荐持久化)
编辑从库的 my.cnf 或 mysqld.cnf 文件,在 [mysqld] section 下添加以下配置,避免重启后失效。
[mysqld] slave_parallel_type = LOGICAL_CLOCK slave_parallel_workers = 4 slave_preserve_commit_order = ON步骤 3:动态生效并重启线程
若不便重启实例,可先执行 STOP SLAVE SQL_THREAD; 然后执行 SET GLOBAL 命令修改参数,最后执行 START SLAVE SQL_THREAD;。注意 slave_parallel_type 参数通常要求停止 SQL 线程后才能修改。
步骤 4:检查错误日志
修改参数后立即查看错误日志,确认没有报出 Unknown variable 或 Parameter 相关的错误。
怎么验证是否生效
通过状态变量和线程信息确认并行复制已启动。
检查点 1:变量确认
执行 SHOW VARIABLES LIKE 'slave_parallel%'; 确认 slave_parallel_type 为 LOGICAL_CLOCK,slave_parallel_workers 大于 0。
检查点 2:线程状态
执行 SHOW SLAVE STATUS\G 观察 Last_Error 是否为空。在 MySQL 8.0 中,可通过 performance_schema 表查询并发线程工作情况,若看到多个 worker 线程处于活跃状态,说明并行已生效。
检查点 3:延迟观察
持续监控 Seconds_Behind_Master 数值。若主库写入压力大且从库 CPU 有空闲,该数值应较开启前有明显下降趋势。公开资料中没有看到可靠的量化数据表明具体下降百分比,实际效果取决于主库事务提交组的大小。
常见坑
以下场景可能导致并行复制无效或引发新问题。
事务组太小:如果主库写入并发度低,事务提交间隔大,从库无法凑够并行组,worker 线程会空闲。
内存开销:每个 worker 线程都会消耗内存,slave_parallel_workers 设置过大可能导致从库 OOM,建议根据从库物理内存调整。
DDL 阻塞:某些 DDL 操作仍需全局锁,会阻塞并行队列,导致瞬间延迟飙升,这是正常现象。
参数不兼容:slave_parallel_type 设为 DATABASE 或 TABLE 在 8.0 中已不推荐,可能导致数据顺序问题,务必使用 LOGICAL_CLOCK。
常见问题
MySQL 5.7 可以使用同样的方法开启并行复制吗?
可以,MySQL 5.7.20 及以上版本支持 LOGICAL_CLOCK 并行复制,参数名称与 8.0 一致。
开启并行复制后延迟仍然很高怎么办?
检查主库是否开启了 binlog_group_commit_sync_no_delay,若主库提交组太小,从库无法并行,需优化主库写入并发。
slave_preserve_commit_order 参数需要修改吗?
不需要,MySQL 8.0 默认值为 ON,保持该值可确保从库提交顺序与主库一致,避免数据逻辑错误。
参考来源
- MySQL 8.0 Reference Manual, Replica Parallel Execution, https://dev.mysql.com/doc/refman/8.0/en/replication-options-replica.html
- MySQL 8.0 Reference Manual, Multithreaded Replica Execution, https://dev.mysql.com/doc/refman/8.0/en/replication-multi-threaded.html