任意目录下新建一个文件夹
mkdir mysql
创建docker-compose文件
vim docker-compose.yml
version: '3'
networks:
mysql-net:
external: true
services:
mysql1:
image: mysql:8.0.31
container_name: mysql-master
environment:
MYSQL_ROOT_PASSWORD: "66668888"
ports:
- "16306:3306"
networks:
- mysql-net
volumes:
- ./data/master:/var/lib/mysql
command: --default-authentication-plugin=mysql_native_password
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--explicit_defaults_for_timestamp=true
--lower_case_table_names=1
--max_allowed_packet=128M
# 做主从复制的话所有服务的server_id一定不能一样
--server-id=1
--log-bin=master
--binlog_format=row
restart: unless-stopped
mysql2:
image: mysql:8.0.31
container_name: mysql-slave1
environment:
MYSQL_ROOT_PASSWORD: "66668888"
server-id: 2
ports:
- "17306:3306"
networks:
- mysql-net
volumes:
- ./data/slave1:/var/lib/mysql
command: --default-authentication-plugin=mysql_native_password
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--explicit_defaults_for_timestamp=true
--lower_case_table_names=1
--max_allowed_packet=128M
--server-id=2
restart: unless-stopped
mysql3:
image: mysql:8.0.31
container_name: mysql-slave2
environment:
MYSQL_ROOT_PASSWORD: "66668888"
server-id: 3
ports:
- "18306:3306"
networks:
- mysql-net
volumes:
- ./data/slave2:/var/lib/mysql
command: --default-authentication-plugin=mysql_native_password
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--explicit_defaults_for_timestamp=true
--lower_case_table_names=1
--max_allowed_packet=128M
--server-id=3
restart: unless-stopped
创建挂载文件夹
mkdir data
进入data目录
cd data/
创建三个容器(一主两从)的挂载文件夹
mdkir master slave1 slave2
进入master容器
docker exec -it mysql-master /bin/bash
# 连接mysql服务
mysql -u root -p
# 输入docker-compose中设置的密码,我这里是66668888
连接成功后执行下面脚本
--创建主从复制得用户(slave是用户名,66668888是密码,改成自己的即可)
CREATE USER 'slave'@'%' IDENTIFIED BY '66668888';
GRANT REPLICATION slave, REPLICATION CLIENT ON *.* TO 'slave'@'%';
--查看主数据库的状态
show master status;
图片的的 file 和 position 是连接主从的关键,记录下来
依次进入slave1和slave2,分别执行
# 把容器名切换了
docker exec -it mysql-slave1 /bin/bash
# 连接mysql服务
mysql -u root -p
# 输入docker-compose中设置的密码,我这里是66668888
--从机连接master
--change master to master_host='master所在的ip地址', master_user='创建的用于同步数据的用户账户', master_password='主数据库创建得用户密码', master_port='master得运行端口', master_log_file='File参数', master_log_pos=Position参数', master_connect_retry='连接失败重试的时间间隔';
change master to master_host='192.168.31.114', master_user='slave', master_password='66668888', master_port=16306, master_log_file='mysql-bin.000005', master_log_pos=157, master_connect_retry=30;
--在从数据库中开启主从同步
start slave;
--查看从数据库状态
show slave status \G
当圈出来的这两个参数值为yes,就阔以了
PS:
当Slave_IO_Running: NO的时候,
--先停止主从同步
--两台从机都停止
stop slave;
-- 这下面是在master执行
-- 这下面是在master执行
--刷新日志,指定从数据库要复制日志得日志文件,通过查看主数据库得状态,File参数
--指定从那个位置开始复制数据,通过查看主数据库得状态Position参数,不要单引号
flush logs;
--查看主数据库的状态
show master status;
--刷新后file的参数值会加1
-- 这下面是在slave执行
-- 这下面是在slave执行
--填入从机连接master的命令重新执行即可
--只要变更master_log_file和aster_log_pos
change master to master_host='192.168.31.114', master_user='slave', master_password='66668888', master_port=16306, master_log_file='mysql-bin.000005', master_log_pos=157, master_connect_retry=30;
--在从数据库中开启主从同步
start slave;