MySQL 8.0 主从分离部署全指南:从原理到实战
在高并发业务场景中,单台 MySQL 数据库往往难以承受读写压力 —— 大量查询操作(读)会占用数据库资源,导致写入操作(写)响应变慢。主从分离通过将读写操作拆分到不同服务器,能有效提升数据库吞吐量,同时实现数据备份与故障转移。本文将详细讲解 MySQL 8.0 主从分离的部署流程,从原理到实操一步到位。
一、主从分离核心原理
MySQL 主从分离基于二进制日志(binlog) 实现,核心流程如下:
主库(Master):负责处理所有写操作(INSERT/UPDATE/DELETE),并将操作记录到 binlog 中。
从库(Slave):通过 IO 线程读取主库的 binlog,写入本地中继日志(relay log),再通过 SQL 线程执行中继日志中的操作,实现与主库数据同步。
应用层:写操作指向主库,读操作(SELECT)分配到从库,实现读写分离。
优势:
减轻主库压力:读操作分流到从库,主库专注处理写操作。
数据备份:从库实时同步主库数据,可作为热备份。
高可用:主库故障时,可手动或自动切换到从库。
二、部署前准备
1. 环境要求
两台服务器(或虚拟机),建议配置:2 核 CPU + 4GB 内存(生产环境可更高)。
操作系统:CentOS 7/8 或 Ubuntu 20.04+(本文以 CentOS 7 为例)。
MySQL 版本:8.0.x(主从库版本需保持一致,避免兼容性问题)。
网络:主从库需互通,关闭防火墙或开放 3306 端口。
| 角色 | IP 地址 | 用途 |
|---|---|---|
| 主库 | 192.168.1.100 | 处理写操作,生成 binlog |
| 从库 | 192.168.1.101 | 同步主库数据,处理读操作 |
2. 安装 MySQL 8.0
主从库均需安装 MySQL 8.0,以 CentOS 7 为例:
1 | \# 安装MySQL官方仓库 |
登录 MySQL 并修改密码(主从库均需执行):
1 | mysql -u root -p |
三、主库(Master)配置
1. 修改 MySQL 配置文件
编辑 /etc/my.cnf,添加以下配置:
1 | \[mysqld] |
重启 MySQL 使配置生效:
1 | systemctl restart mysqld |
2. 创建用于主从同步的用户
登录主库 MySQL,创建一个仅用于从库同步的用户(如 repl):
1 | \-- 允许从库IP(192.168.1.101)使用repl用户连接 |
3. 查看主库状态
执行以下命令获取 binlog 文件名和位置(从库配置需要):
1 | \-- 锁定数据库,禁止写入(避免配置期间数据变化) |
输出如下(记录 File 和 Position 的值):
1 | +------------------+----------+--------------+------------------+-------------------+ |
注意:此时不要关闭 MySQL 终端,配置完从库后再解锁(执行
UNLOCK TABLES;)。
四、从库(Slave)配置
1. 修改 MySQL 配置文件
编辑 /etc/my.cnf,添加以下配置:
1 | \[mysqld] |
重启 MySQL:
1 | systemctl restart mysqld |
2. 配置从库同步主库
登录从库 MySQL,执行以下命令配置主库信息(替换为实际值):
1 | \-- 停止从库同步进程 |
3. 查看从库同步状态
执行以下命令验证同步状态:
1 | SHOW SLAVE STATUS\G |
关键参数需满足:
Slave_IO_Running: Yes(IO 线程正常运行)Slave_SQL_Running: Yes(SQL 线程正常运行)
若均为 Yes,说明主从同步配置成功!
此时回到主库终端,执行
UNLOCK TABLES;解锁数据库。
五、验证主从同步
1. 主库写入数据
在主库创建测试数据库和表,并插入数据:
1 | \-- 创建数据库(与binlog\_do\_db配置一致) |
2. 从库验证数据
在从库查询数据,确认已同步:
1 | USE test\_db; |
若输出以下结果,说明同步成功:
1 | +----+-------+ |
六、常见问题与解决
1. 从库 Slave_IO_Running: Connecting
原因:网络不通、主库防火墙未开放 3306 端口、同步用户密码错误。
解决:
* 检查主从库网络:`ping ``192.168.1.100`
* 开放主库端口:`firewall-cmd --add-port=3306/tcp --permanent && firewall-cmd --reload`
* 验证同步用户权限:在从库执行 `mysql -h ``192.168.1.100`` -u repl -p`
2. 从库 Slave_SQL_Running: No
原因:主从库数据不一致(如从库已有同名表)、binlog 格式不兼容。
解决:
* 重置从库状态:`STOP SLAVE; RESET SLAVE ALL;`(清空之前的配置)
* 重新配置主从同步(参考步骤四.2)
* 确保主从库表结构一致,必要时手动同步初始数据(如用 `mysqldump` 导出主库数据导入从库)。
3. 主库 binlog 文件过大
- 解决:配置
expire_logs_days自动清理旧日志,或手动删除:
1 | \-- 查看binlog文件 |
七、总结与扩展
本文详细讲解了 MySQL 8.0 主从分离的部署流程,核心步骤包括:
主库启用 binlog 并创建同步用户。
从库配置中继日志并关联主库。
验证同步状态和数据一致性。
扩展方向:
多从库架构:一台主库可配置多台从库,进一步分流读压力。
半同步复制:通过
rpl_semi_sync_master_enabled配置,确保主库收到至少一个从库的确认后再返回成功,提升数据安全性。读写分离中间件:使用 MyCat、ShardingSphere 等工具自动分配读写请求,无需手动指定主从库地址。
掌握主从分离是 MySQL 高可用架构的基础,合理配置可显著提升系统稳定性与性能。