MySQL 8.0 如何开启并行复制提升从库回放速度

文章导读
MySQL 8.0 开启并行复制的核心是设置 slave_parallel_type 为 LOGICAL_CLOCK 并将 slave_parallel_workers 设为大于 0 的整数。该方案适合主库并发写入较高导致从库回放延迟的场景,风险在于从库内存消耗会增加,且某些 DDL 操作仍可能阻塞并行队列。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

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 显示为单线程执行状态。

MySQL 8.0 如何开启并行复制提升从库回放速度

步骤 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 相关的错误。

怎么验证是否生效

通过状态变量和线程信息确认并行复制已启动。

MySQL 8.0 如何开启并行复制提升从库回放速度

检查点 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 有空闲,该数值应较开启前有明显下降趋势。公开资料中没有看到可靠的量化数据表明具体下降百分比,实际效果取决于主库事务提交组的大小。

常见坑

以下场景可能导致并行复制无效或引发新问题。

MySQL 8.0 如何开启并行复制提升从库回放速度

事务组太小:如果主库写入并发度低,事务提交间隔大,从库无法凑够并行组,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