Multi-threaded Slave 多线程复制

简介:

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
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
SQL Oracle 关系型数据库
【Oracle】玩转Oracle数据库(七):RMAN恢复管理器
【Oracle】玩转Oracle数据库(七):RMAN恢复管理器
446 5
|
存储 缓存 NoSQL
【赵渝强老师】MongoDB的WiredTiger存储引擎
MongoDB WiredTiger存储引擎自3.2版本起成为默认选择,提供文档级别的并发控制、检查点、数据压缩和本地加密等功能。本文详细介绍了WiredTiger的并发控制机制、预写日志与检查点、内存使用、数据压缩及磁盘空间回收等特性。
542 0
|
SQL 关系型数据库 MySQL
MySQL:简单记录一下Waiting for commit lock
Waiting for global read lock:由于flush table with read lock调用函数lock_global_read_lock导致DML操作堵塞。 Waiting for commit lock :由于flush table with read lock 调...
2294 0
|
SQL 存储 数据库
Hive简介、什么是Hive、为什么使用Hive、Hive的特点、Hive架构图、Hive基本组成、Hive与Hadoop的关系、Hive与传统数据库对比、Hive数据存储(来自学习资料)
1.1 Hive简介 1.1.1   什么是Hive Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能。 1.1.2   为什么使用Hive Ø  直接使用hadoop所面临的问题 人员学习成本太高 项目周期要求太短 MapReduce实现复杂查询逻辑开发难度太大   Ø  为什么要使用Hive 操作接口采用类SQ
28307 0
|
关系型数据库 MySQL 数据库管理
MySQL:产生大量小relay log的故障一例
能力有限有误请谅解,源码版本5.7.22 欢迎关注我的《深入理解MySQL主从原理 32讲 》,如下: 一、案例来源和现象 这个案例是朋友@peaceful遇到的线上问题,最终线索也是他自己找到的。
1627 0
|
缓存 关系型数据库 MySQL
MySQL redo log 恢复原理 | StoneDB 技术分享会 #5
redo log 类型 innodb 的 redo log 是带有逻辑意义的物理日志:物理指的是 redo log 是针对某一个页来说的,每条 redo log 都会有 Type、Space ID、Page Number 等信息,如下图所示;逻辑指的是一条 redo log 中可能描述的不是在页面上的某个偏移量的位置上写入若干个字节的数据,而是描述在页面上插入或者删除一条什么样的记录。 redo log 的通用结构为
310 0
|
安全 关系型数据库 MySQL
MySQL里面的innodb_support_xa
在看innodb_support_xa之前我们要先看下什么是XA,什么是两阶段提交。 XA 一个协调分布式事务的标准接口,为了遵从ACID原则,允许多个DB参与事务。为了查看更多,请 Section 13.3.7, “XA Transactions”。
5992 0
|
Linux 数据安全/隐私保护 iOS开发
Linux下SVN 命令每次都要输入密码
Linux下SVN 命令每次都要输入密码
|
存储 监控 AliSQL
RDS AliSQL 面向 Binlog 的性能优化大揭密(上)—— 极致 IO 优化
RDS MySQL使用AliSQL内核,为用户提供了MySQL所有的功能,同时提供了企业级的安全、备份、恢复、监控、性能优化、只读实例、Serverless等高级特性
3728 3
RDS AliSQL 面向 Binlog 的性能优化大揭密(上)—— 极致 IO 优化