千家信息网

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

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,并发复制(Parallel Replication) 系列二: Enhanced Multi-threaded Slaves作者:沃趣科技MySQL数据库工程师 麻鹏飞首先梳理下传统MySQL/Mar
千家信息网最后更新 2026年11月01日MySQL并发复制系列二:多线程复制

并发复制(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事务按照以下顺序

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


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中主库提交的事务)


问题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.7的master机器上可以看到last_committed 和sequence_number

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功能,彻底解决了之前版本主备数据复制延迟的问题,开启该功能参数如下:



线程 数据 事务 节点 日志 一致 顺序 功能 信息 业务 同时 数据库 时间 问题 延迟 不同 数据表 机器 版本 情况 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技图片 互联网科技公司排名 互联网科技网 互联网最新的科技 互联网科技论文 郑州华宇互联网科技 大白互联网科技 中国的互联网科技企业的崛起 昊天互联网科技有限公司 西安小鹰速贷互联网科技有限公司 威龙国际互联网科技公司 济南有互联网科技公司吗 中科明德北京互联网科技 广东工业互联网大赛深圳学泰科技 工业互联网科技成果转化 互联网硬科技公司 兰石爱特工业互联网科技分公司 玉溪新华互联网科技怎么选 互联网科技创业有什么好项目 株洲百竞科技的互联网营销顾问 南京欣网互联网络科技有限公司 涨乐互联网科技 齐家互联网科技 汇久创客互联网科技 成都铂石互联网科技做什么的 武汉健翔互联网络科技有限公司 崇明区互联网教育科技售后服务 洛阳昕诺飞互联网科技有限公司 长沙茂晟互联网科技有限公司 互联网高科技绘画
0