任意目錄下新建一個文件夾
mkdir mysql
創(chuàng)建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
創(chuàng)建掛載文件夾
mkdir data
進入data目錄
cd data/
創(chuàng)建三個容器(一主兩從)的掛載文件夾
mdkir master slave1 slave2
進入master容器
docker exec -it mysql-master /bin/bash
# 連接mysql服務
mysql -u root -p
# 輸入docker-compose中設置的密碼,我這里是66668888
連接成功后執(zhí)行下面腳本
--創(chuàng)建主從復制得用戶(slave是用戶名,66668888是密碼,改成自己的即可)
CREATE USER 'slave'@'%' IDENTIFIED BY '66668888';
GRANT REPLICATION slave, REPLICATION CLIENT ON *.* TO 'slave'@'%';
--查看主數(shù)據(jù)庫的狀態(tài)
show master status;
圖片的的 file 和 position 是連接主從的關鍵,記錄下來

image.png
依次進入slave1和slave2,分別執(zhí)行
# 把容器名切換了
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='創(chuàng)建的用于同步數(shù)據(jù)的用戶賬戶', master_password='主數(shù)據(jù)庫創(chuàng)建得用戶密碼', master_port='master得運行端口', master_log_file='File參數(shù)', master_log_pos=Position參數(shù)', 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;
--在從數(shù)據(jù)庫中開啟主從同步
start slave;
--查看從數(shù)據(jù)庫狀態(tài)
show slave status \G

image.png
當圈出來的這兩個參數(shù)值為yes,就闊以了
PS:
當Slave_IO_Running: NO的時候,
--先停止主從同步
--兩臺從機都停止
stop slave;
-- 這下面是在master執(zhí)行
-- 這下面是在master執(zhí)行
--刷新日志,指定從數(shù)據(jù)庫要復制日志得日志文件,通過查看主數(shù)據(jù)庫得狀態(tài),File參數(shù)
--指定從那個位置開始復制數(shù)據(jù),通過查看主數(shù)據(jù)庫得狀態(tài)Position參數(shù),不要單引號
flush logs;
--查看主數(shù)據(jù)庫的狀態(tài)
show master status;
--刷新后file的參數(shù)值會加1
-- 這下面是在slave執(zhí)行
-- 這下面是在slave執(zhí)行
--填入從機連接master的命令重新執(zhí)行即可
--只要變更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;
--在從數(shù)據(jù)庫中開啟主從同步
start slave;