主从复制

传统方式:基于主库的bin-log将日志事件和事件位置复制到从库,从库再加以 应用来达到主从同步的目的。
GTID方式:(Global transaction identifiers)是基于事务来复制数据,因此也就不依赖日志文件位置,同时又能更好的保证主从库数据一致性。

  • 在宿主创建两个目录

    1
    mkdir /usr/mysql/master /usr/mysql/slave
  • 创建一个用于复制配置文件的容器,复制出来两份配置文件,然后顺手删掉

    1
    2
    3
    4
    5
    docker run -d --name="mysql_copy" -p 23306:3306 mysql
    docker cp mysql_copy:/etc/mysql/my.cnf /usr/mysql/master/my.cnf
    docker cp mysql_copy:/etc/mysql/my.cnf /usr/mysql/slave/my.cnf
    docker stop mysql_copy
    docker rm mysql_copy
  • 修改文件内容

    master slave
    1
    2
    3
    [mysqld]
    server-id=1
    log-bin=mysql-bin
    保证 server-id 唯一
    log-bin 开启二进制日志功能
    1
    2
    3
    [mysqld]
    server-id=2
    log-bin=mysql-slave-bin
    Slave也开启 log-bin
    以备作为其它Slave的Master时使用
  • 启动容器,并使用宿主目录的配置文件

    1
    2
    docker run -d --name="mysql_master" -p 23306:3306 -v /usr/mysql/master/my.cnf:/etc/mysql/my.cnf -e MYSQL_ROOT_PASSWORD="root" mysql
    docker run -d --name="mysql_slave" -p 23307:3306 -v /usr/mysql/slave/my.cnf:/etc/mysql/my.cnf -e MYSQL_ROOT_PASSWORD="root" mysql
  • 可以给master端添加一个专门用作slave的用户
    授予 REPLICATION SLAVE 权限和 REPLICATION CLIENT 权限

    1
    2
    CREATE USER 'slave'@'%' IDENTIFIED BY 'slave';
    GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
  • slave端执行下面的SQL 停止/设置/开启/显示 同步状态

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    STOP SLAVE;

    CHANGE MASTER TO
    MASTER_HOST='172.17.0.2',
    MASTER_PORT=3306,
    MASTER_USER='root',
    MASTER_PASSWORD='root',
    master_log_pos=0;

    START SLAVE;

    SHOW SLAVE STATUS;
参数 说明
master_host Master的地址,指的是容器的独立ip,可以通过 docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称/容器id 查询容器的ip
master_port Master的端口号,指的是容器的端口号,如果是docker,应该为3306,我使用23306连接了好久QAQ…
master_user 用于数据同步的用户
master_password 用于同步的用户的密码
master_log_file 指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值
master_log_pos 从哪个 Position 开始读,即上文中提到的 Position 字段的值
master_connect_retry 如果连接失败,重试的时间间隔,单位是秒,默认是60秒

读写分离