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

一、主从复制架构设计原理

MySQL主从复制是一种基于二进制日志(Binary Log)的数据同步机制,通过将主库的DDL/DML操作实时传输到从库执行,实现数据的多副本存储。这种架构具有三大核心优势:读写分离提升系统吞吐量、数据热备保障业务连续性、地理分布优化访问延迟。

在容器化部署场景中,每个MySQL实例运行在独立的Docker容器中,通过挂载持久化卷实现数据持久化。这种部署方式既保持了轻量级特性,又通过容器编排工具实现了资源隔离和弹性扩展。建议采用”一主一从”基础架构起步,后续可根据业务需求扩展为级联复制或环形复制拓扑。

二、主库容器实例配置

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用户初始密码
  • mysql:5.7:指定使用MySQL 5.7官方镜像

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格式,但需权衡存储开销
  • slave_skip_errors应根据实际业务场景配置,1062错误最常见于自增主键冲突

3. 同步用户创建

进入容器后执行:

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

安全建议:

  • 限制同步用户来源IP(如'slave'@'192.168.1.%'
  • 使用强密码策略(建议16位以上混合字符)
  • 定期轮换复制账户密码

三、从库容器实例配置

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 # 启用从库二进制日志(可选)
  4. read_only=ON # 设置为只读模式

高级配置选项:

  • relay_log_space_limit:限制中继日志占用空间
  • sync_binlog:控制二进制日志写入磁盘频率
  • slave_parallel_workers:多线程复制线程数(MySQL 5.7+)

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获取当前日志文件和位置
  2. 确保网络连通性(建议使用宿主机IP而非容器名)

四、复制状态监控与故障处理

1. 实时状态检查

  1. SHOW SLAVE STATUS\G

重点关注字段:

  • Slave_IO_Running:IO线程状态
  • Slave_SQL_Running:SQL线程状态
  • Seconds_Behind_Master:复制延迟(秒)
  • Last_IO_Error/Last_SQL_Error:错误信息

2. 常见故障处理

场景1:复制中断

  1. STOP SLAVE;
  2. SET GLOBAL sql_slave_skip_counter=1;
  3. START SLAVE;

场景2:数据不一致修复

  1. 在主库锁定表:FLUSH TABLES WITH READ LOCK;
  2. 导出主库数据:mysqldump -uroot -p --all-databases --master-data > dump.sql
  3. 在从库导入数据:mysql -uroot -p < dump.sql
  4. 重新配置复制链路

场景3:主从切换

  1. 提升从库为新主库:STOP SLAVE; RESET SLAVE ALL;
  2. 修改应用连接配置指向新主库
  3. 重建其他从库的复制链路

五、生产环境优化建议

  1. 资源隔离:为每个MySQL容器设置CPU/内存限制(--cpus--memory参数)
  2. 监控告警:集成Prometheus+Grafana监控复制延迟、QPS等关键指标
  3. 备份策略:结合物理备份(Percona XtraBackup)和逻辑备份(mysqldump)
  4. 高可用方案:考虑使用Keepalived或容器编排工具实现自动故障转移
  5. 版本升级:主从版本建议保持一致,跨大版本升级需测试兼容性

六、扩展架构设计

  1. 级联复制:从库再作为其他从库的主库,形成复制链
  2. 多源复制:MySQL 5.7+支持从多个主库同步数据
  3. GTID复制:启用全局事务标识符简化故障切换(gtid_mode=ON
  4. 组复制:MySQL 8.0+的InnoDB Cluster提供原生高可用解决方案

通过上述完整配置流程,开发者可以构建出稳定可靠的MySQL主从复制环境。建议先在测试环境验证所有操作流程,再逐步迁移至生产环境。随着业务发展,可基于当前架构扩展为更复杂的高可用集群,满足不同业务场景的数据库需求。