Docker环境下MySQL主从复制架构的深度实践指南

一、容器化MySQL主从架构概述

在分布式数据库架构中,主从复制是提升系统可用性的核心方案。通过将主库的二进制日志(binlog)实时同步到从库,可实现读写分离、故障转移和负载均衡。容器化部署方式相比传统物理机或虚拟机方案,具有资源隔离性强、部署速度快、环境一致性高等优势。

本方案采用Docker容器技术构建MySQL 5.7主从集群,包含以下核心组件:

  • 主库容器:负责处理所有写操作并生成binlog
  • 从库容器:异步复制主库数据,承担读请求
  • 数据卷映射:持久化存储数据库数据和配置文件
  • 网络端口映射:实现宿主机与容器间的通信

二、主库容器部署与配置

1. 容器实例创建

使用以下命令启动主库容器,注意完成关键参数配置:

  1. docker run -p 3307:3306 \
  2. --name mysql-master \
  3. -v /mydata/mysql-master/log:/var/log/mysql \
  4. -v /mydata/mysql-master/data:/var/lib/mysql \
  5. -v /mydata/mysql-master/conf:/etc/mysql \
  6. -e MYSQL_ROOT_PASSWORD=root \
  7. -d mysql:5.7

参数说明:

  • -p 3307:3306:将容器3306端口映射到宿主机3307
  • -v:挂载数据卷实现持久化存储
  • MYSQL_ROOT_PASSWORD:设置root用户密码

2. 主库核心配置

/mydata/mysql-master/conf/my.cnf中配置以下内容:

  1. [mysqld]
  2. server_id=101 # 唯一标识符
  3. binlog-ignore-db=mysql # 忽略系统库同步
  4. log-bin=mall-mysql-bin # 二进制日志前缀
  5. binlog_cache_size=1M # 事务缓存大小
  6. binlog_format=mixed # 推荐混合格式
  7. expire_logs_days=7 # 日志保留周期
  8. slave_skip_errors=1062 # 跳过主键冲突错误

关键配置解析:

  • server_id:集群内必须唯一,建议按业务模块编号
  • binlog_format:ROW格式数据完整但体积大,STATEMENT格式体积小但存在函数复制问题,MIXED格式自动选择
  • slave_skip_errors:生产环境建议配置1062(主键冲突)和1032(数据不一致)错误跳过

3. 复制账户创建

进入容器后执行:

  1. CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
  2. GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
  3. FLUSH PRIVILEGES;

权限说明:

  • REPLICATION SLAVE:从库复制必需权限
  • REPLICATION CLIENT:允许查看主库状态
  • 建议限制复制账户的访问IP范围

三、从库容器部署与配置

1. 容器实例创建

从库启动命令与主库类似,需注意端口和配置路径差异:

  1. docker run -p 3308:3306 \
  2. --name mysql-slave \
  3. -v /mydata/mysql-slave/log:/var/log/mysql \
  4. -v /mydata/mysql-slave/data:/var/lib/mysql \
  5. -v /mydata/mysql-slave/conf:/etc/mysql \
  6. -e MYSQL_ROOT_PASSWORD=root \
  7. -d mysql:5.7

2. 从库核心配置

/mydata/mysql-slave/conf/my.cnf中配置:

  1. [mysqld]
  2. server_id=102 # 必须与主库不同
  3. log-bin=mall-mysql-slave1-bin # 启用从库binlog(可选)
  4. log_slave_updates=1 # 级联复制配置
  5. read_only=1 # 从库只读模式

特殊配置说明:

  • log_slave_updates:当从库需要作为其他从库的主库时启用
  • read_only:防止从库被误写入,超级用户仍可写入

3. 复制链路建立

在从库容器内执行:

  1. CHANGE MASTER TO
  2. MASTER_HOST='宿主机IP',
  3. MASTER_PORT=3307,
  4. MASTER_USER='slave',
  5. MASTER_PASSWORD='123456',
  6. MASTER_LOG_FILE='mall-mysql-bin.000001',
  7. MASTER_LOG_POS=154;
  8. START SLAVE;

参数获取方法:

  1. 在主库执行SHOW MASTER STATUS获取当前binlog文件和位置
  2. 确保网络互通,建议使用宿主机固定IP而非容器IP

四、复制状态监控与维护

1. 状态检查命令

  1. SHOW SLAVE STATUS\G

关键指标解读:

  • Slave_IO_Running:I/O线程状态
  • Slave_SQL_Running:SQL线程状态
  • Seconds_Behind_Master:复制延迟秒数
  • Last_IO_Error/Last_SQL_Error:错误信息

2. 常见问题处理

复制中断修复

  1. 执行STOP SLAVE停止复制
  2. 根据错误类型选择:
    • 主键冲突:SET GLOBAL sql_slave_skip_counter=1跳过当前事件
    • 数据不一致:使用pt-table-checksumpt-table-sync工具修复
  3. 执行START SLAVE恢复复制

延迟优化方案

  1. 调整sync_binlog=10N(N为整数)
  2. 使用innodb_flush_log_at_trx_commit=2
  3. 升级硬件配置,特别是磁盘I/O性能
  4. 考虑采用半同步复制或组复制架构

五、高可用架构扩展建议

  1. 级联复制:配置从库的log_slave_updates参数,形成链式复制拓扑
  2. 读写分离:结合代理中间件(如ProxySQL)实现自动路由
  3. 监控告警:集成监控系统跟踪复制延迟、连接数等关键指标
  4. 故障转移:使用Keepalived或容器编排工具实现自动主从切换
  5. 备份策略:主库执行全量备份,从库执行增量备份

六、最佳实践总结

  1. 配置管理:使用配置中心统一管理my.cnf文件
  2. 版本控制:容器镜像和配置文件纳入版本管理系统
  3. 自动化部署:通过CI/CD流水线实现环境一键部署
  4. 安全加固:限制复制账户权限,启用SSL加密传输
  5. 性能基准:建立压测环境评估不同配置下的性能表现

通过本方案的实施,可构建出具备高可用性、可扩展性的MySQL容器化集群,为业务系统提供稳定的数据存储服务。实际生产环境中,建议结合具体业务特点进行参数调优和架构优化。