MYSQL主从复制 Docker快速实现

前言

mysql 主从原理是通过binlog文件来传递主库的修改的

操作

  • 下载mysql镜像

    1
    docker pull mysql:5.7.18
  • 准备一份my.cnf,这个版本的镜像里的mysql配置文件在 /etc/mysql/mysql.conf.d/mysqld.cnf,可以从容器中使用docker cp复制出来修改, 复制出两个文件 mysqld.master.cnf,mysqld.slave.cnf

    1
    2
    3
    4
    5
    6
    # 文件 mysqld.master.cnf 添加内容
    .... 省略内容
    [mysqld]
    log-bin = mysql-bin # master一定要开启binlog
    server-id = 1 # 实例唯一的id,跟从库不一样就行
    .... 省略内容
    1
    2
    3
    4
    5
    6
    # 文件 mysqld.slave.cnf 添加内容
    .... 省略内容
    [mysqld]
    log-bin = mysql-bin # 开启binlog
    server-id = 2 # 实例唯一的id,跟主库不一样就行
    .... 省略内容
  • 创建容器

    1
    2
    3
    4
    # 启动master
    docker run -d -p 3306:3306 -v /Users/所在文件夹/mysqld.master.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf -e MYSQL_ROOT_PASSWORD=123456 --name mysql-master mysql:5.7.18
    # 启动从库 从库在宿舍既可以换个端口,也可以是用 -p 3306 让宿主机随机一个端口
    docker run -d -p 3307:3306 -v /Users/所在文件夹/mysqld.slave.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf -e MYSQL_ROOT_PASSWORD=123456 --name mysql-slave mysql:5.7.18
  • 进入mysql主从配置

    1
    2
    3
    4
    5
    6
    # 进入容器命令
    docker exec -it mysql-master bash
    docker exec -it mysql-slave bash

    # 进入mysql
    mysql -uroot -p123456
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    -- master登录进入容器内mysql,添加用户用于主从复制
    GRANT REPLICATION SLAVE ON *.* TO 'follow'@'%' identified by 'follow';
    -- 刷新权限
    FLUSH PRIVILEGES;
    -- 查看binlog的文件名和位置,用于从库配置连接时指定文件和位置时使用
    show master status;
    +------------------+----------+--------------+------------------+-------------------+
    | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    +------------------+----------+--------------+------------------+-------------------+
    | mysql-bin.000003 | 439 | | | |
    +------------------+----------+--------------+------------------+-------------------+

    master的ip地址可以在master机器上使用ip addr,也可以使用docker inspect 容器id 查看

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    -- 从库 进入容器内,连接主库
    change master to
    master_host = '172.17.0.2',
    master_user = 'follow',
    master_log_file = 'mysql-bin.000003',
    master_log_pos = 439,
    master_port = 3306,
    master_password = 'follow';
    -- 启动
    start slave;
    -- 查看状态
    show slave status;
    -- 重点查看 Slave_IO_Running与Slave_SQL_Running 是否为YES