Mysql之并发复制
1. 并发复制解决的问题
解决主从复制延迟问题
一般Mysql主从复制有三个线程参与,都是单线程:Binlog Dump(主) -> IO Thread (从) -> SQL Thread(从)
慢就慢在SQL Thread是单线程,mysql5.6开始支持sql thread多个线程。
并发复制其实就是多个sql thread同时执行sql
2. 并发复制在Mysql不同版本的使用
1. mysql5.6
在mysql5.6中,并发复制是基于schema的,也就是基于库的
设置参数:slave_parallel_workers = 4
对于单库多表来说,并发复制没有什么作用
2. mysql5.7
在mysql5.7中,并发复制是基于组提交的
在从库设置参数:slave_parallel_workers>0并且global.slave_parallel_type=‘LOGICAL_CLOCK’
还需要在主库添加binlog_group_commit配置,否则从库无法做到基于事务的并行复制
binlog_group_commit_sync_delay = 100
binlog_group_commit_sync_no_delay_count = 10binlog_group_commit_sync_no_delay_count ,这个参数表示我们在binlog_group_commit_sync_delay等待时间内,如果事物数达到这个参数的设定值,就会触动一次组提交,如果这个值设为0的话就不会有任何的影响。如果到达时间但是事物数并没有达到的话,也是会进行一次组提交操作的。
3. 如何知道事务是否在同一组中
mysql5.7将组提交的信息存放在GTID中,如果用户没有开启GTID功能,每个事务开始前会存在一个Anonymous_Gtid.
通过查看binlog日志的last_committed,具有相同的last_committed,那么这些事务就在同一组内,可以进行组提交。
3. 基于GTID的并发复制
1. 主库配置文件
[mysqld]
datadir = /var/lib/mysql
socket = /var/lib/mysql/mysql.sock
symbolic-links = 0
log-error = /var/log/mysqld.log
pid-file = /var/run/mysqld/mysqld.pid
#GTID:
server_id = 1
gtid_mode = on
enforce_gtid_consistency = on
#binlog
log_bin = mysql-bin
log-slave-updates = 1
binlog_format = row
sync-master-info = 1
sync_binlog = 1
#relay log
skip_slave_start = 1
#不配置binlog_group_commit从库无法做到基于事务的并行复制
binlog_group_commit_sync_delay = 100
binlog_group_commit_sync_no_delay_count = 10
#为了数据安全再配置
sync_binlog=1
innodb_flush_log_at_trx_commit =1
#这个参数控制binlog写入 磁盘的方式。设置为1时,表示每次commit;都写入磁盘。这个刷新的是redo log 即ib_logfile0,而不是binlog
2. 从库配置文件
[mysqld]
datadir = /var/lib/mysql
socket = /var/lib/mysql/mysql.sock
symbolic-links = 0
log-error = /var/log/mysqld.log
pid-file = /var/run/mysqld/mysqld.pid
#GTID:
server_id = 2
gtid_mode = on
enforce_gtid_consistency = on
#binlog
log_bin = mysql-bin
log-slave-updates = 1
binlog_format = row
sync-master-info = 1
sync_binlog = 1
#relay log
skip_slave_start = 1
read_only = on
#MTS
slave-parallel-type = LOGICAL_CLOCK #开启逻辑时钟的复制
slave-parallel-workers = 4 #这里设置线程数为4 (最大线程数不能超过16,即最大线程为16)
master_info_repository = TABLE
relay_log_info_repository = TABLE
relay_log_recovery = on
3. 登录mysql,查看binlog_group_commit
show variables like 'binlog_group_commit_%';
4. 恢复主从复制
start slave;
5. 从库查看一下线程数
select * from mysql.slave_worker_info;

浙公网安备 33010602011771号