如何理解 mysql5.中的并行复制

32次阅读
没有评论

共计 2325 个字符,预计需要花费 6 分钟才能阅读完成。

如何理解 mysql5. 中的并行复制,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

一、前言
    在 5.5 以及 5.5 版本之前,复制流程图如下:

 

    流程:
    ① 主库 dump thread 发现 binlog 有更新,则向 slave 的 IO thread 推送相应的 binlog events
    ② slave 的 IO thread 在接收到 master 新产生的 events 之后,写入到自己的 relay log 中。
    ③ slave 的 SQL thread 开始应用 relay log,执行相应的更新语句

    弊端:
    ① master 在多个连接 并发的写入的情况下,slave 仅仅只有一个 sql thread 进行更新,会严重的造成主从延迟

二、并发复制
    官方称之为 enhanced multi-threaded slave(简称 MTS),在官方 mysql5.6 版本出现之前,阿里就有人实现过 slave 的并发复制的功能,按照粒度分为 database,table  ,row 的。这里我们主要讲官方版本。
    1 mysql5.6 基于 database 的并行复制
    通过 slave_parallel_workers=n 来设置并发复制的 worker 线程数量
    流程:
    ①  主库 dump thread 发现 binlog 有更新,则向 slave 的 IO thread 推送相应的 binlog events
    ② slave 的 IO thread 在接收到 master 新产生的 events 之后,写入到自己的 relay log 中。
        ③ slave 的 coordinator thread 根据 binlog events 的 database 进行 hash 调度分配给 worker thread
    ④ worker 线程 执行相应的 更新语句,互不影响

    分析:
    ① 实现了对 database 的并行复制,在多库更新的情况下 slave 的写入提升明显,但若是 master 主要在某个 database 更新的话则此并行复制比较鸡肋

    2 mysql5.7 基于 database/logical_clock 的并行复制
    新添参数 slave_parallel_type=DATABSE/LOGICAL_CLOCK 设定并行复制的方式,其中 database 跟 5.6 一样,我们这里讨论下为 LOGICAL_CLOCK 的模式

    原理:  通过 在 master 提交分为两个阶段 prepare 和 commit , 同时 prepare 的 事物标记相同的 last_commited(为当前最近一次提交事务的 seq num) 。commit 的时候给相应的事务标记 sequence num(依次递增)来实现,这些组提交的信息记录在 GTID 中。
    流程:
    ①  主库 dump thread 发现 binlog 有更新,则向 slave 的 IO thread 推送相应的 binlog events
    ② slave 的 IO thread 在接收到 master 新产生的 events 之后,写入到自己的 relay log 中。
        ③ slave 的  coordinator thread 把  binlog events  中相同的  last_commited 的进行分配给 worker thread
    ④ worker 线程 执行相应的 更新语句,互不影响  , 对于每个事务,其中 seq=n 的执行完毕之后,last_commited=n 的便可以执行了。

    这里 已经几乎跟 master 的 并发操作一样了,所以对于 slave 来说这种基于 组提交的 并发复制已经达到了 master 的并发度

    举例:
 
 
    第一个数字为 last_commited , 第二个数字为 seq num

    slave 上执行的顺序为  

     ① trx1 trx2 trx3
    ② trx4
    ③ trx5 trx6
    ④ trx7
    其中,trx1 执行完毕 便可以执行 trx4 ;trx2 执行完毕 便可以执行 trx5 trx6; trx5 执行完毕 便可以执行 trx7.

PS:对于是否开启 GTID 进行了一番测试(针对从库设置  slave_parallel_type= LOGICAL_CLOCK 的情况)
1 5.6 — 5.6
  基于 database 的并行复制 没有问题

2 5.7 — 5.7
     ① 开启 GTID 的情况下,将组提交的  last_commited 和 seq num 等信息记录到 GTID 中;
     ② 未开启 GTID 的情况下 mysql5.7 会 在每次提交 events 之前 set gtid_next= annonymous,因此会产生一个 annonymous_gtid , 然后将组提交的  last_commited 和 seq num 等信息记录下来,可以实现并行复制。

3 5.6 — 5.7
  ① 未开启 GTID 的情况下,mysql5.6 作为 master 并不会 进行  set gtid_mode= annonymous 操作,故而不会有 last_commited 和 seq num,mysql5.7 slave 的并行复制设置失效 (实际单线程执行更新语句),不会报错。
     ② 开启 GTID 的情况下,倘若 master 没有并发事务,并行复制设置失效(实际单线程执行更新语句),则复制不报错;若有并发事务,则复制直接出错,内容如下图(意思是 5.6 的格式的 events 到了 5.7 这里在设置 logical_clock 的情况下无法识别)
 
以上 在  slave_parallel_type=DATABASE 的情况下没有问题。
综上,不要在 5.6— 5.7 的同步中开启 logical_clock 模式的并行复制

看完上述内容,你们掌握如何理解 mysql5. 中的并行复制的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注丸趣 TV 行业资讯频道,感谢各位的阅读!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-19发表,共计2325字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)