Docker环境下MySQL主从复制的完整实践指南

一、主从复制技术架构解析

MySQL主从复制是构建高可用数据库架构的基础技术,通过二进制日志(Binary Log)实现数据同步。主库(Master)记录所有数据变更操作,从库(Slave)通过读取主库的二进制日志重放这些操作,实现数据同步。这种架构不仅能提升系统可用性,还可用于读写分离、数据备份等场景。

在容器化部署场景中,使用Docker构建MySQL主从架构具有显著优势:资源隔离性强、环境一致性高、部署速度快。通过合理的配置管理,可实现分钟级的主从集群搭建,特别适合开发测试环境和中小型生产环境。

二、主服务器容器实例构建

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 # 日志格式(STATEMENT/ROW/MIXED)
  7. expire_logs_days=7 # 日志保留周期
  8. slave_skip_errors=1062 # 跳过主键冲突错误

配置要点解析:

  • server_id必须保证局域网内唯一
  • binlog_format选择建议:
    • STATEMENT:记录SQL语句,节省空间但可能存在主从不一致
    • ROW:记录行变更,数据一致性好但日志量大
    • MIXED:自动选择上述两种格式
  • slave_skip_errors常见错误码:
    • 1062:主键冲突
    • 1032:数据不一致
    • 1053:记录被删除

3. 配置生效与验证

完成配置后需重启容器:

  1. docker restart mysql-master

验证配置是否生效:

  1. docker exec -it mysql-master mysql -uroot -proot -e "SHOW MASTER STATUS;"

正常应显示当前二进制日志文件及位置信息。

三、从服务器容器实例构建

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. binlog-ignore-db=mysql # 忽略系统库
  4. log-bin=mall-mysql-slave1-bin # 启用二进制日志(备选主库用)
  5. relay_log=mysql-relay-bin # 中继日志配置
  6. log_slave_updates=1 # 级联复制配置
  7. read_only=1 # 从库只读模式

3. 复制账户创建

在主库容器内执行:

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

四、主从复制关系建立

1. 获取主库状态信息

  1. docker exec -it mysql-master mysql -uroot -proot -e "SHOW MASTER STATUS\G"

记录输出中的FilePosition值,用于从库配置。

2. 配置从库复制参数

  1. docker exec -it mysql-slave mysql -uroot -proot <<EOF
  2. CHANGE MASTER TO
  3. MASTER_HOST='宿主机IP',
  4. MASTER_USER='slave',
  5. MASTER_PASSWORD='123456',
  6. MASTER_PORT=3307,
  7. MASTER_LOG_FILE='记录的File值',
  8. MASTER_LOG_POS=记录的Position值;
  9. START SLAVE;
  10. EOF

3. 复制状态验证

  1. SHOW SLAVE STATUS\G

关键指标检查:

  • Slave_IO_Running: Yes
  • Slave_SQL_Running: Yes
  • Seconds_Behind_Master: 0(同步延迟)

五、常见问题处理

1. 复制中断修复

当出现复制错误时,可执行:

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

或根据错误类型调整slave_skip_errors参数。

2. 数据一致性校验

使用pt-table-checksum工具(需单独安装)进行数据校验:

  1. pt-table-checksum --replicate=test.checksums h=主库IP,u=用户名,p=密码

3. 容器持久化维护

定期备份数据目录:

  1. tar -czvf /backup/mysql-master-`date +%Y%m%d`.tar.gz /mydata/mysql-master/data

六、高级配置建议

1. 半同步复制配置

在主库配置:

  1. [mysqld]
  2. plugin-load=rpl_semi_sync_master=semisync_master.so
  3. rpl_semi_sync_master_enabled=1
  4. rpl_semi_sync_master_timeout=10000

从库配置:

  1. [mysqld]
  2. plugin-load=rpl_semi_sync_slave=semisync_slave.so
  3. rpl_semi_sync_slave_enabled=1

2. GTID复制配置

启用全局事务标识符:

  1. [mysqld]
  2. gtid_mode=ON
  3. enforce_gtid_consistency=ON

3. 多源复制配置

适用于从多个主库同步数据的场景,需MySQL 5.7+版本支持。

七、监控与维护方案

1. 基础监控指标

  • 复制延迟时间(Seconds_Behind_Master)
  • 二进制日志增长速率
  • 连接数监控
  • 锁等待情况

2. 自动化监控脚本示例

  1. #!/bin/bash
  2. SLAVE_STATUS=$(docker exec -it mysql-slave mysql -uroot -proot -e "SHOW SLAVE STATUS\G" | grep -E "Slave_IO_Running|Slave_SQL_Running|Seconds_Behind_Master")
  3. echo "当前复制状态:"
  4. echo "$SLAVE_STATUS"

3. 容器健康检查配置

在docker-compose.yml中添加:

  1. healthcheck:
  2. test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
  3. interval: 30s
  4. timeout: 10s
  5. retries: 3

通过以上完整配置,开发者可以构建出稳定可靠的MySQL主从复制架构。实际生产环境中,建议结合监控告警系统、自动化运维工具形成完整的数据库高可用解决方案。对于更大规模的部署,可考虑使用容器编排平台实现动态扩缩容和故障自动恢复。