Multi-threaded Slave 多线程复制

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介:

MySQL5.7 新特性: Multi-threaded Slave 多线程复制

https://dev.mysql.com/doc/refman/5.7/en/replication-options-slave.html

什么是MTS

一句话概括:通过组提交的方式 master怎么并行,slave就怎么并行。

  • 关键因素:组提交

# 组提交

## 哪些需要组提交


1. transaction prepare
2. binlog write
3. transaction commit


## MySQL 5.1


1. transaction prepare  #fsync
2. binlog write          #fsync
3. transaction commit      #fsync
总结:每个事务都需要三次fsync


## MySQL 5.5


1. transaction prepare  #fsync
2. binlog write         #group fsync
3. transaction commit   #fsync
总结:binlog 可以组提交了


## MySQL 5.6


1. transaction prepare  # fsync
2. binlog write         # group fsync
3. transaction commit   # 不需要fsync了,因为1,2都fsync,就能保证整个事务提交
总结:少了最后一步的fsync,性能提升很多



## MySQL 5.7


1. transaction prepare  # 不fsync
2. binlog write         # 在写入binlog之前,去group fsync prepare log。 然后再group fsync binlog
3. transaction commit   # 不需要fsync了,因为1,2都fsync,就能保证整个事务提交
总结:相当于1,2 合在一起组提交,性能提升更多

为什么要用MTS

一句话概括:解决单线程复制的延迟问题
note1:当master有多个线程在写数据,那么MTS效果会非常好
note2:如果master对大表进行DDL,这样的延迟是没办法避免的

开启MTS的重要参数

参数 comment 默认配置 推荐配置 调整方式
slave_parallel_workers applier threads数量 0 16 dynamic
slave_parallel_type 并行方式 DATABASE LOGICAL_CLOCK dynamic
slave_preserve_commit_order 并行排序提交 0 1 dynamic
master_info_repository master_info持久化方式 FILE DATABASE static
relay_log_info_repository relay_info持久化方式 FILE DATABASE static
relay_log_recovery 重新获取relay log 0 1 static

重要组件

  1. IO thread并没有改变
  2. SQL thread 会变成Coordinator线程
  3. 会新增很多work线程来受Coordinator调度
+-----+-------------+-----------+------+---------+------+--------------------------------------------------------+------------------+
| Id  | User        | Host      | db   | Command | Time | State                                                  | Info             |
+-----+-------------+-----------+------+---------+------+--------------------------------------------------------+------------------+
| 127 | root        | localhost | NULL | Query   |    0 | starting                                               | show processlist |
| 128 | system user |           | NULL | Connect |  457 | Waiting for master to send event                       | NULL             |
| 129 | system user |           | NULL | Connect |  456 | Slave has read all relay log; waiting for more updates | NULL             |
| 130 | system user |           | NULL | Connect |  457 | Waiting for an event from Coordinator                  | NULL             |
| 131 | system user |           | NULL | Connect |  457 | Waiting for an event from Coordinator                  | NULL             |
| 132 | system user |           | NULL | Connect |  457 | Waiting for an event from Coordinator                  | NULL             |
| 133 | system user |           | NULL | Connect |  457 | Waiting for an event from Coordinator                  | NULL             |
| 134 | system user |           | NULL | Connect |  457 | Waiting for an event from Coordinator                  | NULL             |
| 135 | system user |           | NULL | Connect |  457 | Waiting for an event from Coordinator                  | NULL             |
| 136 | system user |           | NULL | Connect |  457 | Waiting for an event from Coordinator                  | NULL             |
| 137 | system user |           | NULL | Connect |  457 | Waiting for an event from Coordinator                  | NULL             |
| 138 | system user |           | NULL | Connect |  457 | Waiting for an event from Coordinator                  | NULL             |
| 139 | system user |           | NULL | Connect |  457 | Waiting for an event from Coordinator                  | NULL             |
| 140 | system user |           | NULL | Connect |  457 | Waiting for an event from Coordinator                  | NULL             |
| 141 | system user |           | NULL | Connect |  457 | Waiting for an event from Coordinator                  | NULL             |
| 142 | system user |           | NULL | Connect |  457 | Waiting for an event from Coordinator                  | NULL             |
| 143 | system user |           | NULL | Connect |  457 | Waiting for an event from Coordinator                  | NULL             |
+-----+-------------+-----------+------+---------+------+--------------------------------------------------------+------------------+
17 rows in set (0.00 sec)

Binlog 和 MTS

同一个last_committed 可以并行执行
同一个last_committed 中的sequence_number 默认是无序的

#160628 16:29:10 server id 12616406  end_log_pos 259 CRC32 0x9565260a     GTID    last_committed=0    sequence_number=1
#160628 16:29:25 server id 12616406  end_log_pos 427 CRC32 0xaa1d4add     GTID    last_committed=0    sequence_number=2
#160628 16:29:25 server id 12616406  end_log_pos 682 CRC32 0x0715f36a     GTID    last_committed=0    sequence_number=3
#160628 16:29:25 server id 12616406  end_log_pos 937 CRC32 0x2998c5ed     GTID    last_committed=0    sequence_number=4
#160628 16:29:25 server id 12616406  end_log_pos 1192 CRC32 0xd58951f3     GTID    last_committed=4    sequence_number=5
#160628 16:29:25 server id 12616406  end_log_pos 1447 CRC32 0xbf77ba5f     GTID    last_committed=4    sequence_number=6
#160628 16:29:25 server id 12616406  end_log_pos 1702 CRC32 0x3e74905f     GTID    last_committed=4    sequence_number=7
#160628 16:29:25 server id 12616406  end_log_pos 1957 CRC32 0xc31cbd6d     GTID    last_committed=4    sequence_number=8

顺序

  • 当slave_preserve_commit_order=0时

没有办法保证顺序,在恢复的过程中会有问题,到时候你怎么start slave 呢?
start slave until SQL_AFTER_MTS_GAPS ; reset slave

Master执行顺序: last_committed=0,sequence_number=1,2,3,4
slave执行顺序: 有可能就是 last_committed=0,sequence_number=1,4,3,2
  • 当slave_preserve_commit_order=1时

后一个sequence_number提交的时候,会等待前一个sequence_number完成。
Waiting for preceding transaction to commit

Master执行顺序: last_committed=0,sequence_number=1,2,3,4
slave执行顺序: 有可能就是 last_committed=0,sequence_number=1,2,3,4
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
5月前
|
NoSQL Java 编译器
c++开发redis module问题之保证Redis在fork时没有处于inflight状态的命令,如何解决
c++开发redis module问题之保证Redis在fork时没有处于inflight状态的命令,如何解决
|
5月前
|
NoSQL Redis C++
c++开发redis module问题之对于写命令,进行主备复制和写AOF,如何解决
c++开发redis module问题之对于写命令,进行主备复制和写AOF,如何解决
|
SQL 缓存 关系型数据库
MySQL的延迟复制和异步复制的区别是什么?底层原理是什么?
MySQL的延迟复制和异步复制的区别是什么?底层原理是什么?
120 0
|
缓存 NoSQL Redis
redis事务(multi,exec,discard,watch),错误处理
redis事务(multi,exec,discard,watch),错误处理
352 0
|
缓存 NoSQL 安全
Redis 7.0 Multi Part AOF的设计和实现
Redis 7.0 Multi Part AOF的设计和实现
321 0
Redis 7.0 Multi Part AOF的设计和实现
|
存储 算法 Unix
bthread源码剖析(四): 通过ParkingLot实现Worker间任务状态同步
通过之前的文章我们知道TaskGroup(以下简称TG)是在死循环等待任务,然后切换栈去执行任务。在当前TG没有任务的时候会进行“工作窃取”窃取其他TG的任务。在没有任务的时候TG会“休眠”,当任务出现的时候被唤醒然后消费。
325 0
|
SQL 监控 关系型数据库
mysql主从复制出现Waiting for Slave Worker to release partition
本文分享mysql主从复制出现Waiting for Slave Worker to release partition
mysql主从复制出现Waiting for Slave Worker to release partition
|
存储 NoSQL 调度
如何使用Redis让周期异步任务变得Fault-tolerant且Dynamic
        Python技术栈的同学一定都非常了解Celery——基于消息队列的分布式任务调度系统。(具体用法介绍不在此赘述)。通过Celery可以快速高效的将大规模的任务实时分发到众多的不同的机器上,让用户只关注每个单独任务的处理,而非调度分配任务本身。
1069 0
|
SQL 关系型数据库 数据库
使用PostgreSQL逻辑订阅实现multi-master
标签 PostgreSQL , multi master , 逻辑订阅 背景 很多业务要求多活,但是多活中最难搞定的实际上是数据库,大多数业务通过分流,例如将数据根据UID切分到不同的IDC,同一个UID的数据永远只会写到一个IDC中,然后通过数据复制技术,将对应的数据复制到其他的IDC。
4738 0