docker部署MySQL主从服务集群

创建目录

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;
相关推荐
剩下了什么几秒前
MySQL JSON_SET() 函数
数据库·mysql·json
java搬砖工-苤-初心不变1 小时前
MySQL 主从复制配置完全指南:从原理到实践
数据库·mysql
lpruoyu2 小时前
【Docker进阶-03】存储原理
docker·容器
WangYaolove13142 小时前
基于python的在线水果销售系统(源码+文档)
python·mysql·django·毕业设计·源码
文静小土豆3 小时前
Docker 与 containerd 代理配置详解:镜像拉取速度慢的终极解决方案
运维·docker·容器
霖霖总总4 小时前
[小技巧66]当自增主键耗尽:MySQL 主键溢出问题深度解析与雪花算法替代方案
mysql·算法
JY.yuyu5 小时前
Docker常用命令——数据卷管理 / 端口映射 / 容器互联
运维·docker·容器
lpruoyu5 小时前
【Docker进阶-06】docker-compose & docker swarm
运维·docker·容器
海奥华25 小时前
mysql索引
数据库·mysql
虾说羊6 小时前
docker容器化部署项目流程
运维·docker·容器