10 August 2022

mysql主从复制并不是数据库从磁盘上文件直接拷贝,而是通过mysql的binlog日志复制到要同步的服务器本地,然后在本地的mysql线程读取日志里面的sql语句,重新应用到mysql数据库中。


主从复制应用场景

  • 1.从服务器作为主服务器的实时数据备份

    为了增强架构的健壮性,当主服务宕机时,自动切换到从服务器上。维持程序的稳定性。

  • 2.主从复制实现读写分离,从服务器实现负载均衡

    主从服务器可以通过程序来实现主从读写分离,更新数据的业务在主库上进行操作,查询的请求去从库查询。

  • 3.把多个从服务器根据业务重要性进行拆分

    比如,有为供外部访问的web服务器,也有内部DBA用来数据备份的从服务器,还有公司内部oa系统的服务器等,分离开后,降低单服务器的访问压力。也不至于影响整体的业务。


过程描述

  • 1)主库db的更新事件(update、insert、delete)被写到binlog

  • 2)主库创建一个binlog dump thread,把binlog的内容发送到从库

  • 3)从库启动并发起连接,连接到主库

  • 4)从库启动之后,创建一个I/O线程,读取主库传过来的binlog内容并写入到relay log

  • 5)从库启动之后,创建一个SQL线程,从relay log里面读取内容,从Exec_Master_Log_Pos位置开始执行读取到的更新事件,将更新内容写入到slave的db

主从复制实战

1.利用docker生成mysql-master主机镜像,以及创建好容器。

    docker run -p 3307:3306 --name mysql-master \
    -v /Users/lee/docker/mydata/mysql-slave/log:/var/log/mysql \
    -v /Users/lee/docker/mydata/mysql-slave/data:/var/lib/mysql \
    -v /Users/lee/docker/mydata/mysql-slave/conf:/etc/mysql \
    -e MYSQL_ROOT_PASSWORD=root \
    -d mysql:5.7

2.配置mysql-master文件配置。my.cnf。

    [mysqld]
    # 设置server-id,局域网中需要唯一
    server_id=101
    ## 指定不需要同步的数据库名
    binlog-ignore-db=mysql
    ##开启二进制日志功能
    log-bin=mall-mysql-bin
    ## 设置二进制日志使用缓存大小
    binlog_cache_size=1M
    # 设置使用二进制日志格式
    binlog_format=mixed
    # 二进制日志过期清理时间
    expire_logs_days=7
    #跳过主从复制中遇到的错误类型
    slave_skip_errors=1062

3.进入mysql-master主机容器,创建主从复制的账号。

    docker exec -it mysql-master /bin/bash .  # 进入容器

    # 创建mysql账号
    create user 'slave'@'%' identified by '123456';
    grant replication slave , replication client on *.* to 'slave'@'%';

4.利用docker生成mysql-slave主机镜像,并创建好容器。

    docker run -p 3308:3306 --name mysql-slave \
    -v /Users/lee/docker/mydata/mysql-slave/log:/var/log/mysql \
    -v /Users/lee/docker/mydata/mysql-slave/data:/var/lib/mysql \
    -v /Users/lee/docker/mydata/mysql-slave/conf:/etc/mysql \
    -e MYSQL_ROOT_PASSWORD=root \
    -d mysql:5.7

5.配置mysql- slave相关配置

    [mysqld]
    # 设置server-id,局域网中需要唯一
    server_id=102
    ## 指定不需要同步的数据库名
    binlog-ignore-db=mysql
    ##开启二进制日志功能
    log-bin=mall-mysql-bin
    ## 设置二进制日志使用缓存大小
    binlog_cache_size=1M
    # 设置使用二进制日志格式
    binlog_format=mixed
    # 二进制日志过期清理时间
    expire_logs_days=7
    #跳过主从复制中遇到的错误类型
    slave_skip_errors=1062
    #配置中继日志 relay_log
    relay_log=mall-mysql-relay-bin
    #slave将复制事件写入自己的二进制日志
    log_slave_updates=1
    #slave 设置为只读
    read_only=1

6.进入mysql-slave主机,并且关联上mysql-master主机。

    # 从库关联主库
    change master to master_host="主机ip", master_user='slave', master_password='123456',master_port=3307,master_log_file='mall-mysql-bin.000002', master_log_pos=617,master_connect_retry=30; 

    demo: change master to master_host="192.168.31.52", master_user='slave', master_password='123456',master_port=3307,master_log_file='mall-mysql-bin.000002', master_log_pos=617,master_connect_retry=30; 

7.从库中开启主从同步,查看从库是否开启。

    start slave;
    show  slave status \G;

8.测试主从同步。