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 = 10
          binlog_group_commit_sync_delay,这个参数控制着日志在刷盘前日志提交要等待的时间,默认是0也就是说提交后立即刷盘,但是并不代表是关闭了组提交,当设置为0以上的时候,就允许多个事物的日志同时间一起提交刷盘,也就是我们说的组提交。组提交是并行复制的基础,我们设置这个值的大于0就代表打开了组提交的延迟功能,而组提交是默认开启的。最大值只能设置为1000000微妙。
          binlog_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;       

                        

posted @ 2022-10-12 14:38  奋斗史  阅读(160)  评论(0)    收藏  举报