美文网首页程序员
分布式专题|面试官问我了解Mysql主从复制原理么,我能说不会么

分布式专题|面试官问我了解Mysql主从复制原理么,我能说不会么

作者: AI码师 | 来源:发表于2020-11-22 21:54 被阅读0次

    搭建Mysql主从同步之前,我们先来说他们之间同步的过程与原理:

    同步复制过程

    献上一张图,这张图诠释了整个同步过程


    在这里插入图片描述

    主从复制过程:

    • slave节点与主节点进行连接,建立主从关系,并把从哪开始同步,及哪个日志文件都一并发送到master
    • master将修改的数据保存到binlog中
    • master开启binlog dump线程,将binlog日志推送到连接的slave中
    • slave接受到推送的binlog,slave开启IO线程将数据写到中继日志(relay log)中
    • slave同时还会开启一个SQL线程,对比中继日志中新增的内容,并且解析SQL,回放数据到从数据库中

    好的,复制过程已经说完了,我们现在实践下,快速搭建一个mysql主从架构。

    没错,我这里还是使用docker搭建,因为它很香啊!

    搭建Mysql 主从

    创建mysql网络

    docker network create mysqlNet
    

    安装mysql

    • 运行mysql主节点
    docker run -p 3306:3306 --name mysql_master -h mysql_master --net=mysqlNet \
        -v ~/docker/mysql/mysql_master/log:/var/log/mysql \
        -v ~/docker/mysql/mysql_master/data:/var/lib/mysql \
        -v ~/docker/mysql/mysql_master/conf:/etc/mysql  \
        -e lower_case_table_names=1 \
        -e MYSQL_ROOT_PASSWORD=root \
        -d mysql:5.7
    
    • 修改配置文件
    # 编辑文件
    vim ~/docker/mysql/mysql_master/conf
    
    [client]
    default-character-set=utf8
    [mysql]
    default-character-set=utf8
    [mysqld]
    init_connect='SET collation_connection=utf8_unicode_ci'
    init_connect='SET NAMES utf8'
    character-set-server=utf8
    collation-server=utf8_unicode_ci
    skip-character-set-client-handshake
    skip-name-resolve
    ## 同一局域网内注意要唯一
    server-id=1  
    ## 开启二进制日志功能,可以随便取(关键)
    log-bin=mysql-bin
    
    • 重启mysql_master
    docker restart mysql_master
    
    • 在master节点上 创建给从节点进行复制的用户
    docker exec -it mysql_master mysql -uroot -proot
    # 创建用户
    CREATE USER 'mysql_slave'@'%' IDENTIFIED BY '111111';
    # 授权
    GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'mysql_slave'@'%';
    
    • 运行mysql从节点
    docker run -p 33306:3306 --name mysql_slave -h mysql_slave --net=mysqlNet \
        -v ~/docker/mysql/mysql_slave/log:/var/log/mysql \
        -v ~/docker/mysql/mysql_slave/data:/var/lib/mysql \
        -v ~/docker/mysql/mysql_slave/conf:/etc/mysql  \
        -e lower_case_table_names=1 \
        -e MYSQL_ROOT_PASSWORD=root \
        -d mysql:5.7
    
    • 编辑从节点配置文件
    # 编辑文件
    vim ~/docker/mysql/mysql_master/conf
    
    [client]
    default-character-set=utf8
    [mysql]
    default-character-set=utf8
    [mysqld]
    init_connect='SET collation_connection=utf8_unicode_ci'
    init_connect='SET NAMES utf8'
    character-set-server=utf8
    collation-server=utf8_unicode_ci
    skip-character-set-client-handshake
    skip-name-resolve
    ## 设置server_id,注意要唯一
    server-id=2 
    ## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
    log-bin=mysql-slave-bin   
    ## relay_log配置中继日志
    relay_log=edu-mysql-relay-bin
    ## 设置只读权限
    read_only = 1
    innodb_read_only
    ## 使得更新的数据写进二进制日志中
    log_slave_updates = 1
    #如果master库名与salve库名不同,使用以下配置[需要做映射]
    #replicate-rewrite-db = [主库名] -> [从库名]
    #如果不是要全部同步[默认全部同步],则指定需要同步的表
    #replicate-wild-do-table=库名.表1
    #replicate-wild-do-table=库名.表2
    

    现在主从节点已经安装完成,我们接下来需要让他们建立关系:

    先查看master节点当前的状态,主要看下日志文件和当前的位置

    docker exec -it mysql_master mysql -uroot -proot
    show master status;
    exit
    exit
    

    结果如下:文件为mysql-bin.000001 位置为629

    image.png

    拿到这些信息之后,我们现在就可以让从节点与主节点建立关系,并执行同步了:

    docker exec -it mysql_slave mysql -uroot -proot
    change master to master_host='mysql_master', master_user='mysql_slave', master_password='111111', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos= 629, master_connect_retry=30;
    

    我们继续看下slave节点的状态

    show slave status\G;
    
    image.png

    我们看到我们在文首提到的两个线程并没有启动,所以我们需要手动启动着两个线程,一个命令就好了

    start slave;
    
    image.png

    现在可以看到两个线程已经在运行了。
    到此,已经搭建完成了

    测试

    这个我就不演示了,大家可以在mysql_master上创建一个数据库,看看是不是会同步到mysql_slave上。

    相关文章

      网友评论

        本文标题:分布式专题|面试官问我了解Mysql主从复制原理么,我能说不会么

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