Docker学习路径——7、Docker搭建MySQL 主从复制

Docker 高可用实战:MySQL 主从复制(Master-Slave)搭建指南

在微服务架构中,数据库的高可用 与读写分离是保障系统稳定性的关键。MySQL 主从复制通过将主库(Master)的数据实时同步到从库(Slave),实现:

  • ✅ 数据冗余:主库故障时快速切换
  • ✅ 负载均衡:读请求分发到从库,减轻主库压力
  • ✅ 备份保障:从库可作为热备份

本文将手把手教你用 Docker 搭建 MySQL 5.7 主从集群,并解决网络配置、权限设置等常见陷阱。

环境说明:

  • 宿主机 IP:192.168.100.6(需替换为你的实际 IP)
  • 主库端口:3306
  • 从库端口:3307
  • MySQL 镜像:私有仓库 192.168.100.50:5000/mysql:5.7

一、主库(Master)搭建

步骤 1:创建目录结构

bash 复制代码
mkdir -p /opt/mysql/master/{data,log,conf}

步骤 2:启动主库容器

bash 复制代码
docker run -d \
  -p 3306:3306 \
  -v /opt/mysql/master/log:/var/log/mysql \
  -v /opt/mysql/master/data:/var/lib/mysql \
  -v /opt/mysql/master/conf:/etc/mysql/conf.d \
  -e MYSQL_ROOT_PASSWORD=000000 \
  --name mysqlmaster1 \
  192.168.100.50:5000/mysql:5.7

步骤 3:配置主库参数

编辑 /opt/mysql/master/conf/my.cnf:

ini 复制代码
[mysqld]
# 唯一服务器ID(主从必须不同)
server_id=1

# 启用二进制日志(复制的核心)
log_bin=mysql-bin

# 可选:指定要同步的数据库(不配置则同步所有)
# binlog_do_db=test_db

⚠️ 关键参数:

  • server_id:集群内唯一标识
  • log_bin:开启二进制日志,记录所有写操作

重启生效:

bash 复制代码
docker restart mysqlmaster1

步骤 4:创建复制专用用户

bash 复制代码
# 进入主库
docker exec -it mysqlmaster1 mysql -uroot -p000000

# 创建用户并授权
mysql> CREATE USER 'slave'@'%' IDENTIFIED BY '000000';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%';
mysql> FLUSH PRIVILEGES;

🔒 安全建议:

  • 限制从库 IP:'slave'@'192.168.100.%'
  • 使用强密码(非 000000)

步骤 5:记录主库状态(用于从库配置)

sql 复制代码
mysql> SHOW MASTER STATUS\G
*************************** 1. row ***************************
            File: mysql-bin.000005
        Position: 684
    Binlog_Do_DB: 
Binlog_Ignore_DB: 
Executed_Gtid_Set: 

记下 File 和 Position,后续从库配置需要!


二、从库(Slave)搭建

步骤 1:创建目录结构

bash 复制代码
mkdir -p /opt/mysql/slave/{data,log,conf}

步骤 2:启动从库容器

bash 复制代码
docker run -d \
  -p 3307:3306 \  # 映射到宿主机3307端口
  -v /opt/mysql/slave/data:/var/lib/mysql \
  -v /opt/mysql/slave/log:/var/log/mysql \
  -v /opt/mysql/slave/conf:/etc/mysql/conf.d \
  -e MYSQL_ROOT_PASSWORD=000000 \
  --name mysqlslave \
  192.168.100.50:5000/mysql:5.7

步骤 3:配置从库参数

编辑 /opt/mysql/slave/conf/my.cnf:

ini 复制代码
[mysqld]
# 唯一服务器ID(与主库不同)
server_id=2

# 从库只读(防止误写)
read_only=1

# 可选:跳过错误(谨慎使用)
# slave_skip_errors=1062

重启生效:

bash 复制代码
docker restart mysqlslave

步骤 4:配置主从连接

bash 复制代码
# 进入从库
docker exec -it mysqlslave mysql -uroot -p000000

# 执行 CHANGE MASTER TO(关键步骤!)
mysql> CHANGE MASTER TO
    MASTER_HOST='192.168.100.6',   -- 宿主机IP(非容器IP!)
    MASTER_PORT=3306,              -- 主库端口
    MASTER_USER='slave',           -- 复制用户名
    MASTER_PASSWORD='000000',      -- 密码
    MASTER_LOG_FILE='mysql-bin.000005',  -- 主库File值
    MASTER_LOG_POS=684,            -- 主库Position值
    MASTER_CONNECT_RETRY=30;       -- 重连间隔(秒)

# 启动复制进程
mysql> START SLAVE;

🌐 网络关键点:

  • MASTER_HOST 必须是宿主机 IP(因从库容器需访问宿主机暴露的 3306 端口)
  • 若主从在同一 Docker 网络,可用容器名(见文末优化方案)

步骤 5:验证复制状态

sql 复制代码
mysql> SHOW SLAVE STATUS\G

成功标志:

text 复制代码
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0  -- 延迟为0

❌ 常见错误:

  • Slave_IO_Running: Connecting → 网络不通或账号密码错误
  • Slave_SQL_Running: No → SQL 执行错误(如主键冲突)

三、功能测试:验证数据同步

在主库操作

sql 复制代码
-- 创建数据库和表
CREATE DATABASE test1;
USE test1;
CREATE TABLE t1(id INT, name VARCHAR(8));
INSERT INTO t1 VALUES(1, 'zs');
SELECT * FROM t1;

在从库验证

sql 复制代码
-- 查看数据库
SHOW DATABASES;  -- 应包含 test1

-- 查询数据
USE test1;
SELECT * FROM t1;  -- 应显示 (1, 'zs')

✅ 同步成功!所有写操作均实时复制到从库。


四、高级优化与故障处理

优化 1:使用 Docker 自定义网络(避免宿主机 IP 依赖)

bash 复制代码
# 创建专用网络
docker network create mysql-net

# 重新启动主从(加入网络)
docker run -d --network mysql-net --name master ... 
docker run -d --network mysql-net --name slave ...

# 从库配置时直接用容器名
CHANGE MASTER TO MASTER_HOST='master', ...;

优化 2:半同步复制(增强数据安全)

在主库启用半同步插件:

sql 复制代码
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
SET GLOBAL rpl_semi_sync_master_enabled = 1;

故障处理:主库宕机后提升从库为主库

  1. 停止从库复制:

    sql 复制代码
    STOP SLAVE;
    RESET MASTER;
  2. 修改应用配置指向新主库(原从库)

  3. 修复原主库后,将其作为新从库加入


五、生产环境 checklist

项目 检查点
网络 主从能否互相访问?防火墙是否开放端口?
权限 复制用户是否仅限从库 IP?密码是否足够强?
监控 是否监控 Seconds_Behind_Master 延迟?
备份 是否定期备份主库?从库是否可快速切换?
日志 二进制日志是否定期清理?(避免磁盘占满)

六、总结

通过 Docker 搭建 MySQL 主从复制,你已掌握:

  • 主库配置:启用二进制日志 + 创建复制用户
  • 从库配置:设置只读 + 关联主库
  • 验证方法 :SHOW SLAVE STATUS + 数据测试

🚀 下一步行动:

  1. 结合 Keepalived 实现 VIP 自动漂移
  2. 使用 ProxySQL 实现读写分离
  3. 迁移到 MySQL 8.0 并启用 GTID 复制

主从复制是数据库高可用的基石。现在,你的微服务系统已具备企业级数据保障能力!

相关推荐
在角落发呆5 小时前
工具配置备份步骤:从手动备份到自动化方案
运维·windows·自动化
_upupup6 小时前
Linux的调试工具——gdb/cgdb
linux·服务器
百度一下吧6 小时前
Nginx 使用手册:从安装配置到实战部署
运维·nginx
JeJe同学7 小时前
Docker镜像导入、容器启动
linux·运维·docker
Jason_zhao_MR7 小时前
Linux与实时控制如何兼得
linux·嵌入式硬件·机器人·工业控制
回眸&啤酒鸭7 小时前
【回眸】自动化白盒测试落地实战指南
运维·自动化·log4j
闲云野鹤在人间8 小时前
MySQL|从理论、安装、备份到主从复制、MHA高可用详解
linux·运维·数据库·mysql·云计算
一个风轻云淡9 小时前
GCC 和 GDB命令简单解读
java·linux·前端
H.莓飛9 小时前
【数据结构】二叉树_OJ题
linux·开发语言·数据结构·算法
资料库019 小时前
Linux 8个常见运维故障排查
java·linux·运维