MySQL主从复制

作者: 烤奶要加冰 | 来源:发表于2019-11-30 17:00 被阅读0次

    什么是主从复制?

    指的是一台MySQL数据库服务器当主机,另一台或多台数据库服务器当从机,主机负责主要写入数据,从机负责只能读取数据。

    主从复制的原理是什么?

    MySQL服务器之间的主从复制主要是通过二进制日志文件实现的,主机负责使用二进制日志文件记录数据库数据的变化情况,而从机通过读取和执行二进制日志文件来保持与主机的数据一致。

    主从复制有什么优点?

    • 因为读数据、写数据在不同服务器中执行的,分摊了读写数据在同一台服务器的压,使得数据库的读写分离,提高了数据读写的性能
    • 从机与主机保持着数据的一致,可以在服务器上备份而不破坏主机相应的数据,提高数据的安全性
    • 当主机宕机时,便会将一台从机作为主机,继续运行而不影响数据的读写

    MySQL主从复制流程

    下面流程是在阿里云服务器中配置,使用了docker拉取MySQL镜像,创建两个不同端口的MySQL容器。

    ①准备两台MySQL服务器(一台作为主机,另一台作为从机)
    • 创建master服务器(主机)
    sudo docker run --name mysql_master -p 3307:3306  -d mysql:5.7.22 -e 
    MYSQL_ROOT_PASSWORD=123456 
    

    mysql:5.7.22:表示拉取镜像的版本,建议使用5.7版本,比较稳定。
    MYSQL_ROOT_PASSWORD:表示设置数据库的密码,创建时一定要自定义密码。
    -p:表示绑定端口,冒号前是可以通过外网访问的端口,冒号后是数据库服务的端口。

    tips:自己的服务器中不会创建新的端口,需要自己去添加新的端口才能创建成功。

    • 创建slave服务器(从机)
    sudo docker run --name mysql_slave -p 3308:3306 -d mysql:5.7.22 -e 
    MYSQL_ROOT_PASSWORD=123456 
    
    • 检查是否创建成功
    sudo docker ps
    

    若可以看到刚刚创建的容器,并正在运行中,则表示创建成功;否则,删除容器重新创建。


    ②配置主服务器
    • 首先先进入名为mysql_master容器
    sudo docker exec -it mysql_master /bin/bash
    
    • 修改配置文件 /etc/mysql/mysql.conf.d/mysqld.conf
    # 在末尾加上两个配置
    
    ## 设置server_id,一般设置为IP的最后一位,同一局域网内注意要唯一
    server_id = 3
    
    ## 开启二进制日志功能,可以随便取,最好有含义(关键就是这里了)
    log-bin = edu-mysql-bin
    

    log-bin:表示开启二进制日志功能,名字取得要有意义(关键配置)
    server_id:主机的id,这个的值一定要是唯一的。

    tips:若没有vim命令,则需要进行安装。
    ①apt-get update
    ②apt install vim

    • 配置完成后重启 mysql
    service mysql restart
    
    • 重新打开容器
    docker container start mysql_master
    
    • 进入mysql数据库中创建数据同步用户
    mysql -u root -p -h xx.xxx.xxx.xxx --port=3307
    
    CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
    GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%'; 
    

    -h:该参数的值需要更改,改为自己服务器的外网ip地址

    ③ 配置slave服务器
    • 首先先进入名为mysql_slave容器
    sudo docker exec -it mysql_slave /bin/bash
    
    • 修改配置文件 /etc/mysql/mysql.conf.d/mysqld.conf
    # 在末尾加上两个配置
    
    ## 设置server_id,一般设置为IP的最后一位,同一局域网内注意要唯一
    server_id = 4
    
    ## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
    log-bin = edu-mysql-bin
    

    tips:在slave中,可以不用配置参数 log-bin,若要配置必须要与主机的值相同。该参数的作用:当主机宕机时,会选择参数中配置该参数的从机作为新的主机。

    • 重启服务,重启容器
    service mysql restart
    
    docker container start mysql_slave
    
    ④完成Master和Slave链接
    • 进入主机,查看主机状态
    mysql -u root -p -h xx.xxx.xxx.xxx --port=3307
    
    show master status;
    

    注意:记录下 File 和 Position 字段的值,后面需要使用
    • 进入从机进行连接
    mysql -u root -p -h xx.xxx.xxx.xxx --port=3308
    
    change master to master_host='xx.xxx.xxx.xxx', master_user='slave', master_password='123456', 
    master_port=3307, master_log_file='edu-mysql-bin.000001', master_log_pos=34659, 
    master_connect_retry=30;
    

    master_host: Master 的IP地址
    master_user: 在 Master 中授权的用于数据同步的用户
    master_password:同步数据的用户的密码
    master_port: Master 的数据库的端口号
    master_log_file: 指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值
    master_log_pos: 从哪个 Position 开始读,即上文中提到的 Position 字段的值

    • 查看从机同步状态
    show slave status \G;
    

    Slave_IO_RunningSlave_SQL_Running的值都为No时,表示还没有开始复制过程,若都为Yes则表示开始复制过程。
    • 开始主从复制
    start slave;
    

    tips:测试方法,使用Navicat分别连接主从数据库,在主机写入数据,当从机同步到主机数据时,则表示主从复制成功。



    相关文章:
    Django实现读写分离教程
    打开MySQL数据库日志文件

    相关文章

      网友评论

        本文标题:MySQL主从复制

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