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

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

MySQL主从复制是构建分布式数据库的核心技术,通过二进制日志(Binary Log)实现数据变更的异步传输。主节点(Master)记录所有数据修改操作,从节点(Slave)通过重放这些日志实现数据同步。该架构具有三大核心优势:

  1. 读写分离:主节点处理写操作,从节点承担读请求
  2. 数据冗余:提供故障恢复能力,保障业务连续性
  3. 横向扩展:通过增加从节点提升系统整体吞吐量

在容器化部署场景下,每个MySQL实例运行在独立容器中,通过挂载持久化卷实现数据持久化。这种架构特别适合开发测试环境及轻量级生产环境,具有资源隔离、快速部署等优势。

二、主节点容器化部署方案

2.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:挂载三个关键目录实现数据持久化
  • -e:设置root用户密码
  • mysql:5.7:指定使用MySQL 5.7版本镜像

2.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 # 跳过主键冲突错误

配置完成后需重启容器使配置生效:

  1. docker restart mysql-master

2.3 创建复制专用账户

进入容器创建具有复制权限的用户:

  1. docker exec -it mysql-master /bin/bash
  2. mysql -uroot -proot

执行SQL语句:

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

三、从节点容器化部署方案

3.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

3.2 从节点特殊配置

/mydata/mysql-slave/conf/my.cnf中增加以下配置:

  1. [mysqld]
  2. server_id=102 # 必须与主节点不同
  3. log-bin=mall-mysql-slave1-bin # 启用从节点二进制日志(可选)
  4. read_only=1 # 设置为只读模式(可选)

3.3 配置主从复制关系

获取主节点二进制日志位置:

  1. SHOW MASTER STATUS;

记录File和Position值后,在从节点执行:

  1. CHANGE MASTER TO
  2. MASTER_HOST='宿主机IP',
  3. MASTER_PORT=3307,
  4. MASTER_USER='slave',
  5. MASTER_PASSWORD='123456',
  6. MASTER_LOG_FILE='记录的File值',
  7. MASTER_LOG_POS=记录的Position值;
  8. START SLAVE;

四、架构验证与监控方案

4.1 同步状态检查

在从节点执行以下命令验证同步状态:

  1. SHOW SLAVE STATUS\G

关键指标说明:

  • Slave_IO_Running:I/O线程状态
  • Slave_SQL_Running:SQL线程状态
  • Seconds_Behind_Master:同步延迟秒数

4.2 常见故障处理

  1. 同步中断:检查Last_IO_ErrorLast_SQL_Error字段
  2. 数据不一致:使用pt-table-checksum工具检测
  3. 主键冲突:配置slave_skip_errors=1062跳过错误

4.3 监控告警设计

建议集成以下监控指标:

  • 复制延迟时间(Seconds_Behind_Master)
  • 从节点I/O线程状态
  • 主节点二进制日志增长速率
    可通过Prometheus+Grafana构建可视化监控面板,设置延迟超过阈值时触发告警。

五、高级优化技巧

5.1 半同步复制配置

在主节点配置文件中增加:

  1. rpl_semi_sync_master_enabled=1
  2. rpl_semi_sync_master_timeout=10000

从节点配置:

  1. rpl_semi_sync_slave_enabled=1

这种配置可确保至少一个从节点收到数据后才返回客户端确认。

5.2 GTID复制模式

启用全局事务标识符(GTID)可简化故障转移:

  1. # 主从节点同时配置
  2. gtid_mode=ON
  3. enforce_gtid_consistency=ON

使用GTID后,复制配置可简化为:

  1. CHANGE MASTER TO
  2. MASTER_HOST='宿主机IP',
  3. MASTER_USER='slave',
  4. MASTER_PASSWORD='123456',
  5. MASTER_AUTO_POSITION=1;

5.3 多源复制架构

MySQL 5.7+支持从多个主节点复制数据,配置示例:

  1. CHANGE MASTER TO
  2. MASTER_HOST='master1_ip',
  3. ...
  4. SOURCE_CONNECTION_AUTO_FAILOVER=1;
  5. CHANGE MASTER TO
  6. MASTER_HOST='master2_ip',
  7. ...
  8. SOURCE_CONNECTION_AUTO_FAILOVER=1;

六、生产环境部署建议

  1. 资源分配:建议为每个MySQL容器分配至少2GB内存
  2. 网络配置:使用Docker自定义网络实现容器间高效通信
  3. 备份策略:结合物理备份和逻辑备份,定期验证备份可用性
  4. 高可用方案:可集成Keepalived实现主节点故障自动切换
  5. 版本升级:先升级从节点,再升级主节点,避免兼容性问题

通过以上完整方案,开发者可在Docker环境中快速构建企业级MySQL主从复制架构,满足数据高可用、读写分离等核心需求。实际部署时建议先在测试环境验证所有配置,再迁移到生产环境。