ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[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从库上开启该功能,建议开启。 ~~~