简单来说就是在双1的设置下,事务提交后即刷盘的操作改为多个事务合并成一组事务再进行统一刷盘,这样处理就降低了磁盘IO的压力。详细资料参考关于组提交的说明推文 [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=8slave-parallel-type=LOGICAL_CLOCK
数据库配置
方案不足点
基于组提交的同步有个不足点,就是当主节点的事务繁忙度较低的时候,导致时间段内组提交fsync刷盘的事务量较少,于是导致从库回放的并行度并不高,甚至可能一组里面只有一个事务,这样从节点的多线程就基本用不到,可以通过设置下面两个参数,让主节点延迟提交。
binlog_group_commit_sync_delay # 等待延迟提交的时间,binlog提交后等待一段时间再 fsync。让每个 group 的事务更多,人为提高并行度。
binlog_group_commit_sync_no_delay_count # 待提交的最大事务数,如果等待时间没到,而事务数达到了,就立即 fsync。达到期望的并行度后立即提交,尽量缩小等待延迟。
MySQL8.0基于writeset的并行复制
writeset 基于事务结果冲突进行判断事务是否可以进行并行回放的方法,他由
binlog-transaction-dependency-tracking参数进行控制,默认采用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。writeset 是一个HASH类型的数组,里面记录着事务的更新信息,通过
transaction_write_set_extraction判断当前事务更新的记录与历史事务更新的记录是否存在冲突,判断过后再采取对应处理方法。writeset储存的最大存储值由binlog-transaction-dependency-history-size控制。需要注意的是,当设置成
WRITESET或WRITESET_SESSION的时候,事务提交是无序状态的,可以通过设置slave_preserve_commit_order=1强制按顺序提交。
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
该模式支持三种算法,默认采用XXHASH64,当从节点配置writeset复制的时候,该配置不能配置为OFF。该参数已经在MySQL 8.0.26中被弃用,后续将会进行删除。
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引用资料:
阿里内核月报:
http://mysql.taobao.org/monthly/2018/06/04/官方文档:
https://dev.mysql.com/doc/refman/8.0/en/replication-options-binary-log.html到此这篇关于MySQL Replication之并行复制的文章就介绍到这了,更多相关MySQL 并行复制内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!