mysql主从复制docker版
发布时间:2025-06-26 00:04       
以下是在 Docker 环境中搭建 MySQL 主从复制架构的专业级实践指南,结合最新容器技术规范(MySQL 8.x+)和工业级可靠性要求:
一、核心原理与组件
- 主节点 (Source)
📝 记录所有数据变更到二进制日志 (binlog) - 从节点 (Replica)
🔄 实时拉取主节点binlog并重放(基于GTID或位点复制) - 关键协议
⚙️ 异步复制(默认) / 半同步复制(需插件)
二、Docker 部署准备
1. 网络配置(避免IP动态变化)
docker network create mysql-cluster-net
2. 持久化数据目录
mkdir -p /data/mysql/{master,slave}/conf /data/mysql/{master,slave}/data
三、主节点配置 (Source)
1. 配置文件 (/data/mysql/master/conf/my.cnf)
[mysqld]
server_id = 1
log_bin = mysql-bin
binlog_format = ROW
gtid_mode = ON
enforce_gtid_consistency = ON
# 容器环境关键参数
skip_name_resolve = ON
bind-address = 0.0.0.0
2. 启动主容器
docker run -d --name mysql-master \
--network mysql-cluster-net \
-v /data/mysql/master/conf:/etc/mysql/conf.d \
-v /data/mysql/master/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=MasterRoot123! \
-p 3306:3306 \
mysql:8.0.34 \
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_unicode_ci
3. 创建复制账户
CREATE USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'ReplPass123!';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;
⚠️ 安全注意:MySQL 8 默认使用 caching_sha2_password,从节点需兼容认证插件
四、从节点配置 (Replica)
1. 配置文件 (/data/mysql/slave/conf/my.cnf)
[mysqld]
server_id = 2 # 必须全局唯一
relay_log = mysql-relay-bin
read_only = ON
gtid_mode = ON
enforce_gtid_consistency = ON
# 级联复制支持(非必需)
log_slave_updates = ON
2. 启动从容器
docker run -d --name mysql-slave \
--network mysql-cluster-net \
-v /data/mysql/slave/conf:/etc/mysql/conf.d \
-v /data/mysql/slave/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=SlaveRoot123! \
-p 3307:3306 \
mysql:8.0.34
3. 配置主从链路
CHANGE MASTER TO
MASTER_HOST = 'mysql-master', # 使用Docker容器名解析
MASTER_USER = 'repl',
MASTER_PASSWORD = 'ReplPass123!',
MASTER_AUTO_POSITION = 1; # GTID自动定位
START SLAVE;
✅ 验证复制状态:
SHOW SLAVE STATUS\G
-- 确保以下两项为 "Yes"
-- Slave_IO_Running: Yes
-- Slave_SQL_Running: Yes
-- 无 Last_IO_Error / Last_SQL_Error
五、工业级加固措施
-
半同步复制(防数据丢失)
在主节点执行:INSTALL PLUGIN rpl_semi_sync_source SONAME 'semisync_source.so'; SET GLOBAL rpl_semi_sync_source_enabled = 1;在从节点执行:
INSTALL PLUGIN rpl_semi_sync_replica SONAME 'semisync_replica.so'; SET GLOBAL rpl_semi_sync_replica_enabled = 1; -
复制过滤(按需启用)
# 主节点忽略系统库复制 binlog_ignore_db = information_schema,mysql,performance_schema,sys -
容器健康检查
HEALTHCHECK --interval=30s --timeout=5s \ CMD mysqladmin ping -uroot -p${MYSQL_ROOT_PASSWORD} || exit 1
六、故障排查清单
| 现象 | 排查点 | 解决方案 |
|---|---|---|
Slave_IO_Running=No |
网络连通性 / 复制账号权限 | telnet mysql-master 3306 |
Slave_SQL_Running=No |
主从数据冲突 / GTID不一致 | SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; |
Seconds_Behind_Master增大 |
从库负载过高 | 优化查询 / 增加从库资源 |
七、版本适配说明
- MySQL 5.7:移除
MASTER_AUTO_POSITION,改用binlog文件名+位点 - Docker Compose:推荐使用
depends_on+healthcheck控制启动顺序 - Kubernetes:需配置 StatefulSet + Headless Service 实现动态拓扑
📌 最终验证:在主库插入数据,2秒内从库可见即成功
-- 主库执行 CREATE DATABASE rep_test; USE rep_test; CREATE TABLE t1(id INT PRIMARY KEY); INSERT INTO t1 VALUES(1); -- 从库查询 SELECT * FROM rep_test.t1; -- 应返回 id=1
此方案通过 Docker 容器名实现服务发现,避免IP变动问题;采用 GTID 简化故障切换流程,符合金融级数据一致性要求。建议生产环境配合监控工具(如 Prometheus + Grafana)实时跟踪复制延迟。🚀