问题
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_committed和sequence_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)职责:
- 读取relay log中的事务
- 判断事务是否可以并行(根据last_committed或Write Set)
- 将事务分发给空闲的Worker线程
- 保证事务顺序性和一致性
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% |
注意事项
- 顺序性保证:同一行的多个事务仍然串行执行
- Worker数量:不是越多越好,过多会增加上下文切换开销
- 监控指标:
SHOW SLAVE STATUS\G -- 查看 Seconds_Behind_Master -- 查看 Slave_SQL_Running_State - 主库优化:提升组提交效率可间接提升并行复制效果
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数量。