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;
相关推荐
梦梦代码精8 小时前
开源AI应用平台BuildingAI解析:插件化架构、应用市场与热门案例
人工智能·机器学习·docker·开源
时间的拾荒人8 小时前
MySQL 视图详解
android·数据库·mysql
尽兴-9 小时前
企业数据库选型与演进:Oracle、达梦、MySQL 与分库分表实践
数据库·mysql·oracle·分库分表
IT瑞先生11 小时前
Docker快速部署Mysql的三种方法——实操篇
mysql·adb·docker
数据库小学妹11 小时前
MySQL在线DDL实战:ALGORITHM三种算法对比+gh-ost变更管理SOP
mysql·dba·数据库运维·在线ddl·mdl锁·sql变更管理
梦远青城11 小时前
Docker 部署python的paddle进行OCR文字识别身份证
python·docker·ocr·paddle·身份证识别
Ethan010712 小时前
隔离级别管读,乐观锁管写——RC/RR 与写冲突的本质
mysql
java_logo12 小时前
ELK Docker Compose 部署指南:轻松搭建日志检索平台
elk·elasticsearch·docker·容器·kibana·logstash·轩辕镜像
ShallWeL13 小时前
Orin 上用 Docker 跑通目标检测功能
人工智能·目标检测·docker·容器
熊文豪13 小时前
【金仓数据库征文】不装中间件的 MySQL→金仓在线迁移,mysql_fdw 全流程,和一个差点漏掉的 emoji
数据库·mysql·中间件·电科金仓