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
时间: 2024-09-29 06:15:53

Multi-threaded Slave 多线程复制的相关文章

Multi Threaded TCP Port Scanner 2.0发布 多线程TCP端口扫描工具

Multi http://www.aliyun.com/zixun/aggregation/29914.html">Threaded TCP Port Scanner是一个用于扫描某个IP地址的多线程TCP端口的工具.你可以设置运行多少个线程和时间,它会告诉你目标的MAC地址和正在运行的服务.你可以扫描网络上的IP地址,并找出你有哪些开放的端口. Multi Threaded TCP Port Scanner 2.0版本增加了Syn扫描的-s选项,使得扫描速度更快.增加更多的默认端口,提高

MySQL支持多线程复制

我们知道从5.6开始,MySQL支持多线程复制,到5.7版本又引入了基于GROUP COMMIT的并发事务分发机制.这意味着没有冲突的事务可以在备库并发执行.很显然,备库的事务提交顺序和主库是不能保证一致的. 这可能带来一些问题,尤其是事务之间有一定的业务关联时,提供读访问时可能会带来业务上的不一致问题.因此在MySQL 5.7.6版本,引入了一个新的特性,来保证主库和备库的commit顺序是一致的. 对应的changelog: Replication: Multi-threaded slave

MySQL多线程复制遇到Error_code: 1872的解决方案_Mysql

上周在生产环境上遇到一个问题,不敢独享,拿出来给小伙伴们做个简单的分享. 起因 :由于IDC机房断电(估计又是哪里被挖掘机碰了下吧),导致所有服务器重启,影响到了其中的MySQL数据库.来看下这时数据库遇到的问题: 数据库版本 :MySQL 5.7.10 问题表现 :从机复制报如下错误:Slave SQL for channel ": Slave failed to initialize relay log info structure from the repository, Error_co

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

首先梳理下传统MySQL/MariaDB主备复制基本原理: 主从复制通过三个线程来完成,在master节点运行的binlog dump的线程,I/O线程和SQL线程运行在slave 节点 ·         master节点的Binlog dump线程,当slave节点与master正常连接的时候,master把更新的binlog 内容推送到slave节点. ·         slave节点的I/O 线程 ,该线程通过读取master节点binlog日志名称以及偏移量信息将其拷贝到本地rela

多线程 复制 linux-多线程复制程序的求解

问题描述 多线程复制程序的求解 我写了一个多线程复制程序遇到下面问题,不知道该怎么解决,求各位大神cp_thread_mutex.c: 在函数'main'中: cp_thread_mutex.c:98: 警告:传递'pthread_mutex_destroy'的第 1 个参数时在不兼容的指针类型间转换 /usr/include/pthread.h:738: 附注:需要类型'union pthread_mutex_t ',但实参的类型为'union pthread_mutex_t **' cp_t

MariaDB多线程复制SQL thread和GTID详解

一.简单主从模式配置步骤 环境如下: db:mariadb-10.0.10-linux-x86_64.tar.gz os:centos6.7 1.配置主从节点的服务配置文件 1.1.配置master节点: [mysqld] binlog-format=ROW log-bin=master-bin log-slave-updates=true #gtid-mode=on #enforce-gtid-consistency=true master-info-repository=TABLE rela

java多线程复制文件的实例代码_java

复制代码 代码如下:  package com.test; import java.io.FileNotFoundException;  import java.io.IOException;  import java.io.RandomAccessFile;  public class FileCoper {      private static final String _ORIGIN_FILE_MODE = "r";              private static fi

Windows 7系统使用多线程加快文件复制?

  为什么没办法在 Windows 7 下加快 Windows 7 中文件复制/传输功能呢?可以用 robocopy 实现多线程文件复制实现. 经常进行文件管理操作的朋友们,提到复制/粘贴操作,深度系统下载想必很多人还会回想起当初 Vista 奇慢的复制速度,不满意于 Windows 系统内置的复制功能,因为它太龟速了.于是大家就使用 FastCopy.TeraCopy 之类的软件来加速复制,Windows 7 随后则是修复了这一问题,但效果似乎也不理想,但是你是否知道 Windows 7 已经

[redis设计与实现][9]复制

复制(Redis2.8) 设置主服务器的地址和端口(SLAVE OF命令) SLAVEOF host port Redis的主从复制设置非常方便,只需要在从服务器上设置主服务器的IP和端口即可.如果需要关闭主从同步,只需要执行SLAVEOF NO ONE即可. 该命令的具体描述见官方文档 void slaveofCommand(redisClient *c) { // 先处理no one,解除现有的主从同步 if (!strcasecmp(c->argv[1]->ptr,"no&qu