DockerCompose实现MySQL主从复制(GTID)
·
mkdir -p /data/mysql-cluster/{master/conf,master/data,slave/conf,slave/data}
cd /data/mysql-cluster/
#① 创建主库配置文件
cat << 'EOF' > master/conf/my.cnf
[mysqld]
server-id=110 # 主库唯一ID
log-bin=mysql-bin # 开启二进制日志
binlog_format=ROW # GTID 必须使用 ROW 格式
# GTID 核心配置
gtid_mode=ON # 开启 GTID 模式
enforce_gtid_consistency=ON # 强制 GTID 一致性检查
# 基础配置
default-authentication-plugin=mysql_native_password # 降低主从认证复杂度
character-set-server=utf8mb4
EOF
#② 创建从库配置文件
cat << 'EOF' > slave/conf/my.cnf
[mysqld]
server-id=120 # 从库唯一ID,不能与主库冲突
log-bin=mysql-bin # 从库也开启binlog,方便以后做级联或主备切换
binlog_format=ROW
# GTID 核心配置
gtid_mode=ON
enforce_gtid_consistency=ON
# 从库专有配置
relay-log=mysql-relay-bin # 开启中继日志
skip-replica-start=1 # 关键:防止容器启动时自动连接主库导致报错,等我们配置完再启动
# 基础配置
default-authentication-plugin=mysql_native_password
character-set-server=utf8mb4
EOF
vim docker0-compose.yml
version: '3.8'
services:
mysql-master:
image: mysql:8.0
container_name: mysql-master
restart: always
environment:
MYSQL_ROOT_PASSWORD: rootpassword123 # 主库 root 密码
ports:
- "3316:3306"
volumes:
- ./master/conf/my.cnf:/etc/mysql/my.cnf
- ./master/data:/var/lib/mysql
networks:
- mysql-net
mysql-slave:
image: mysql:8.0
container_name: mysql-slave
restart: always
depends_on:
- mysql-master
environment:
MYSQL_ROOT_PASSWORD: rootpassword123 # 从库 root 密码
ports:
- "3307:3306"
volumes:
- ./slave/conf/my.cnf:/etc/mysql/my.cnf
- ./slave/data:/var/lib/mysql
networks:
- mysql-net
networks:
mysql-net:
driver: bridge
#启动编排工具
docker compose up -d
docker exec -it mysql-master mysql -uroot -prootpassword123
-- 1. 彻底清理可能存在的旧残留
DROP USER IF EXISTS 'repl'@'%';
-- 2. 重新创建账号(密码必须跟你在从库配置的 'ReplPassword123' 严格一致,注意大小写)
CREATE USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'ReplPassword123';
-- 3. 赋予复制权限
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
-- 4. 刷新权限使其生效
FLUSH PRIVILEGES;
-- 5. 退出主库
EXIT;
docker exec -it mysql-master/mysql-slave mysql -uroot -prootpassword123
CHANGE MASTER TO
MASTER_HOST='mysql-master',
MASTER_PORT=3306,
MASTER_USER='repl',
MASTER_PASSWORD='ReplPassword123',
MASTER_AUTO_POSITION=1;
START SLAVE;
docker exec -it mysql-slave mysql -uroot -prootpassword123 -e "STOP SLAVE; START SLAVE;"
docker exec -it mysql-slave mysql -uroot -prootpassword123 -e "SHOW SLAVE STATUS\G" | grep -E "Slave_IO_Running|Slave_SQL_Running"
#验证
docker exec -it mysql-master mysql -uroot -prootpassword123 -e "
CREATE DATABASE IF NOT EXISTS gu_world;
USE gu_world;
CREATE TABLE IF NOT EXISTS characters (id INT PRIMARY KEY, name VARCHAR(50));
INSERT INTO characters VALUES (1, '古月方源');
"
docker exec -it mysql-slave mysql -uroot -prootpassword123 -e "SELECT * FROM gu_world.characters;"
更多推荐
所有评论(0)