问题

MySQL的并行复制原理是什么?

答案

核心概念

MySQL并行复制是为了解决主从延迟问题而设计的优化机制。传统的单线程SQL线程在从库重放日志时容易成为瓶颈,并行复制通过多个SQL线程并发执行relay log中的事务,大幅提升复制性能。

单线程复制的瓶颈

传统架构:

主库:多个会话并发写入 → binlog
从库:单个SQL线程串行执行 → 数据同步

问题:主库并发写入吞吐量高,从库单线程回放慢,导致主从延迟持续增加。

并行复制的演进

1. MySQL 5.6:基于库(database)并行

原理: 不同数据库的事务可以并行执行

-- 配置
slave-parallel-type=DATABASE
slave-parallel-workers=4  -- 4个worker线程

优点: 实现简单,不同库之间天然无冲突 缺点: 如果业务集中在单个库,无法并行,效果有限

2. MySQL 5.7:基于组提交(group commit)并行

核心思想: 主库同一时刻组提交的事务,在从库可以并行执行

原理:

  • 主库支持组提交优化(一次fsync刷多个事务的binlog)
  • 同一组提交的事务在主库执行时互不影响(无锁冲突)
  • binlog中记录last_committedsequence_number标识事务组
-- 配置
slave-parallel-type=LOGICAL_CLOCK
slave-parallel-workers=8

binlog事件示例:

#250101 10:00:01 server id 1  last_committed=10  sequence_number=11
#250101 10:00:01 server id 1  last_committed=10  sequence_number=12
#250101 10:00:01 server id 1  last_committed=10  sequence_number=13

上述三个事务的last_committed相同,可在从库并行执行。

优点: 适用于单库场景,并行度高 缺点: 依赖主库的组提交效率

3. MySQL 8.0:基于Write Set并行

增强点: 更细粒度的并行判断

  • 记录事务修改的行级别Write Set(哈希值集合)
  • 如果两个事务的Write Set不冲突,即使不在同一组提交,也可以并行
-- 配置
binlog_transaction_dependency_tracking=WRITESET
slave-parallel-workers=8

优点: 并行度进一步提升,不完全依赖组提交

工作机制

从库架构:
IO线程 → relay log
              ↓
      协调器线程(Coordinator)
              ↓
    分发事务到多个Worker线程
              ↓
   Worker1  Worker2  Worker3  Worker4
     ↓        ↓        ↓        ↓
   执行事务  执行事务  执行事务  执行事务

协调器(Coordinator)职责:

  1. 读取relay log中的事务
  2. 判断事务是否可以并行(根据last_committed或Write Set)
  3. 将事务分发给空闲的Worker线程
  4. 保证事务顺序性和一致性

Worker线程职责:

  • 并发执行分配到的事务
  • 执行完成后更新位置信息

关键配置参数

# 并行类型(DATABASE/LOGICAL_CLOCK)
slave-parallel-type=LOGICAL_CLOCK

# Worker线程数量(建议设置为CPU核心数)
slave-parallel-workers=8

# 保留relay log策略
relay_log_recovery=ON

# 并行依赖追踪(MySQL 8.0)
binlog_transaction_dependency_tracking=WRITESET

性能对比

复制模式 单库并发能力 适用场景 延迟改善
单线程 低并发 基准
基于库 多库架构 30%-50%
组提交 高并发 70%-90%
Write Set 高并发 80%-95%

注意事项

  1. 顺序性保证:同一行的多个事务仍然串行执行
  2. Worker数量:不是越多越好,过多会增加上下文切换开销
  3. 监控指标
    SHOW SLAVE STATUS\G
    -- 查看 Seconds_Behind_Master
    -- 查看 Slave_SQL_Running_State
    
  4. 主库优化:提升组提交效率可间接提升并行复制效果
    binlog_group_commit_sync_delay=100  # 延迟100微秒等待更多事务
    binlog_group_commit_sync_no_delay_count=10  # 或等待10个事务
    

面试答题总结

MySQL并行复制通过多个Worker线程并发执行relay log来解决主从延迟。演进路径是:基于库并行 → 基于组提交并行 → 基于Write Set并行。核心是协调器根据事务间的依赖关系(通过last_committed或Write Set判断)将无冲突的事务分发给不同Worker并发执行,同时保证事务顺序性和数据一致性。生产环境推荐使用LOGICAL_CLOCK模式,配合合理的Worker数量。