1. 项目概述
MySQL主从复制是企业级数据库架构中最基础也最重要的高可用方案之一。作为一名DBA,我在过去五年里为超过30家企业部署过MySQL主从环境,其中80%的生产系统都运行在CentOS 7上。本文将分享我在CentOS 7环境下搭建MySQL 8.0.35主从复制的标准化操作流程(SOP),包含大量实战中积累的细节技巧。
这个方案特别适合以下场景:
- 需要读写分离的中小型Web应用
- 作为数据库高可用的基础架构
- 数据备份和灾难恢复的解决方案
- 报表查询等读密集型业务的负载均衡
重要提示:MySQL 8.0与5.7版本在复制配置上有显著差异,本文所有配置均针对8.0.35版本验证,不建议直接套用到其他版本。
2. 环境准备与规划
2.1 服务器规划建议
在实际部署中,我推荐采用以下服务器规格:
| 角色 | CPU | 内存 | 磁盘 | 网络 |
|---|---|---|---|---|
| Master | 4核+ | 16GB+ | SSD RAID1 (500GB+) | 千兆内网 |
| Slave | 4核 | 8GB | SSD (500GB) | 千兆内网 |
网络配置要点:
- 主从服务器必须在同一局域网段
- 建议配置主机名解析(/etc/hosts)
- 防火墙开放3306端口(或自定义端口)
2.2 软件版本要求
- 操作系统:CentOS 7.6+(本文基于7.9)
- MySQL:8.0.35(必须主从版本一致)
- 依赖包:libaio, numactl等
安装必要依赖:
bash复制yum install -y libaio numactl openssl-devel
3. MySQL 8.0安装配置
3.1 标准化安装步骤
- 下载官方RPM包:
bash复制wget https://dev.mysql.com/get/mysql80-community-release-el7-7.noarch.rpm
- 安装YUM源:
bash复制rpm -ivh mysql80-community-release-el7-7.noarch.rpm
- 安装MySQL服务:
bash复制yum install -y mysql-community-server
避坑指南:如果遇到GPG密钥错误,先执行
rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022
3.2 关键配置优化
编辑/etc/my.cnf,主库需要添加以下配置:
ini复制[mysqld]
server-id = 1
log_bin = mysql-bin
binlog_format = ROW
binlog_row_image = FULL
sync_binlog = 1
从库配置差异点:
ini复制server-id = 2 # 必须与主库不同
read_only = ON # 从库设为只读
4. 主从复制配置详解
4.1 主库操作流程
- 创建复制专用账户:
sql复制CREATE USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'ComplexPwd123!';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
- 获取主库二进制坐标:
sql复制SHOW MASTER STATUS;
记录File和Position值(例如:mysql-bin.000001, 745)
4.2 从库配置关键步骤
- 配置主库连接:
sql复制CHANGE MASTER TO
MASTER_HOST='master_ip',
MASTER_USER='repl',
MASTER_PASSWORD='ComplexPwd123!',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=745;
- 启动复制:
sql复制START SLAVE;
- 检查复制状态:
sql复制SHOW SLAVE STATUS\G
关键指标检查:
- Slave_IO_Running: Yes
- Slave_SQL_Running: Yes
- Seconds_Behind_Master: 0
5. 高级配置与调优
5.1 复制过滤配置
在主库配置只复制特定库:
ini复制binlog-do-db = important_db
binlog-ignore-db = mysql
或在从库配置:
sql复制CHANGE REPLICATION FILTER
REPLICATE_DO_DB = (important_db);
5.2 半同步复制配置
- 主库安装插件:
sql复制INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
SET GLOBAL rpl_semi_sync_master_enabled = 1;
- 从库安装插件:
sql复制INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
SET GLOBAL rpl_semi_sync_slave_enabled = 1;
6. 监控与维护
6.1 关键监控指标
sql复制-- 主库监控
SHOW MASTER STATUS;
SHOW BINARY LOGS;
-- 从库监控
SHOW SLAVE STATUS\G
SELECT * FROM performance_schema.replication_applier_status;
6.2 日常维护命令
- 主库切换二进制日志:
sql复制FLUSH LOGS;
- 从库跳过错误(谨慎使用):
sql复制STOP SLAVE;
SET GLOBAL sql_slave_skip_counter = 1;
START SLAVE;
7. 故障排查手册
7.1 常见错误解决方案
| 错误现象 | 可能原因 | 解决方案 |
|---|---|---|
| Slave_IO_Running: Connecting | 网络不通/密码错误 | 检查网络和复制账户权限 |
| Last_IO_Error: 1236 | 主库binlog被清除 | 重新获取主库坐标重建复制 |
| Seconds_Behind_Master持续增大 | 从库负载过高/配置不足 | 优化从库查询/升级硬件 |
7.2 复制中断恢复流程
- 确认主库数据一致性
- 从库执行:
sql复制STOP SLAVE;
RESET SLAVE ALL;
- 重新配置主从关系
8. 性能优化建议
- 主库binlog保留时间:
ini复制expire_logs_days = 7 # 根据磁盘空间调整
- 从库并行复制配置:
ini复制slave_parallel_workers = 4
slave_parallel_type = LOGICAL_CLOCK
- 网络优化:
- 使用专用网卡
- 调整TCP缓冲区大小
我在实际运维中发现,当主库TPS超过5000时,建议将binlog_group_commit_sync_delay调整为100-500微秒,可以显著降低主库负载。