MySQL Replication中并行复制怎么实现

来源:这里教程网 时间:2026-02-28 16:07:10 作者:

传统单线程复制说明

i/o线程负责接收二进制日志的event写入relay log。

SQL线程读取Relay Log并在数据库中进行回放。

1.主库执行大事务(如:大表结构变更操作)。

2.主库大批量变更(如:大量插入、更新、删除操作)。

3.ROW同步模式下,主库大表无主键频繁更新。

4.数据库参数配置不合理,从节点性能存在瓶颈(如:从节点事务日志设置过小,导致频繁刷盘)。

5.网络环境不稳定,从节点IO线程读取binlog存在延迟、重连情况。

6.主从硬件配置差异,从节点的硬件资源使用达到上限。(比如:主节点SSD盘,从节点SAS盘)

1.硬件方面问题(包括磁盘IO、网络IO等)

2.配置方面问题。

3.数据库设计问题。

4.主库大批量变更,从节点SQL单线程处理不够及时。

总结

MySQL5.6基于库级别的并行复制

线程分工执行逻辑

Coordinator
线程负责判断事务是否可以并行执行,如果可以并行就把事务分发给
WorkThread
线程执行,如果判断不能执行,如
DDL
跨库操作
等,就等待所有的worker线程执行完成之后,再由
Coordinator
执行。

关键配置信息

slave-parallel-type=DATABASE

方案不足点

MySQL5.7基于组提交的并行复制

组提交说明

一组事务同时提交也就意味着组内事务不存在冲突,故组内的事务在从节点上就可以并发执行,问题在于如何区分事务是否在同一组中的,于是在binlog中出现了两个新的参数信息

last_committed
 和 
sequence_number

如何判断事务在一个组内呢?

sequence_number
 # 这个值指的是事务提交的序号,单调递增。

last_committed
 # 这个值有两层含义,1.相同值代表这些事务是在同一个组内,2.该值同时又是代表上一组事务的最大编号。

[root@mgr2 GreatSQL]# mysqlbinlog mysql-bin.0000002 | grep last_committed
GTID last_committed=0 sequence_number=1
GTID last_committed=0 sequence_number=2
GTID last_committed=2 sequence_number=3
GTID last_committed=2 sequence_number=4
GTID last_committed=2 sequence_number=5
GTID last_committed=2 sequence_number=6
GTID last_committed=6 sequence_number=7
GTID last_committed=6 sequence_number=8

数据库配置

slave-parallel-type=LOGICAL_CLOCK

方案不足点

binlog_group_commit_sync_delay # 等待延迟提交的时间,binlog提交后等待一段时间再 fsync。让每个 group 的事务更多,人为提高并行度。

binlog_group_commit_sync_no_delay_count # 待提交的最大事务数,如果等待时间没到,而事务数达到了,就立即 fsync。达到期望的并行度后立即提交,尽量缩小等待延迟。

MySQL8.0基于writeset的并行复制

关键参数查看

Command-Line Format --binlog-transaction-dependency-tracking=value
System Variable binlog_transaction_dependency_tracking
Scope Global
Dynamic Yes
SET_VAR Hint Applies No
Type Enumeration
Default Value COMMIT_ORDER
Valid Values COMMIT_ORDER
WRITESET
WRITESET_SESSION

参数配置项说明

COMMIT_ORDER
 # 使用 5.7 Group commit 的方式决定事务依赖。

WRITESET
     # 使用写集合的方式决定事务依赖。

WRITESET_SESSION
 # 使用写集合,但是同一个session中的事务不会有相同的last_committed。

binlog_transaction_dependency_history_size

Command-Line Format --binlog-transaction-dependency-history-size=#
System Variable binlog_transaction_dependency_history_size
Scope Global
Dynamic Yes
SET_VAR Hint Applies No
Type Integer
Default Value 25000
Minimum Value 1
Minimum Value 1000000

transaction_write_set_extraction

Command-Line Format --transaction-write-set-extraction[=value]
Deprecated 8.0.26
System Variable binlog_transaction_dependency_history_size
Scope Global, Session
Dynamic Yes
SET_VAR Hint Applies No
Type Enumeration
Default Value XXHASH64
Valid Values OFF
MURMUR32
XXHASH64

数据库配置

slave_parallel_type = LOGICAL_CLOCK
slave_parallel_workers = 8
binlog_transaction_dependency_tracking = WRITESET
slave_preserve_commit_order = 1

相关推荐