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

<强> <强> <强> <强>, <强> <强>

<人力资源/>

首先梳理下<强> <强> 主备复制基本原理:

,,,,,,,,主从复制通过三个线程来完成,在主节点运行的binlog转储的线程,I/O线程和SQL线程运行在奴隶节点

<李>

,,,,,,,, <强>主节点的binlog转储线程,当奴隶节点与主正常连接的时候,主人把更新的binlog内容推送到奴隶节点。

<李>

<>强,,,,,奴隶节才能点的I/O线程,该线程通过读取主节点binlog日志名称以及偏移量信息将其拷贝到本地传递日志日志文件。

<李>

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

问题1:

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

思考1:

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

        1、slave本地的relay log记录的是master 的binary log日志信息,日志记录的信息按照事务的时间先后顺序记录,那么

        如:

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

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

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

MySQL 5.6改进:

        MySQL 5.6版本引入并发复制(schema级别),基于schema级别的并发复制核心思想:“”。可见MySQL5.6版本的并发复制,的功能。

实现1:   ,,

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

 MySQL并发复制系列二:多线程复制”> <br/> </p> <p>问题2:</p> <p>,,,,,,,, MySQL 5.6基于模式级别的并发复制能够解决当业务数据的表放在不同的数据库库下,但是实际生产中往往大多数或者全部的业务数据表都放在同一个模式下,在这种场景即使slave_parallel_workers> 0设置也无法并发执行中继日志中记录的主库提交数据。高并发的情况下,由于奴隶无法并发执行同个模式下的业务数据表,依然会造成主备延迟的情况。</p> <p>, </p> <p>思考2:</p> <p>,,,,,,那么如果奴隶同时可以用多线程的方式,同时执行一个模式下的所有业务数据表,将能大大提高奴隶节点执行ralay日志中记录的主库提交事务达到与主库数据同步的目的,实现该功能我们需要解决什么问题? </p> <ul类= <李>

1,前面提到过为了保证主库数据一致性,主节点写入的二进制日志日志按照数据库逻辑时间先后的顺序并且奴隶节点执行中继日志中<强> 强否则会造成主备数据不一致的情况。

<李>

2,既然要实现scehma下所有的业务数据表能够并发执行,那么奴隶必须得知道<强> <强> <强> 强而且结果必须和主库保持一致。

,

实现2:

,,,,,,,, <强> 强,引入增强Muti-threaded奴隶,当奴隶配置slave_parallel_workers> 0并且全球。slave_parallel_type=癓OGICAL_CLOCK”, <强> <强> <强> <强> <强>

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