一、主从复制技术架构解析
MySQL主从复制是构建高可用数据库架构的基础技术,通过二进制日志(Binary Log)实现数据同步。主库(Master)记录所有数据变更操作,从库(Slave)通过读取主库的二进制日志重放这些操作,实现数据同步。这种架构不仅能提升系统可用性,还可用于读写分离、数据备份等场景。
在容器化部署场景中,使用Docker构建MySQL主从架构具有显著优势:资源隔离性强、环境一致性高、部署速度快。通过合理的配置管理,可实现分钟级的主从集群搭建,特别适合开发测试环境和中小型生产环境。
二、主服务器容器实例构建
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 # 日志格式(STATEMENT/ROW/MIXED)expire_logs_days=7 # 日志保留周期slave_skip_errors=1062 # 跳过主键冲突错误
配置要点解析:
server_id必须保证局域网内唯一binlog_format选择建议:- STATEMENT:记录SQL语句,节省空间但可能存在主从不一致
- ROW:记录行变更,数据一致性好但日志量大
- MIXED:自动选择上述两种格式
slave_skip_errors常见错误码:- 1062:主键冲突
- 1032:数据不一致
- 1053:记录被删除
3. 配置生效与验证
完成配置后需重启容器:
docker restart mysql-master
验证配置是否生效:
docker exec -it mysql-master mysql -uroot -proot -e "SHOW MASTER STATUS;"
正常应显示当前二进制日志文件及位置信息。
三、从服务器容器实例构建
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 # 必须与主库不同binlog-ignore-db=mysql # 忽略系统库log-bin=mall-mysql-slave1-bin # 启用二进制日志(备选主库用)relay_log=mysql-relay-bin # 中继日志配置log_slave_updates=1 # 级联复制配置read_only=1 # 从库只读模式
3. 复制账户创建
在主库容器内执行:
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';FLUSH PRIVILEGES;
四、主从复制关系建立
1. 获取主库状态信息
docker exec -it mysql-master mysql -uroot -proot -e "SHOW MASTER STATUS\G"
记录输出中的File和Position值,用于从库配置。
2. 配置从库复制参数
docker exec -it mysql-slave mysql -uroot -proot <<EOFCHANGE MASTER TOMASTER_HOST='宿主机IP',MASTER_USER='slave',MASTER_PASSWORD='123456',MASTER_PORT=3307,MASTER_LOG_FILE='记录的File值',MASTER_LOG_POS=记录的Position值;START SLAVE;EOF
3. 复制状态验证
SHOW SLAVE STATUS\G
关键指标检查:
Slave_IO_Running: YesSlave_SQL_Running: YesSeconds_Behind_Master: 0(同步延迟)
五、常见问题处理
1. 复制中断修复
当出现复制错误时,可执行:
STOP SLAVE;SET GLOBAL sql_slave_skip_counter = 1;START SLAVE;
或根据错误类型调整slave_skip_errors参数。
2. 数据一致性校验
使用pt-table-checksum工具(需单独安装)进行数据校验:
pt-table-checksum --replicate=test.checksums h=主库IP,u=用户名,p=密码
3. 容器持久化维护
定期备份数据目录:
tar -czvf /backup/mysql-master-`date +%Y%m%d`.tar.gz /mydata/mysql-master/data
六、高级配置建议
1. 半同步复制配置
在主库配置:
[mysqld]plugin-load=rpl_semi_sync_master=semisync_master.sorpl_semi_sync_master_enabled=1rpl_semi_sync_master_timeout=10000
从库配置:
[mysqld]plugin-load=rpl_semi_sync_slave=semisync_slave.sorpl_semi_sync_slave_enabled=1
2. GTID复制配置
启用全局事务标识符:
[mysqld]gtid_mode=ONenforce_gtid_consistency=ON
3. 多源复制配置
适用于从多个主库同步数据的场景,需MySQL 5.7+版本支持。
七、监控与维护方案
1. 基础监控指标
- 复制延迟时间(Seconds_Behind_Master)
- 二进制日志增长速率
- 连接数监控
- 锁等待情况
2. 自动化监控脚本示例
#!/bin/bashSLAVE_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")echo "当前复制状态:"echo "$SLAVE_STATUS"
3. 容器健康检查配置
在docker-compose.yml中添加:
healthcheck:test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]interval: 30stimeout: 10sretries: 3
通过以上完整配置,开发者可以构建出稳定可靠的MySQL主从复制架构。实际生产环境中,建议结合监控告警系统、自动化运维工具形成完整的数据库高可用解决方案。对于更大规模的部署,可考虑使用容器编排平台实现动态扩缩容和故障自动恢复。