MySQL主从复制

作者: mnjnhuang | 来源:发表于2018-11-25 23:29 被阅读784次

    主从复制

    AB(主从)复制是一种数据复制技术,是myslq数据库提供的一种高可用、高性能的解决方案
    必须先将从数据库数据清空后做完数据同步再进行主从复制


    AB复制的工作原理
    1.主数据库开启二进制日志,并开启一个与从数据库不同的服务ID号
    2.从数据库通过I/O线程向主数据库请求二进制日志
    3.从数据库将请求的二进制日志内容写入中继日志中
    4.从数据库通过SQl线程读取中继日志中的内容并在数据库中执行相应动作,所有动作执行完后从数据库进入等待状态,等待主数据库执行新的动作
    各个线程的作用
    1.I/O线程:向主数据库请求二进制日志,并存入中继日志中
    2.SQL线程:读取中继日志,并在数据库执行动作
    3.binlog dump线程:发送二进制日志文件
    AB复制的模式
    1.一主一从
    2.双主复制
    3.一主多从
    4.多主一从
    5.联级复制

    搭建MySQL主从复制

    主数据库

    # yum install mariadb-server
    # vim /etc/my.cnf
        [mysqld]
        log-bin=binlog         // 开启二进制日志
        server-id=1            // 制定服务ID号
    # systemctl start mariadb
    > grant reolication slave,relication client on *.* to 'ABuser'@'192.168.210.10'
    -> identified by '123';    // 授权一个实时复制数据的账号
    > show master\G;
    *************** 1. row***************
            File: binlog.000003
            Position: 1196
            Binlog_Do_DB: 
            Binlog_Ignore_DB: 
    
    

    从数据库

    # yum install mariadb 
    # vim /etc/my.cnf
        [mysqld]
        server-id=2    // 指定和主数据库不一样的服务号
    > help change master to;
        CHANGE MASTER TO MASTER_HOST='master2.mycompany.com',
            MASTER_USER='replication',
            MASTER_PASSWORD='bigs3cret',
            MASTER_PORT=3306,
            MASTER_LOG_FILE='master2-bin.001',
            MASTER_LOG_POS=4,
            MASTER_CONNECT_RETRY=10;
    > chane master to master_host='192.168.210.5',
    -> master_user='ABuser',
    -> master_password='123',
    -> master_port=3306,
    -> master_log_file='binlog.000003',
    -> master_log_pos=1196;
    > start slave;               // stop slavve关闭
    > show slave status\G
        Slave_IO_Running: Yes    // I/O线程状态为Yes
        Slave_SQL_Running: Yes   // SQL线程状态为Yes
    

    主从同步的延迟问题,原因及解决方案

    从服务器配置过低导致延迟-->
    原因:一般是主节点拥有较大规格的配置,而只读节点却购买了一个最小规格的配置,只读节点进行AB复制胡开启两个线程,分别是IO线程和SQL线程,这两个线程会消耗掉只读节点的IO资源,只读节点IOPS配置不够的时候,会导致只读节点的数据出现延迟
    解决办法: 升级从服务器的配置,让只读节点的配置大于或者等于主节点的配置
    主库的QPS过高导致只读节点延迟-->
    原因:由于只读节点与主库的同步采用的是单线程同步,而主库的压力是并发多线程写入,导致只读节点的数据延迟
    解决办法:开启只读节点的并行复制 (mysql5.6.3以后支持多线程复制)
    在MySQL5.6中,引入了并发复制,这个并发复制是数据库级别的,一个SQL线程可以处理一个数据库的连续事务,而不用等待其它数据库完成.这个版本的并发复制,可以理解成一个数据库一个SQL线程
    与并发有关的参数如下:

    slave_parallel_workers                 // worker线程的个数                       
    slave-checkpoint-group                 // 隔几个事务做一次                
    checkpointslave-checkpoint-period      // 隔多长时间做一次      
    checkpointslave-pending-jobs-size-max  // 分发给worker的,处于等待状态的event的大小上限
    

    MySQL5.6基于库级别的并发复制可以解决业务表放在不同的database同步延迟的问题,但是在实际生产中大部分表还是放在同一个库中的,这种情况即使设置slave_parallel_workers,也无法进行并发,在高并发的情况下,依然会造成主从复制延迟.
    在MySQL5.7中,引入了新的并发复制方法,基于LOGICAL_CLOCK的并发复制,可以支持在一个database中,并发执行relaylog中的事务, 相同的二进制日志组在master上提交并行应用到slave节点上,没有跨数据库的限制,并且不需要把数据分割到多个数据库
    具体配置参数如下:

    slave-parallel-type=LOGICAL_CLOCK
    slave-parallel-workers=16
    master_info_repository=TABLE
    relay_log_info_repository=TABLE
    relay_log_recovery=ON
    

    在MySQL5.7中,已经解决了主从复制延迟的问题
    主库的DDL语句导致只读节点延迟-->
    原因1.只读节点与主库的DDL同步是串行进行,备库消耗主库DDL操作同样的执行时间.
    解决方法:无,执行之前考虑可能带来的影响
    原因2.只读节点上有一个执行时间非常长的查询正在执行,那么这个查询会堵塞来自主库的DDL,读节点表被锁,直到查询结束为止,进而导致了只读节点的数据延迟
    解决方法:把只读节点的查询操作杀掉,不使用"select *"命令查询

    相关文章

      网友评论

        本文标题:MySQL主从复制

        本文链接:https://www.haomeiwen.com/subject/mkqifqtx.html