MySQL主备复制的并行复制实现方法
在 MySQL 中,主备复制(Replication)的并行复制(Parallel Replication)是指备库(Slave)可以并行应用主库(Master)的二进制日志(Binary Log)中的事务,从而提高复制的效率。以下是实现并行复制的几种方法:
- MySQL 5.6 基于库级别的并行复制方案
- MySQL 5.7 基于逻辑时钟(组提交)的并行复制方案
- MySQL 8.0 基于 WRITESET 的并行复制方案
导致主从延迟的一个常见原因是,对于 binlog 中的事务,从库上只有一个 SQL 线程进行重放,而这些事务在主库中是并发写入的。
主从延迟带来的问题,主要体现在以下两个方面:
- 1、对于读写分离的业务,主从延迟意味着业务会读到旧数据。
- 2、主从延迟过大,会影响数据库的高可用切换。这一点尤其需要注意。
如果等待从库应用完差异的 binlog 才做切换,无疑会影响数据库服务的可用性。如果不等待,直接切换,则意味着没应用完的这部分 binlog 的数据会丢失。
基于库级别的并行复制(Database-Based Parallel Replication)
MySQL 5.6 引入了库级别的并行复制(schema-based parallel replication),即主库上同时修改不同数据库的事务可以在从库上并行应用。这种方式的局限在于,只能并行执行不同数据库的事务,如果多个事务作用于同一个库,它们仍然是串行执行。
- 原理:将不同数据库的事务分配到不同的工作线程中并行执行。
- 配置:
- 在 MySQL 5.6 及以上版本中,可以通过设置
slave_parallel_workers
参数启用并行复制。 - 设置
slave_parallel_type
为DATABASE
。
- 在 MySQL 5.6 及以上版本中,可以通过设置
- 示例:
SET GLOBAL slave_parallel_workers = 4; SET GLOBAL slave_parallel_type = 'DATABASE';
复制 - 适用场景:适用于多个数据库之间没有事务依赖的情况。
基于逻辑时钟的并行复制(Logical Clock-Based Parallel Replication)
MySQL 5.7 增强了并行复制,增加了组提交(group commit)功能。事务在主库提交时,如果有多个事务同时准备提交,它们会被作为一个组提交。在从库上,这些事务组也可以并行应用,提升复制性能。MySQL 5.7版本中的slave-parallel-type参数可以控制并行复制策略的选择,如DATABASE(按数据库分发)、LOGICAL_CLOCK(同时处于prepare状态的事务可以同时执行)等。
- 原理:通过逻辑时钟(Logical Clock)判断事务之间的依赖关系,将没有依赖关系的事务并行执行。
- 配置:
- 在 MySQL 5.7 及以上版本中,设置
slave_parallel_type
为LOGICAL_CLOCK
。 - 设置
slave_parallel_workers
参数指定并行工作线程数。
- 在 MySQL 5.7 及以上版本中,设置
- 示例:
SET GLOBAL slave_parallel_workers = 4; SET GLOBAL slave_parallel_type = 'LOGICAL_CLOCK';
复制 - 适用场景:适用于单数据库或多数据库中有事务依赖的情况。
基于 WRITESET 的并行复制(WRITESET-Based Parallel Replication)
MySQL 8.0 增加了新的并行复制策略,通过binlog-transaction-dependency-tracking来控制。例如
- COMMIT_ORDER 表示按照同时处于prepare状态来判断是否并行的策略;
- WRITESET 表示事务更新的每一行,计算其hash,组成writeset集合,如果两个事务的writeset集合没有交集,则可以并行;
- WRITESET_SESSION 表示在主库同一线程先后执行的两个事务,在备库执行的时候,要保证相同的先后顺序。
- 原理:通过分析事务的写集(WRITESET)判断事务之间的冲突,将没有冲突的事务并行执行。
- 配置:
- 在 MySQL 8.0 及以上版本中,设置
slave_parallel_type
为LOGICAL_CLOCK
。 - 启用
binlog_transaction_dependency_tracking
参数,并设置为WRITESET
。 - 设置
slave_parallel_workers
参数指定并行工作线程数。
- 在 MySQL 8.0 及以上版本中,设置
- 示例:
SET GLOBAL slave_parallel_workers = 4; SET GLOBAL slave_parallel_type = 'LOGICAL_CLOCK'; SET GLOBAL binlog_transaction_dependency_tracking = 'WRITESET';
复制 - 适用场景:适用于高并发写入场景,能够更精细地判断事务依赖关系。
配置步骤
- 停止复制:
STOP SLAVE;
复制 - 设置并行复制参数:
- 对于基于数据库的并行复制:
SET GLOBAL slave_parallel_workers = 4; SET GLOBAL slave_parallel_type = 'DATABASE';
复制 - 对于基于逻辑时钟的并行复制:
SET GLOBAL slave_parallel_workers = 4; SET GLOBAL slave_parallel_type = 'LOGICAL_CLOCK';
复制 - 对于基于 WRITESET 的并行复制:
SET GLOBAL slave_parallel_workers = 4; SET GLOBAL slave_parallel_type = 'LOGICAL_CLOCK'; SET GLOBAL binlog_transaction_dependency_tracking = 'WRITESET';
复制
- 对于基于数据库的并行复制:
- 启动复制:
START SLAVE;
复制
监控并行复制
- 使用以下命令查看并行复制的工作状态:
SHOW SLAVE STATUS\G;
复制 - 查看并行工作线程的状态:
SELECT * FROM performance_schema.replication_applier_status_by_worker;
复制
总结
- 基于库级别的并行复制:适用于多数据库场景。
- 基于逻辑时钟(组提交)的并行复制:适用于单数据库或多数据库中有事务依赖的场景。
- 基于 WRITESET 的并行复制:适用于高并发写入场景,能够更精细地判断事务依赖关系。
根据实际业务需求选择合适的并行复制方式,并合理配置 slave_parallel_workers
和 slave_parallel_type
参数,可以有效提高 MySQL 主备复制的性能。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
文章被以下合辑收录
评论
相关阅读
【专家有话说第五期】在不同年龄段,DBA应该怎样规划自己的职业发展?
墨天轮编辑部
1261次阅读
2025-03-13 11:40:53
MySQL8.0统计信息总结
闫建(Rock Yan)
478次阅读
2025-03-17 16:04:03
2月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
450次阅读
2025-03-13 14:38:19
Ogg23ai高手必看-MySQL Innodb Cluster跟oracle的亲密接触
曹海峰
444次阅读
2025-03-04 21:56:13
SQL优化 - explain查看SQL执行计划(一)
金同学
384次阅读
2025-03-13 16:04:22
MySQL突然崩溃?教你用gdb解剖core文件,快速锁定“元凶”!
szrsu
330次阅读
2025-03-13 00:29:43
MySQL生产实战优化(利用Index skip scan优化性能提升257倍)
chengang
322次阅读
2025-03-17 10:36:40
一键装库脚本3分钟极速部署,传统耗时砍掉95%!
IT邦德
229次阅读
2025-03-10 07:58:44
MySQL8.0直方图功能简介
Rock Yan
221次阅读
2025-03-21 15:30:53
MySQL 有没有类似 Oracle 的索引监控功能?
JiekeXu
198次阅读
2025-03-19 23:43:22