docker配置主从mysql

396 阅读2分钟

在有些场景下需要用到主从mysql,本人采用了在docker下进行主从mysql的配置,由于我之前就装了一个mysql容器,所以没有采用docker_compose的方式装主从mysql,而是在原来的基础上再装一个mysql容器作为从库。

  • 先把之前的作为主库的mysql容器的本地持久化数据复制一份,重命名xxx-slave
  • 本地再起一个容器命名为mysql-slave,这里值得注意的是端口需要和主库区分
docker run --name=mysql-slave -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 -e TZ=Asia/Shanghai \
--mount type=bind,source="$(PWD)"/data,target=/var/lib/mysql mysql/mysql-server:5.6 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --explicit_defaults_for_timestamp=false 
  • 修改容器(主)配置,这里采用的是使用命令从docker容器内复制到外面,这样的话就不用在docker内安装vim

    • 复制容器内主库配置文件到宿主机
    docker cp {主容器id}:/etc/my.cnf /Users/xxx/Downloads
    
    • 修改配置
    vim my.cnf
    
    //打开后增加以下内容
    server-id=100 
    log-bin=mysql-bin
    
    • 复制修改后的配置到容器内主库
    docker cp /Users/xxx/Downloads/my.cnf {主容器id}:/etc  //容器外复制到容器内
    
    • 重启容器docker restart :id
  • 修改容器(从)配置

    • 同上
    • 修改配置
    server-id=101  
    log-bin=mysql-slave-bin 
    relay_log=edu-mysql-relay-bin
    
    • 同上
    • 同上
  • docker ps //查看运行中容器,获取容器id

  • 链接Master(主)和Slave(从)

    • 进入主容器
      • docker exec -it {主容器id} /bin/bash
      • mysql -uroot -p //进入mysql
      • CREATE USER 'slave'@'%' IDENTIFIED BY '123456'; //创建一个用于从库链接的用户
      • GRANT REPLICATION SLAVE, REPLICATION CLIENT ON . TO 'slave'@'%';//给这个用户配置权限
      • show master status; //查看主库信息,后面配置用到
    • 新建一个terminal,查看主容器ip,后面配置用到

    docker inspect --format='{{.NetworkSettings.IPAddress}}' {主容器id}

    • slave容器下,mysql下执行
    change master to master_host='',master_port=,master_user='slave', master_password='123456', master_log_file='', master_log_pos= , master_connect_retry=60;
    
    • master_host :Master的地址,指的是容器的独立ip
    • master_port:Master的端口号,指的是容器的端口号
    • master_user:用于数据同步的用户
    • master_password:用于同步的用户的密码
    • master_log_file:指定 Slave 从哪个日志文件开始复制数据,即之前 File 字段
    • master_log_pos:从哪个 Position 开始读,即之前 Position 字段的值
    • master_connect_retry:如果连接失败,重试的时间间隔,单位是秒,默认是60秒
    • start slave; // 开启从库
    • show slave status \G; //查看链接状态

Slave_IO_Running和Slave_SQL_Running都为yes时配置成功

  • 测试

    • 主库新插入一条新数据
    • 从库刷新发现没有同步
    • 从库show master status; 发现SQL_Delay!=0,等待SQL_Delay=0
    • 从库刷新,发现从库同步了
  • 设置延迟从库你希望延迟的时间

CHANGE MASTER TO MASTER_DELAY = 15;  //延迟15s