当前位置:网站首页> MySQL Replication中的并行复制示例详解
MySQL Replication中的并行复制示例详解
2022-07-01 12:59:00 【1024问】
传统单线程复制说明
总结
MySQL5.6基于库级别的并行复制
MySQL5.7基于组提交的并行复制
组提交说明
MySQL8.0基于writeset的并行复制
关键参数查看
参数配置项说明
引用资料:
传统单线程复制说明I/O线程负责接收二进制日志的Event写入Relay Log。SQL线程读取Relay Log并在数据库中进行回放。众所周知,MySQL在5.6版本之前,主从复制的从节点上有两个线程,分别是I/O线程和SQL线程。
1.主库执行大事务(如:大表结构变更操作)。2.主库大批量变更(如:大量插入、更新、删除操作)。3.ROW同步模式下,主库大表无主键频繁更新。4.数据库参数配置不合理,从节点性能存在瓶颈(如:从节点事务日志设置过小,导致频繁刷盘)。5.网络环境不稳定,从节点IO线程读取binlog存在延迟、重连情况。6.主从硬件配置差异,从节点的硬件资源使用达到上限。(比如:主节点SSD盘,从节点SAS盘)以上方式偶尔会造成延迟,那么可能造成主从节点延迟的情况有哪些?
1.硬件方面问题(包括磁盘IO、网络IO等)2.配置方面问题。3.数据库设计问题。4.主库大批量变更,从节点SQL单线程处理不够及时。 总结可以对以上延迟原因做个大致分类。
MySQL5.6基于库级别的并行复制分析以上原因可以看出要想降低主从延迟,除了改善硬件方面条件之外,另外就是需要DBA关注数据库设计和配置问题,最后就是需要提高从节点的并发处理能力,由单线程回放改为多线程并行回放是一个比较好的方法,关键点在于如何在多线程恢复的前提下解决数据冲突和故障恢复位置点的确认问题。
线程分工执行逻辑在实例中有多个数据库的情况下,可以开启多个线程,每个线程对应一个数据库。该模式下从节点会启动多个线程。线程分为两类
Coordinator
和WorkThread
。
Coordinator
线程负责判断事务是否可以并行执行,如果可以并行就把事务分发给WorkThread
线程执行,如果判断不能执行,如DDL
,跨库操作
等,就等待所有的worker线程执行完成之后,再由Coordinator
执行。
slave-parallel-type=DATABASE
方案不足点 MySQL5.7基于组提交的并行复制组提交说明这种并行复制的模式,只有在实例中有多个DB且DB的事务都相对繁忙的情况下才会有较高的并行度,但是日常维护中其实单个实例的的事务处理相对集中在一个DB上。通过观察延迟可以发现基本上都是基于热点表出现延迟的情况占大多数。如果能够提供基于表的并行度是一个很好方法。
简单来说就是在双1的设置下,事务提交后即刷盘的操作改为多个事务合并成一组事务再进行统一刷盘,这样处理就降低了磁盘IO的压力。详细资料参考
老叶茶馆
关于组提交的说明推文https://mp.weixin.qq.com/s/rcPkrutiLc93aTblEZ7sFg
一组事务同时提交也就意味着组内事务不存在冲突,故组内的事务在从节点上就可以并发执行,问题在于如何区分事务是否在同一组中的,于是在binlog中出现了两个新的参数信息last_committed
和 sequence_number
解析binlog可以发现里面多了
last_committed
和sequence_number
两个参数信息,其中last_committed
存在重复的情况。
sequence_number
# 这个值指的是事务提交的序号,单调递增。 last_committed
# 这个值有两层含义,1.相同值代表这些事务是在同一个组内,2.该值同时又是代表上一组事务的最大编号。 [[email protected] GreatSQL]# mysqlbinlog mysql-bin.0000002 | grep last_committedGTID last_committed=0 sequence_number=1GTID last_committed=0 sequence_number=2GTID last_committed=2 sequence_number=3GTID last_committed=2 sequence_number=4GTID last_committed=2 sequence_number=5GTID last_committed=2 sequence_number=6GTID last_committed=6 sequence_number=7GTID 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的并行复制基于组提交的同步有个不足点,就是当主节点的事务繁忙度较低的时候,导致时间段内组提交fsync刷盘的事务量较少,于是导致从库回放的并行度并不高,甚至可能一组里面只有一个事务,这样从节点的多线程就基本用不到,可以通过设置下面两个参数,让主节点延迟提交。
关键参数查看writeset 基于事务结果冲突进行判断事务是否可以进行并行回放的方法,他由
binlog-transaction-dependency-tracking
参数进行控制,默认采用WRITESET
方法。
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
控制。
binlog_transaction_dependency_history_size需要注意的是,当设置成
WRITESET
或WRITESET_SESSION
的时候,事务提交是无序状态的,可以通过设置slave_preserve_commit_order=1
强制按顺序提交。
设置保存在内存中的行哈希数的上限,用于缓存之前事务修改的行信息。一旦达到这个哈希数,就会清除历史记录。
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 |
该模式支持三种算法,默认采用XXHASH64,当从节点配置writeset复制的时候,该配置不能配置为OFF。该参数已经在MySQL 8.0.26中被弃用,后续将会进行删除。
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_CLOCKslave_parallel_workers = 8binlog_transaction_dependency_tracking = WRITESETslave_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 并行复制内容请搜索软件开发网以前的文章或继续浏览下面的相关文章希望大家以后多多支持软件开发网!
边栏推荐
- Mysql间隙锁
- 类的初始化与实例化
- leetcode:241. Design priority for operation expression [DFS + Eval]
- Powerful, easy-to-use, professional editor / notebook software suitable for programmers / software developers, comprehensive evaluation and comprehensive recommendation
- 软件测试中功能测试流程
- 图灵奖得主Judea Pearl:最近值得一读的19篇因果推断论文
- MySQL gap lock
- 买卖其实也有风险
- 数字化转型再下一城,数字孪生厂商优锘科技宣布完成超3亿元融资
- Tencent Li Wei: deeply cultivate "regulatory technology" to escort the steady and long-term development of the digital economy
猜你喜欢
Look at the sky at dawn and the clouds at dusk, and enjoy the beautiful pictures
VS Code 设置代码自动保存
【开发大杀器】之Idea
ROS2 Foxy depthai_ ROS tutorial
Fiori applications are shared through the enhancement of adaptation project
基因检测,如何帮助患者对抗疾病?
基于.NetCore开发博客项目 StarBlog - (13) 加入友情链接功能
晓看天色暮看云,美图欣赏
CS5268优势替代AG9321MCQ Typec多合一扩展坞方案
Shell script imports stored procedures into the database
随机推荐
腾讯总考epoll, 很烦
哪个券商公司开户佣金低又安全又可靠
Which securities company has a low, safe and reliable account opening commission
王兴的无限游戏迎来“终极”一战
Digital signal processing -- Design of linear phase (Ⅱ, Ⅳ) FIR filter (2)
【开发大杀器】之Idea
System test UI test summary and questions (interview)
题目 2612: 蓝桥杯2021年第十二届省赛真题-最少砝码(枚举找规律+递推)
Simple Fibonacci (recursive)
When Sqlalchemy deletes records with foreign key constraints, the foreign key constraints do not work. What is the solution?
GID: open vision proposes a comprehensive detection model knowledge distillation | CVPR 2021
oracle cdc 数据传输时,clob类型字段,在update时值会丢失,update前有值,但
声明一个抽象类Vehicle,它包含私有变量numOfWheels和公共函数Vehicle(int)、Horn()、setNumOfWheels(int)和getNumOfWheels()。子类Mot
PG basics -- Logical Structure Management (trigger)
单点登录SSO与JWT好文整理
Detailed explanation of OSPF LSA of routing Foundation
Function test process in software testing
Perl 5.10.0 installation package download
数据库之MHA高可用集群部署及故障切换
我选的热门专业,四年后成了“天坑”