专栏首页mysql-dbamysql复制系列5-多线程复制
原创

mysql复制系列5-多线程复制

mysql复制中最常见的问题就是主从复制延迟问题,mysql从一开始不支持并行复制,到一步一步的优化改进多线程复制,下面介绍一下mysql复制单线程到多线程复制的历程

1.单线程复制:

mysql复制最早就是单线程复制,当从库的io线程将主库二进制日志写进自身的中继日志之后,读取中继日志并进行回放的线程只有一个sql_thread,所以读取的事件被串行执行。如果主库执行一个大事务延迟一个小时,那么从库收到这个事务时就已经落后主库1个小时了,单线程复制效率极端低下。

2.基于databases的多线程复制:

mysql从5.6开始支持多线程复制,5.6最初开始是基于库级别的多线程复制

mysql5.6对主库改进group commit组提交,去掉prepare_commit_mutex锁来实现Binlog中事务的记录顺序事务的提交顺序是一致的,每次只能fsync一个事务的Binlog,group commit分3个阶段(在mysql数据库上层提交事务时,按照顺序将事务放入到队列)

flush阶段:将每个事务的二进制日志放入内存

sync阶段:将二进制日志刷新到磁盘,如果队列中有多个事务那么仅一次fsync操作就可以完成多个二进制日志的落盘(合并io操作提升性能)

commit阶段:根据顺序调用存储引擎层事务的提交,innodb存储引擎本身就支持group commit 这样就是实现了数据库中事务的并行提交。

对于从库而言主要改进了,从库的复制线程又增加了一个sql协调器线程,真正干活的sql线程被称为工作线程work线程。当主库有多个databases时,从库就可以根据多个databases之间相互独立没有冲突来实现多线程复制。基于databases多线程复制,允许并行回放的粒度为数据库级别,只有在同一时间修改的数据为不同databases才允许并回放,在现实的业务场景中不常用

3.logical_clock多线程复制:

mysql从5.7开始支持基于逻辑时钟的并行复制,对于logical_clock多线程复制,允许并行回放的粒度为事务级别的,理论只要事务之间不冲突都可以并行回放

二进制日志中新增了last_committed和sequence_number。last_committed表示事务在每个二进制日志文件中的binlog group编号,sequence_number为每个二进制日志文件中的事务编号。last_committed会有重复值,值相同表示事务在同一个binlog group中表示这些事务并行提交时没有冲突,随意在回放时具有相同的last_committed事务是可以并行回放的。

last_committed值是主库事务在进入prepare阶段时获取已经提交事务的最大的sequence_number

开启需要配置如下参数:

主库:

slave_parallel_type =logical_clock

从库:

slave_parallel_workers =N

slave-preserve-commit-order = ON

slave_parallel_type =logical_clock

4.writeset多线程复制:

writeset多线程复制从mysql5.7.22版本及以后的支持的,对logical_clock多线程复制的优化,通过计算每行记录的哈希值来确定是否是相同记录判断是否冲突。

writeset = hash(index_name,db_name,db_name_length,table_name,table_name_length,value,value_length)

writeset多线程复制对二进制日志的last_committed值得计算上做了优化,优化了主库在不同时间点提交不存在冲突事务生成相同的last_committed的值

开启writeset多线程复制

# maste

slave_parallel_type =logical_clock

loose-binlog_transaction_dependency_tracking = WRITESET / WRITESET_SESSION(会话内的事务不可以并行)

loose-transaction_write_set_extraction = XXHASH64

binlog_transaction_dependency_history_size = 25000 #默认

#slave

slave-parallel-type = LOGICAL_CLOCK

slave-parallel-workers = 32

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • mysql复制系列3-传统复制和GTID复制

    在mysql5.6之前的版本支持传统的复制,即基于二进制文件和位置的复制。mysql5.6及其以后的版本支持基于GTID的复制,有了GTID复制不需要指定文件和...

    wangwei-dba
  • mysql或者mariadb多线程复制

    如果此时在主上有大量的insert操作,可以在slave上执行> select * from mysql.slave_worker_info\G 应该可以查看...

    二狗不要跑
  • mysql复制系列4-半同步复制

    异步复制:主库将事件写入二进制日志,但不知道从库是否接收成功,也不知道从库什么时候重放二进制日志,如果主库崩溃,则在主库提交的事务可能还没有传输到从库,这种情况...

    wangwei-dba
  • mysql复制系列2-复制的格式

    mysql 复制是基于binlog日志的,binlog日志中根据事件类型,事件以不同的格式被记录到二进制日志中,复制的格式由系统变量binlog_format控...

    wangwei-dba
  • Mysql 5.7 主从复制的多线程复制配置方式

    数据库复制的主要性能问题就是数据延时 为了优化复制性能,Mysql 5.6 引入了 “多线程复制” 这个新功能 但 5.6 中的每个线程只能处理一个数据库,所以...

    dys
  • mysql复制系列7-复制延迟计算

    我们在主从复制中最常遇到我的问题就是复制延迟的问题,那究竟复制延迟是怎么计算的呢?

    wangwei-dba
  • MySQL多线程复制报错案例

    从报错信息看,和参数slave_pending_jobs_size_max有关,那么这个参数具体是干什么的呢?我们今天就来了解一下;

    SEian.G
  • mysql复制系列1-复制的基本原理

    主库上的所有数据的变更(DDL,DML等)都会被记录到自己的binlog日志中,从库利用从主库传输来的binlog进行回放来模拟主库的数据变更

    wangwei-dba
  • MySQL多源复制之复制过滤

    在上一篇文章《深入了解MySQL多源复制》中,介绍了MySQL多源复制的相关内容,本文将继续讲解MySQL多源复制,主要内容是过滤复制以及在已有复制过滤配置中新...

    SEian.G
  • mysql复制系列6-复制信息相关的表

    复制状态信息查看可以通过一些语句如(show slave status)和相关的系统表来进行查看,它们之前有对应的关系

    wangwei-dba
  • MySQL并发复制系列一

    MySQL binlog导致二阶段提交 ? ? 二阶段详解 ? 二阶段导致事务无法并发执行 ? ? ? 使用Binlog Group Commit重新开启...

    沃趣科技
  • MySQL并发复制系列二

    MySQL replication原理 ? 复制延迟问题 ? ? Schema并发复制 ? Enhanced Muti-threaded slaves ? ? ...

    沃趣科技
  • MySQL并发复制系列三

    Binlog Group Commit 原理相同 ? ? ? 如何控制并发提交事务数 ? ? last_committed VS cid ? ? ? 结论 ...

    沃趣科技
  • MySQL 5.7基于GTID及多线程主从复制

    MySQL主从同步是在MySQL主从复制(Master-Slave Replication)基础上实现的,通过设置在Master MySQL上的binlog(使...

    小小科
  • MYSQL 多源复制故障另类恢复过程复盘

    公司做了一个多源复制的库,主要的功能是将逻辑分库的信息进行合并,便于在一个物理库上进行合并查询。而问题在于之前设计的过程中并没有想过要做聚合库,所以就为目前的故...

    AustinDatabases
  • MYSQL 多源复制,过滤复制与应用场景

    Mysql的使用中,会伴随着一个其他数据库中很少被提到的问题,数据融合。ORACLE ,SQL SERVER ,PG 你可以去分区表,MYSQL 中遇到这样的问...

    AustinDatabases
  • MySQL FAQ 系列 — MySQL 复制中 slave 延迟监控

    在MySQL复制环境中,我们通常只根据 Seconds_Behind_Master 的值来判断SLAVE的延迟。这么做大部分情况下尚可接受,但并不够准确,而应该...

    叶金荣
  • MySQL传统点位复制在线转为GTID模式复制

    MySQL传统点位复制在5.7版本前是主要的主从复制模式,而随着MySQL5.6版本引入GTID,并且MySQL5.7进行各方面的优化以后,在mySQL...

    July
  • redis系列:主从复制

    这篇文章主要讲述Redis的主从复制功能。会依次从环境搭建、功能测试和原理分析几个方面进行介绍。

    云枭

扫码关注云+社区

领取腾讯云代金券