Docker实现MySQL8主从读写分离【超简洁】
1、首先拉取镜像
docker pull mysql
2、创建主库容器
docker run -p 3388:3306 --name master -e MYSQL_ROOT_PASSWORD=123456 -d mysql --server-id=1 --log-bin=bin-log --binlog-do-db=znzm-dlaq
说明:
- docker run 表示创建并运行容器
- -p 3388:3306 把宿主机的3388端口映射到容器的3306端口
- --name master 表示给这个容器取个名字叫 master
- -e MYSQL_ROOT_PASSWORD=123456 设置 root 用户的密码
- -d mysql 字母d是detach的首字母,表示后台静默运行
- --server-id=1 设置唯一id
- --log-bin=bin-log 设置binlog日志文件名,因为主从复制是通过这个日志来传输
- --binlog-do-db=znzm-dlaq 对应要复制的数据名(!主从读写分离主要使用该数据库)
3、创建从库容器
docker run -p 3389:3306 --name slave -e MYSQL_ROOT_PASSWORD=123456 -d mysql --server-id=2 --relay-log=mysql-relay --read-only=1
说明:
--server-id=2
设置唯一id--relay-log=mysql-relay
relay-log日志文件名,因为主从复制时去主库复制过来后,会先写入这个本机日志,然后再写入sql库里--read-only=1
表示从库,只读不能写
4、在master主库中创建主从读写分离账户
进入主库,密码是123456
docker exec -it master /bin/bash
mysql -u root -p
下面是创建主从读写分离账户,可自定义:
# 创建一个用户名slave1,密码123456
CREATE USER 'slave1'@'%' IDENTIFIED BY '123456';
# 授权
GRANT REPLICATION SLAVE ON *.* TO 'slave1'@'%';
#此语句必须执行。否则报错
ALTER USER 'slave1'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
# 使权限生效
flush privileges;
查询主库的状态,并记录下File和Position的值,下面从库连接主库时要用。
show master status;
Crtl+D退出容器,查看主库容器本地ip。
docker inspect --format={{.NetworkSettings.IPAddress}} master
5、进入slave从库中,配置主从连接
进入从库,密码是123456
docker exec -it slave /bin/bash
mysql -u root -p
配置主从连接
CHANGE MASTER TO MASTER_HOST='172.17.0.2', MASTER_PORT=3306,MASTER_USER='slave1', MASTER_PASSWORD='123456', MASTER_LOG_FILE='bin-log.000003', MASTER_LOG_POS=1145;
说明:
- MASTER_HOST='172.17.0.2' 本机容器的ip
- MASTER_PORT=3306 容器的ip
- MASTER_LOG_FILE='bin-log.000003' 主库File
- MASTER_LOG_POS=1145; 主库Position
启动主从同步:
START SLAVE;
执行sql语句,检查主从同步是否搭建成功
SHOW SLAVE STATUS\G;
如果有异常,请停止主从同步后,重新配置
stop slave;
reset slave;
6、在主库中创建znzm-dlaq数据库测试从库是否同步
!!!注意:是从库读取主库的日志来操作,不要颠倒