MySQL并发复制系列二:多线程复制
admin
2023-06-11 05:02:17
0

并发复制(Parallel Replication 系列二: Enhanced Multi-threaded Slaves

作者:沃趣科技MySQL数据库工程师  麻鹏飞


首先梳理下传统MySQL/MariaDB主备复制基本原理:

        主从复制通过三个线程来完成,在master节点运行的binlog dump的线程,I/O线程和SQL线程运行在slave 节点

  •         master节点的Binlog dump线程,当slave节点与master正常连接的时候,master把更新的binlog 内容推送到slave节点。

  •         slave节点的I/O 线程 ,该线程通过读取master节点binlog日志名称以及偏移量信息将其拷贝到本地relay log日志文件。

  •         slave节点的SQL线程,该线程读取relay log日志信息,将在master节点上提交的事务在本地回放,达到与主库数据保持一致的目的。

问题1:

        Master节点的数据库实例并发跑多个线程同时提交事务,提交的事务按照逻辑的时间(数据库LSN号)顺序地写入binary log日志,,slave节点通过I/O线程写到本地的relay log日志,但是slave节点只有SQL单线程来执行relay log中的日志信息重放主库提交得事务,造成主备数据库存在延迟(lag)

思考1:

        那么为了减少主备数据同步延迟时间,由于备库只有单线程补偿数据的原因而造成延迟,那么能否使slave节点同时运行多个如SQL线程一样的功能来重放在主库执行的事务?答案当然是:可以!但是我们需要解决以下问题:

        1、slave本地的relay log记录的是master 的binary log日志信息,日志记录的信息按照事务的时间先后顺序记录,那么为了保证主备数据一致性,slave节点必须按照同样的顺序执行,如果顺序不一致容易造成主备库数据不一致的风险

        如:

                在master节点提交T1和T2事务按照以下顺序

 MySQL并发复制系列二:多线程复制

            slave节点执行T1和T2相反的顺序:

  MySQL并发复制系列二:多线程复制

MySQL 5.6改进:

        MySQL 5.6版本引入并发复制(schema级别),基于schema级别的并发复制核心思想:“不同schema下的表并发提交时的数据不会相互影响,即slave节点可以用对relay log中不同的schema各分配一个类似SQL功能的线程,来重放relay log中主库已经提交的事务,保持数据与主库一致”。可见MySQL5.6版本的并发复制,一个schema分配一个类似SQL线程的功能。

实现1:      

         slave节点开启并发复制(slave_parallel_workers=3)如下图,当前的slave的SQL线程为Coordinator(协调器),执行relay log日志的线程为worker(当前的SQL线程不仅起到协调器的作用,同时也可以重放relay log中主库提交的事务)

 MySQL并发复制系列二:多线程复制

问题2:

        MySQL 5.6基于schema级别的并发复制能够解决当业务数据的表放在不同的database库下,但是实际生产中往往大多数或者全部的业务数据表都放在同一个schema下,在这种场景即使slave_parallel_workers>0设置也无法并发执行relay log中记录的主库提交数据。 高并发的情况下,由于slave无法并发执行同个schema下的业务数据表,依然会造成主备延迟的情况。

 

思考2:

        那么如果slave同时可以用多线程的方式,同时执行一个schema下的所有业务数据表,将能大大提高slave节点执行ralay log中记录的主库提交事务达到与主库数据同步的目的,实现该功能我们需要解决什么问题?

  • 1、前面提到过为了保证主库数据一致性,master节点写入的binary log日志按照数据库逻辑时间先后的顺序并且slave节点执行relay log中主库提交的事务必须按照一致的顺序否则会造成主备数据不一致的情况。

  • 2、既然要实现scehma下所有的业务数据表能够并发执行,那么slave必须得知道并发执行relay log中主库提交的事务不能相互影响而且结果必须和主库保持一致。

 

实现2:

        MySQL 5.7 引入Enhanced Muti-threaded slaves,当slave配置slave_parallel_workers>0并且global.slave_parallel_type=‘LOGICAL_CLOCK’,可支持一个schema下,slave_parallel_workers个的worker线程并发执行relay log中主库提交的事务。但是要实现以上功能,需要在master机器标记binary log中的提交的事务哪些是可以并发执行,虽然MySQL 5.6已经引入了binary log group commit,但是没有将可以并发执行的事务标记出来。

 

我们用命令 mysqlbinlog -vvv mysqlbinlog.0000003 | grep -i last_committed    MySQL 5.7master机器上可以看到last_committed 和sequence_number

 MySQL并发复制系列二:多线程复制

slave机器的relay log last_committed相同的事务(sequence_num不同)可以并发执行。从上面截取的信息可以看出last_committed=26的事务一共有8个:从sequence_number=27~24。假设当slave_parallel_workers=7时,Coordinator线程(SQL线程)分配这一组事务到worker中排队去执行。这里可以看出增加master库binary log group commit组中事务的数量可以提高slave机器并发处理事务的数量,MySQL5.7引入 binlog_group_commit_sync_delay和 binlog_group_commit_sync_no_delay_count参数即提高binary log组提交并发数量。MySQL等待binlog_group_commit_sync_delay毫秒的时间直到binlog_group_commit_sync_no_delay_count个事务数时,将进行一次组提交。

总结:

       MySQL 5.7 GA版本推出的 Enhanced Multi-threaded Slaves功能,彻底解决了之前版本主备数据复制延迟的问题,开启该功能参数如下:

 MySQL并发复制系列二:多线程复制


相关内容

热门资讯

南太岛国瑙鲁推出“反独”新规范... 5月20日,南太平洋岛国瑙鲁发布公告表示,该国内阁已通过一个内部规范,要求本国境内及海外所有公职人员...
因耳环遭网暴的村干部:耳环几十... “电也没有,网也没有,特别是看到我们的村部,设施成了这个样子……”说出这句话的,是湖南石门县龙池河村...
卫生间浴霸怎么拆卸下来 浴霸的拆卸步骤如下:1. 关闭电源:在拆卸浴霸之前,一定要先关闭电源,以确保安全。2. 拆卸面罩:浴...
马桶抽水盖坏了可以单独换吗 可以换的,但是基本上及坐垫跟盖子一起换。换马桶盖方法:找到螺丝帽,用活搬手卸下来,再换上新的就行了。...
马桶盖能单独换吗 马桶盖坏了可以单独更换,根据自家马桶盖的形状、尺寸到卫浴商店购买新的马桶盖回来更换即可。在更换新的马...
为什么会出现老是跳闸呢 老是跳闸可能有以下原因:1. 过载:电路中连接的电器总功率超过了断路器的额定容量。2. 短路:电路中...
电脑键盘灯不亮是怎么回事 在使用电脑时,键盘灯不亮可能会给我们带来很多困扰。键盘灯的亮灭状态对于我们输入字符、使用快捷键等操作...
老人在洱海出水口洗乳胶漆染白河... 近日,云南大理,有网友拍到,一名老人在河边洗乳胶漆,河岸的水都被染白了。在评论区,老人的行为被网友谴...
大学校门开放后的“新问题” 日前,有网友通过“问政四川”反映:川内大量高校至今需要预约才能进入,曾几何时,大学都是自由出入,为什...
以文化为媒 聚产业之力(新时代... 传统文化邂逅当代设计外籍客商向展位工作人员咨询非遗文创产品。毕 晗摄(人民视觉)传统文化邂逅当代设计...