1. 为什么需要容器化MySQL主从架构
在分布式系统架构中,数据库高可用是保障业务连续性的关键。传统物理机部署MySQL主从集群时,我们常遇到环境配置复杂、资源利用率低、故障恢复慢等问题。而Docker Swarm作为轻量级的容器编排工具,配合MySQL 8的新特性,能实现快速部署和灵活扩展。
我最近在生产环境用Docker Swarm部署了同时支持传统复制和GTID复制的MySQL 8集群,整个过程踩了不少坑,也积累了一些实战经验。下面就把完整方案和注意事项分享给大家。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境规划与准备工作
2.1 节点规划建议
对于生产环境,建议至少准备3个Swarm管理节点和2个工作节点。管理节点运行Swarm manager服务,工作节点运行MySQL容器。这样的架构可以保证:
- Manager节点奇数个避免脑裂
- 工作节点分离部署保证性能
- 至少1主1从满足基本高可用
测试环境可以用单机Swarm,但要注意:
bash复制# 单机初始化Swarm
docker swarm init --advertise-addr <IP地址>
2.2 MySQL镜像选择要点
官方MySQL 8镜像有多个变体,推荐选择:
mysql:8.0- 标准版,稳定性最好mysql:8.0-oracle- Oracle优化版- 避免使用
latest标签
重要参数预先准备:
bash复制# 必须预先创建的目录
mkdir -p /data/mysql/{master,slave}/{conf,data,logs}
3. 主库部署与配置
3.1 主库配置文件关键参数
my.cnf中需要特别关注的配置:
ini复制[mysqld]
server-id = 1
log_bin = mysql-bin
binlog_format = ROW
binlog_row_image = FULL
sync_binlog = 1
gtid_mode = ON
enforce_gtid_consistency = ON
binlog_group_commit_sync_delay = 100
binlog_group_commit_sync_no_delay_count = 10
注意:
sync_binlog=1会影响性能但能保证数据安全,根据业务需求调整
3.2 启动主库容器命令
bash复制docker service create \
--name mysql_master \
--mount type=bind,source=/data/mysql/master/conf/my.cnf,destination=/etc/mysql/my.cnf \
--mount type=bind,source=/data/mysql/master/data,destination=/var/lib/mysql \
--mount type=bind,source=/data/mysql/master/logs,destination=/var/log/mysql \
-e MYSQL_ROOT_PASSWORD=your_strong_password \
-e MYSQL_DATABASE=app_db \
-e MYSQL_USER=app_user \
-e MYSQL_PASSWORD=user_password \
--network mysql_net \
--constraint 'node.role==worker' \
--publish 3306:3306 \
mysql:8.0
4. 从库部署与同步配置
4.1 传统复制配置步骤
- 主库创建复制账号:
sql复制CREATE USER 'repl'@'%' IDENTIFIED BY 'repl_password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
- 获取主库binlog位置:
sql复制SHOW MASTER STATUS;
- 从库配置:
sql复制CHANGE MASTER TO
MASTER_HOST='mysql_master',
MASTER_USER='repl',
MASTER_PASSWORD='repl_password',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=154;
START SLAVE;
4.2 GTID复制配置优势
GTID复制相比传统复制的优点:
- 自动定位同步位置
- 故障切换更可靠
- 支持多源复制
配置方式:
sql复制CHANGE MASTER TO
MASTER_HOST='mysql_master',
MASTER_USER='repl',
MASTER_PASSWORD='repl_password',
MASTER_AUTO_POSITION=1;
START SLAVE;
5. 双模式复制实战技巧
5.1 传统复制与GTID共存方案
有时需要同时支持两种复制方式:
- 主库配置:
ini复制gtid_mode=ON
enforce_gtid_consistency=ON
log_slave_updates=ON
- 从库可以自由选择使用哪种方式连接
5.2 常见问题排查指南
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| Slave_IO_Running=No | 网络不通/权限不足 | 检查防火墙,验证复制账号 |
| Slave_SQL_Running=No | SQL线程错误 | STOP SLAVE; SET GLOBAL sql_slave_skip_counter=1; START SLAVE; |
| 复制延迟大 | 从库性能不足 | 优化查询,增加从库资源 |
6. 高可用与监控方案
6.1 健康检查配置
在Swarm中为MySQL添加健康检查:
bash复制--health-cmd="mysqladmin ping -uroot -p$MYSQL_ROOT_PASSWORD" \
--health-interval=10s \
--health-timeout=5s \
--health-retries=3 \
6.2 推荐监控指标
- 复制延迟(Seconds_Behind_Master)
- 线程状态(Slave_IO/SQL_Running)
- GTID执行情况(Executed_Gtid_Set)
- 内存使用情况(Buffer Pool Hit Rate)
可以使用Prometheus+Granfa搭建监控系统,配合mysqld_exporter采集指标。
7. 维护与备份策略
7.1 日常维护命令
检查复制状态:
sql复制SHOW SLAVE STATUS\G
重置复制(谨慎使用):
sql复制STOP SLAVE; RESET SLAVE ALL;
7.2 备份方案建议
- 物理备份:
bash复制docker exec mysql_master mysqldump -uroot -p --all-databases > backup.sql
- 逻辑备份(Percona XtraBackup):
bash复制docker run --rm -v /backup:/backup percona/percona-xtrabackup \
--backup --host=mysql_master --user=root --password=your_password \
--target-dir=/backup/full
8. 性能优化经验分享
经过多次压测和调优,总结几个关键点:
- 容器内存限制不要小于2GB
- 建议设置
innodb_buffer_pool_size为物理内存的70% - 网络模式建议用
overlay避免端口冲突 - 定期执行
OPTIMIZE TABLE对频繁更新的表有帮助
我在某电商项目中使用此架构,QPS从原来的800提升到了2500+,复制延迟控制在毫秒级。最关键的是切换时间从原来的分钟级缩短到秒级,大大提高了系统可用性。
