一文讲解MySQL的主从复制( 二 )

主库等待从库写入 relay log 并返回 ACK 后才进行Engine Commit 。
并行复制其实 MySQL 的并行复制 , 每个版本都是不一样的 , 因为他们的实现原理是不一样的 。
MySQL从5.6版本开始追加了并行复制功能 , 目的就是为了改善复制延迟问题 , 并行复制称为enhanced multi-threaded slave(简称MTS) 。
在从库中有两个线程IO Thread和SQL Thread , 都是单线程模式工作 , 因此有了延迟问题 , 我们可以采 用多线程机制来加强 , 减少从库复制延迟 。
MySQL5.7版本 , 基于组提交的并行复制 , 这个才是真正意义的并行复制 , 从库的并行复制跟master库的是一致 , 并行复制基于一个前提 , 即所有已经处于prepare阶段的事务 , 都是可以并行提交的 。
MySQL8.0版本 , 基于write-set的并行复制 , MySQL会有一个集合变量用来存储事务修改的记录信息(主键哈希值) , 当新的修改时已提交时 , 会进行判断是否冲突 , 不冲突即可合并 , 这样的并行的颗粒度就到row级别了 , 并行复制的速度更快
其实如果你想要进行并行复制的话 , 那么你还需要知道如何去进行并行复制的调优 , 只有这样 , 你才能掌握好这个主从复制 。
binlog_transaction_dependency_history_size 用于控制集合变量的大小 。
binlog_transaction_depandency_tracking 用于控制binlog文件中事务之间的依赖关系 , 即last_committed值 。
transaction_write_set_extraction用于控制事务的检测算法 , 参数值为:OFF、 XXHASH64、MURMUR32
master_info_repository开启MTS功能后 , 务必将参数master_info_repostitory设置为TABLE , 这样性能可以有50%~80%的提升 。这是因为并行复制开启后对于元master.info这个文件的更新将会大幅提升 , 资源的竞争也会变大 。
slave_parallel_workers若将slave_parallel_workers设置为0 , 则MySQL 5.7退化为原单线程复制 , 但将 slave_parallel_workers设置为1 , 则SQL线程功能转化为coordinator线程 , 但是只有1个worker线程进行回放 , 也是单线程复制 。然而 , 这两种性能却又有一些的区别 , 因为多了一次coordinator线程的转发 , 因此slave_parallel_workers=1的性能反而比0还要差 。
这些参数实际上都是非常要掌握的 , 不然你再设置并行复制的时候 , 会遇到各种各样的问题 , 所以你学会了么?
文章参考《MySQL海量数据优化》 
《MySQL必知必会》 
《MySQL拍错指南》
责任编辑:武晓燕来源: JAVA极客技术



推荐阅读