[toc]
## 概述
mysql从5.7开始支持多线程复制(最好是5.7.19以后的版本,前面版本都有各种问题),**很大程度上解决了主从延迟的问题**。不过默认情况下,还是单数据库单个线程,如果需要使用多线程,需要在从节点进行配置。
Mysql 5.7 对主从复制增加了一种类型,共有两种类型,如下:
* `DATABASE` 基于库的并行复制 , 每个数据库对应一个复制线程
* `LOGICAL_CLOCK` 基于组提交的并行复制方式,同一个数据库下可以有多个线程
## 配置
>[info] 以下配置基于前文的《基于GTID主从复制》
### 查看当前的主从状态
~~~
# 要有双yes: Slave_IO_Running: Yes Slave_SQL_Running: Yes
mysql@slave>show slave status;
# 观察当前线程,发现只有一组线程(IO线程与SQL线程)在处理
mysql@slave>show processlist;
+----+-------------+------+---------+--------------------------------------------------------+
| Id | User | db | Command | State |
+----+-------------+------+---------+--------------------------------------------------------+
| 4 | system user | NULL | Connect | Waiting for master to send event |
| 5 | system user | NULL | Connect | Slave has read all relay log; waiting for more updates |
+----+-------------+------+---------+--------------------------------------------------------+
# 查看复制类型,发现为DATABASE,也就是同一数据库下只有一个线程进行复制,不能并行复制。
mysql@slave>show variables like 'slave_parallel_type';
+---------------------+----------+
| Variable_name | Value |
+---------------------+----------+
| slave_parallel_type | DATABASE |
+---------------------+----------+
# 查看当前并行数量,发现并行工作的进程数是 0
mysql@slave>show variables like 'slave_parallel_workers';
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| slave_parallel_workers | 0 |
+------------------------+-------+
~~~
### 配置多线程
~~~
# 停止从节点复制
mysql@slave>stop slave;
# 设置复制类型为 LOGICAL_CLOCK,基于组提交的并行复制方式
mysql@slave>set global slave_parallel_type='logical_clock';
# 设置并行数量为 4(CPU核心数)
mysql@slave>set global slave_parallel_workers=4;
# 启动主从
mysql@slave>start slave;
~~~
然后再查看当前的主从状态
~~~
mysql@slave> show processlist;
+----+-------------+---------+------+--------------------------------------------------------+
| Id | User | Command | Time | State |
+----+-------------+---------+------+--------------------------------------------------------+
| 10 | system user | Connect | 77 | Waiting for master to send event |
| 11 | system user | Connect | 77 | Slave has read all relay log; waiting for more updates |
| 12 | system user | Connect | 77 | Waiting for an event from Coordinator |
| 13 | system user | Connect | 77 | Waiting for an event from Coordinator |
| 14 | system user | Connect | 77 | Waiting for an event from Coordinator |
| 15 | system user | Connect | 77 | Waiting for an event from Coordinator |
+----+-------------+---------+------+--------------------------------------------------------+
~~~
### 固化配置
以上配置方法重启一下就失效了,可以在slave的**mysql.cnf**增加以下配置
~~~
slave_parallel-type=LOGICAL_CLOCK
#DATABASE 默认值,基于库的并行复制方式
#LOGICAL_CLOCK:基于组提交的并行复制方式
slave_parallel_workers=4
master_info_repository=TABLE
relay_log_info_repository=TABLE
#这两个参数会将master.info和relay.info保存在表中,默认是Myisam引擎,官方建议改为Innodb引擎,防止表损坏后自行修复。
#alter table slave_master_info engine=innodb;
#alter table slave_relay_log_info engine=innodb;
#alter table slave_worker_info engine=innodb;
relay_log_recovery=ON
#当slave从库宕机后,假如relay-log损坏了,导致一部分中继日志没有处理,则自动放弃所有未执行的relay-log,并且重新从master上获取日志,
#这样就保证了relay-log的完整性。默认情况下该功能是关闭的,将relay_log_recovery的值设置为 1时,可在slave从库上开启该功能,建议开启。
~~~
- 【mysql的编程专题①】流程控制与其他语法
- 【mysql的编程专题②】触发器
- 【mysql的编程专题③】内置函数
- 【mysql的编程专题④】存储过程
- 【mysql的编程专题⑤】自定义函数
- 【mysql的编程专题⑥】视图
- 【mysql的设计与优化专题(1)】ER图,数据建模与数据字典
- 【mysql的设计与优化专题(2)】数据中设计中的范式与反范式
- 【mysql的设计与优化专题(3)】字段类型与合理的选择字段类型
- 【mysql的设计与优化专题(4)】表的垂直拆分和水平拆分
- 【mysql的设计与优化专题(5)】慢查询详解
- 【mysql的设计与优化专题(6)】mysql索引攻略
- 【Mysql问题集锦(1)】mysql不能使用innodb存储引擎
- 【Mysql进阶技巧(2)】利用mysql生成唯一序号
- 【Mysql进阶技巧(1)】MySQL的多表关联与自连接
- 【Mysql高可用架构(1)】基于日志点的主从复制
- 【Mysql高可用架构(2)】主从管理的系统视图
- 【Mysql高可用架构(3)】基于GTID的主从复制
- 【Mysql高可用架构(4)】在线变更复制类型
- 【Mysql高可用架构(5)】多源复制(多主一从)
- 【Mysql高可用架构(6)】多线程复制
- 【Mysql高可用架构(7)】在线设置复制过滤
- 【Mysql高可用架构(8)】解决主从不一致
- 【Mysql高可用架构(9)】初识mycat以及制作mycat镜像
- 【Mysql高可用架构(10)】mycat配置mysql读写分离
- MyCat 集群部署(HAProxy + MyCat)
- 常用复杂sql语句整理