创建目录
sh
mkdir -p ~/mysql/mysql8-cluster/{master,slave1,slave2}/{conf,data,logs}
创建网络
sh
docker network create mysql-cluster-net
# 查看网络:docker network ls
配置文件
主库
~/mysql/mysql8-cluster/master/conf/my.cnf
cnf
[mysqld]
# 唯一标识(主从必须不同)
server-id=1
# 开启binlog,指定日志文件名前缀
log_bin=mysql-bin
# 二进制日志格式(row格式支持更精准的同步)
binlog_format=ROW
# 开启GTID(全局事务标识,自动跟踪binlog位置)
gtid_mode=ON
enforce_gtid_consistency=ON
# 忽略系统库同步(可选)
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
# 字符集配置
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
从库1
~/mysql/mysql8-cluster/slave1/conf/my.cnf
cnf
[mysqld]
# 唯一标识(与主库不同)
server-id=2
# 从库也可开启binlog(可选,用于级联复制)
log_bin=mysql-slave-bin
# 开启GTID(与主库保持一致)
gtid_mode=ON
enforce_gtid_consistency=ON
# 中继日志(从库用于暂存主库binlog)
relay_log=mysql-relay-bin
# 从库只读(避免误写,可选)
read_only=ON
# 字符集配置
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
从库2
~/mysql/mysql8-cluster/slave2/conf/my.cnf
cnf
[mysqld]
# 唯一标识(与主库不同)
server-id=3
# 从库也可开启binlog(可选,用于级联复制)
log_bin=mysql-slave-bin
# 开启GTID(与主库保持一致)
gtid_mode=ON
enforce_gtid_consistency=ON
# 中继日志(从库用于暂存主库binlog)
relay_log=mysql-relay-bin
# 从库只读(避免误写,可选)
read_only=ON
# 字符集配置
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
搭建MySQL服务
sh
-- 主服务
docker run -d --name mysql8-master --network mysql-cluster-net -p 3316:3306 -e MYSQL_ROOT_PASSWORD=123456 -v ~/mysql/mysql8-cluster/master/logs:/var/log/mysql -v ~/mysql/mysql8-cluster/master/conf:/etc/mysql/conf.d -v ~/mysql/mysql8-cluster/master/data:/var/lib/mysql mysql:8.0
-- 从服务器1
docker run -d --name mysql8-slave1 --network mysql-cluster-net -p 3317:3306 -e MYSQL_ROOT_PASSWORD=123456 -v ~/mysql/mysql8-cluster/slave1/logs:/var/log/mysql -v ~/mysql/mysql8-cluster/slave1/conf:/etc/mysql/conf.d -v ~/mysql/mysql8-cluster/slave1/data:/var/lib/mysql mysql:8.0
-- 从服务器2
docker run -d --name mysql8-slave2 --network mysql-cluster-net -p 3318:3306 -e MYSQL_ROOT_PASSWORD=123456 -v ~/mysql/mysql8-cluster/slave2/logs:/var/log/mysql -v ~/mysql/mysql8-cluster/slave2/conf:/etc/mysql/conf.d -v ~/mysql/mysql8-cluster/slave2/data:/var/lib/mysql mysql:8.0
主库创建复制用户
sh
# 进入主库容器
docker exec -it mysql-master bash
# 登录MySQL(输入上述ROOT密码)
mysql -u root -p
# 创建复制用户(允许从库连接,用户名:repl,密码:Repl@123)
CREATE USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'Repl@123';
# 授权复制权限
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
# 刷新权限
FLUSH PRIVILEGES;
# 查看主库状态(记录binlog文件和位置,备用)
SHOW MASTER STATUS;
配置从库连接主库
sh
# 进入从库容器
docker exec -it mysql-slave1 bash
# 登录MySQL
mysql -u root -p
# 配置主库连接信息(使用GTID简化配置)
CHANGE MASTER TO
MASTER_HOST='mysql8-master', # 主库容器名(同网络内可直接访问)或IP地址
MASTER_USER='repl', # 主库创建的复制用户
MASTER_PASSWORD='Repl@123', # 复制用户密码
MASTER_PORT=3306, # 主库容器内端口(默认3306)
MASTER_AUTO_POSITION=1; # 启用GTID自动定位binlog(无需手动填File和Position)
# 启动从库同步进程
START SLAVE;