• 售前

  • 售后

热门帖子
入门百科

深入浅出解说MySQL的并行复制

[复制链接]
良辰743 显示全部楼层 发表于 2021-10-26 13:42:31 |阅读模式 打印 上一主题 下一主题
一、并行复制的配景
起首,为什么会有并行复制这个概念呢?
1. DBA都应该知道,MySQL的复制是基于binlog的。  

2. MySQL复制包罗两部分,IO线程 和 SQL线程。  

3. IO线程告急是用于拉取吸收Master转达过来的binlog,并将其写入到relay log  

4. SQL线程告急负责解析relay log,并应用到slave中  

5. 不管怎么说,IO和SQL线程都是单线程的,然后master却是多线程的,以是不免会有延迟,为了办理这个问题,多线程应运而生了。  

6. IO多线程?  

6.1 IO没必要多线程,因为IO线程并不是瓶颈啊  

7. SQL多线程?

7.1 没错,现在最新的5.6,5.7,8.0 都是在SQL线程上实现了多线程,来提拔slave的并发度   

接下来,我们就来一窥MySQL在并行复制上的积极和成果吧

二、重点
是否可以或许并行,关键在于多变乱之间是否有锁冲突,这是关键。 下面的并行复制原理就是在看如何让制止锁冲突
三、MySQL5.6 基于schema的并行复制
  1. slave-parallel-type=DATABASE(不同库的事务,没有锁冲突)
复制代码
之前说过,并行复制的目的就是要让slave尽大概的多线程跑起来,固然基于库级别的多线程也是一种方式(差异库的变乱,没有锁冲突)
先说说长处: 实现相对来说简朴,对用户来说使用起来也简朴
再说说缺点: 由于是基于库的,那么并行的粒度非常粗,现在很多公司的架构是一库一实例,针对如许的架构,5.6的并行复制无能为力。固然另有就是主从变乱的先后次序,对于5.6也是个大问题
话不多说,来张图好了

四、MySQL5.7 基于group commit的并行复制
  1. slave-parallel-type=LOGICAL_CLOCK : Commit-Parent-Based模式(同一组的事务[last-commit相同],没有锁冲突. 同一组,肯定没有冲突,否则没办法成为同一组)
  2. slave-parallel-type=LOGICAL_CLOCK : Lock-Based模式(即便不是同一组的事务,只要事务之间没有锁冲突[prepare阶段],就可以并发。 不在同一组,只要N个事务prepare阶段可以重叠,说明没有锁冲突)
复制代码
group commit,之前的文章有具体形貌,这里不多解释。MySQL5.7在组提交的时间,还为每一组的变乱打上了标记,现在想想就是为了方便举行MTS吧。
我们先看一组binlog
  1. last_committed=0 sequence_number=1
  2. last_committed=1 sequence_number=2
  3. last_committed=2 sequence_number=3
  4. last_committed=3 sequence_number=4
  5. last_committed=4 sequence_number=5
  6. last_committed=4 sequence_number=6
  7. last_committed=4 sequence_number=7
  8. last_committed=6 sequence_number=8
  9. last_committed=6 sequence_number=9
  10. last_committed=9 sequence_number=10
复制代码
4.1 Commit-Parent-Based模式


4.2 Lock-Based模式



五、MySQL8.0 基于write-set的并行复制
  1. 基于主键的冲突检测(binlog_transaction_depandency_tracking = COMMIT_ORDERE|WRITESET|WRITESET_SESSION, 修改的row的主键或非空唯一键没有冲突,即可并行)
  2. 5.7.22 也支持了 write-set 机制
复制代码
变乱依赖关系:
  1. binlog_transaction_depandency_tracking = COMMIT_ORDERE|WRITESET|WRITESET_SESSION
复制代码
  1. COMMIT_ORDERE: 继续基于组提交方式
  2. WRITESET: 基于写集合决定事务依赖
  3. WRITESET_SESSION: 基于写集合,但是同一个session中的事务不会有相同的last_committed
复制代码
变乱检测算法:
  1. transaction_write_set_extraction = OFF| XXHASH64 | MURMUR32
复制代码

MySQL会有一个变量来存储已经提交的变乱HASH值,全部已经提交的变乱所修改的主键(或唯一键)的值颠末hash后都会与那个变量的集合举行对比,来判断改行是否与其冲突,并以此来确定依赖关系
这里说的变量,可以通过这个设置巨细: binlog_transaction_dependency_history_size
如许的粒度,就到了 row级别了,此时并行的粒度更加精细,并行的速度会更快,某些环境下,说slave的并行度超越master也不为过(master是单线程的写,slave也可以并行回放)
六、如何让slave的并行复制和master的变乱实行的次序同等呢
5.7.19 之后,可以通过设置
  1. slave_preserve_commit_order = 1
复制代码
官方解释:  
  1. For multithreaded slaves, enabling this variable ensures that transactions are externalized on the slave in the same order as they appear in the slave's relay log.  
  2. Setting this variable has no effect on slaves for which multithreading is not enabled.  
  3. All replication threads (for all replication channels if you are using multiple replication channels) must be stopped before changing this variable.  
  4. --log-bin and --log-slave-updates must be enabled on the slave.  
  5. In addition --slave-parallel-type must be set to LOGICAL_CLOCK. 
  6. Once a multithreaded slave has been started, transactions can begin to execute in parallel.  
  7. With slave_preserve_commit_order enabled, the executing thread waits until all previous transactions are committed before committing.  
  8. While the slave thread is waiting for other workers to commit their transactions it reports its status as Waiting for preceding transaction to commit.
复制代码
大抵实现原理就是:excecution阶段可以并行实行,binlog flush的时间,按次序举行。 引擎层提交的时间,根据binlog_order_commit也是列队次序完成  

换句话说,如果设置了这个参数,master是怎么并行的,slave就怎么办并行
总结
以上就是这篇文章的全部内容了,希望本文的内容对各人的学习大概工作具有肯定的参考学习价值,如果有疑问各人可以留言互换,谢谢各人对草根技能分享的支持。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作