一、容器化MySQL主从架构概述
在分布式数据库架构中,主从复制是提升系统可用性的核心方案。通过将主库的二进制日志(binlog)实时同步到从库,可实现读写分离、故障转移和负载均衡。容器化部署方式相比传统物理机或虚拟机方案,具有资源隔离性强、部署速度快、环境一致性高等优势。
本方案采用Docker容器技术构建MySQL 5.7主从集群,包含以下核心组件:
- 主库容器:负责处理所有写操作并生成binlog
- 从库容器:异步复制主库数据,承担读请求
- 数据卷映射:持久化存储数据库数据和配置文件
- 网络端口映射:实现宿主机与容器间的通信
二、主库容器部署与配置
1. 容器实例创建
使用以下命令启动主库容器,注意完成关键参数配置:
docker run -p 3307:3306 \--name mysql-master \-v /mydata/mysql-master/log:/var/log/mysql \-v /mydata/mysql-master/data:/var/lib/mysql \-v /mydata/mysql-master/conf:/etc/mysql \-e MYSQL_ROOT_PASSWORD=root \-d mysql:5.7
参数说明:
-p 3307:3306:将容器3306端口映射到宿主机3307-v:挂载数据卷实现持久化存储MYSQL_ROOT_PASSWORD:设置root用户密码
2. 主库核心配置
在/mydata/mysql-master/conf/my.cnf中配置以下内容:
[mysqld]server_id=101 # 唯一标识符binlog-ignore-db=mysql # 忽略系统库同步log-bin=mall-mysql-bin # 二进制日志前缀binlog_cache_size=1M # 事务缓存大小binlog_format=mixed # 推荐混合格式expire_logs_days=7 # 日志保留周期slave_skip_errors=1062 # 跳过主键冲突错误
关键配置解析:
server_id:集群内必须唯一,建议按业务模块编号binlog_format:ROW格式数据完整但体积大,STATEMENT格式体积小但存在函数复制问题,MIXED格式自动选择slave_skip_errors:生产环境建议配置1062(主键冲突)和1032(数据不一致)错误跳过
3. 复制账户创建
进入容器后执行:
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';FLUSH PRIVILEGES;
权限说明:
REPLICATION SLAVE:从库复制必需权限REPLICATION CLIENT:允许查看主库状态- 建议限制复制账户的访问IP范围
三、从库容器部署与配置
1. 容器实例创建
从库启动命令与主库类似,需注意端口和配置路径差异:
docker run -p 3308:3306 \--name mysql-slave \-v /mydata/mysql-slave/log:/var/log/mysql \-v /mydata/mysql-slave/data:/var/lib/mysql \-v /mydata/mysql-slave/conf:/etc/mysql \-e MYSQL_ROOT_PASSWORD=root \-d mysql:5.7
2. 从库核心配置
在/mydata/mysql-slave/conf/my.cnf中配置:
[mysqld]server_id=102 # 必须与主库不同log-bin=mall-mysql-slave1-bin # 启用从库binlog(可选)log_slave_updates=1 # 级联复制配置read_only=1 # 从库只读模式
特殊配置说明:
log_slave_updates:当从库需要作为其他从库的主库时启用read_only:防止从库被误写入,超级用户仍可写入
3. 复制链路建立
在从库容器内执行:
CHANGE MASTER TOMASTER_HOST='宿主机IP',MASTER_PORT=3307,MASTER_USER='slave',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mall-mysql-bin.000001',MASTER_LOG_POS=154;START SLAVE;
参数获取方法:
- 在主库执行
SHOW MASTER STATUS获取当前binlog文件和位置 - 确保网络互通,建议使用宿主机固定IP而非容器IP
四、复制状态监控与维护
1. 状态检查命令
SHOW SLAVE STATUS\G
关键指标解读:
Slave_IO_Running:I/O线程状态Slave_SQL_Running:SQL线程状态Seconds_Behind_Master:复制延迟秒数Last_IO_Error/Last_SQL_Error:错误信息
2. 常见问题处理
复制中断修复:
- 执行
STOP SLAVE停止复制 - 根据错误类型选择:
- 主键冲突:
SET GLOBAL sql_slave_skip_counter=1跳过当前事件 - 数据不一致:使用
pt-table-checksum和pt-table-sync工具修复
- 主键冲突:
- 执行
START SLAVE恢复复制
延迟优化方案:
- 调整
sync_binlog=1为0或N(N为整数) - 使用
innodb_flush_log_at_trx_commit=2 - 升级硬件配置,特别是磁盘I/O性能
- 考虑采用半同步复制或组复制架构
五、高可用架构扩展建议
- 级联复制:配置从库的
log_slave_updates参数,形成链式复制拓扑 - 读写分离:结合代理中间件(如ProxySQL)实现自动路由
- 监控告警:集成监控系统跟踪复制延迟、连接数等关键指标
- 故障转移:使用Keepalived或容器编排工具实现自动主从切换
- 备份策略:主库执行全量备份,从库执行增量备份
六、最佳实践总结
- 配置管理:使用配置中心统一管理my.cnf文件
- 版本控制:容器镜像和配置文件纳入版本管理系统
- 自动化部署:通过CI/CD流水线实现环境一键部署
- 安全加固:限制复制账户权限,启用SSL加密传输
- 性能基准:建立压测环境评估不同配置下的性能表现
通过本方案的实施,可构建出具备高可用性、可扩展性的MySQL容器化集群,为业务系统提供稳定的数据存储服务。实际生产环境中,建议结合具体业务特点进行参数调优和架构优化。