在有些场景下需要用到主从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/bashmysql -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