技能目标
- 深入理解 MySQL 主从复制的核心原理与工作流程
- 熟练掌握 MySQL 主从复制的完整部署与验证流程
- 精通基于 MyCat 中间件的读写分离架构搭建与配置
- 掌握读写分离的负载均衡策略与业务适配方案
前言
在数据规模持续增长的业务场景中,单节点 MySQL 数据库在高并发读写、数据安全与高可用方面存在明显瓶颈。主从复制通过多节点数据同步实现数据冗余与故障切换,读写分离通过中间件分流读写请求,大幅提升数据库并发处理能力,是企业级数据库架构的核心优化方案。
本章从原理到实操,系统讲解 MySQL 主从复制的部署流程,结合 MyCat 中间件实现读写分离,帮助学习者构建高可用、高并发的数据库架构,为业务系统的稳定运行提供保障。
一、核心原理与架构认知
1.1 MySQL 主从复制原理
主从复制是 MySQL 实现数据多节点同步的核心机制,核心流程如下:
- 主库(Master) :所有写操作(INSERT/UPDATE/DELETE)执行完成后,将变更记录写入二进制日志(Binary Log),并通知从库拉取日志。
- 从库(Slave) :启动两个线程:
- I/O 线程 :连接主库,请求拉取二进制日志,写入本地中继日志(Relay Log)。
- SQL 线程:读取中继日志,按顺序重放日志中的操作,实现与主库数据一致。
- 复制类型 :
- 基于语句的复制:直接复制 SQL 语句,效率高但存在语法兼容风险
- 基于行的复制:复制数据行变更,一致性高但日志体积大
- 混合模式复制:默认模式,自动选择最优复制方式
1.2 MySQL 读写分离原理
读写分离将数据库的写操作 路由到主库,读操作分流到从库,核心价值:
- 分担主库压力,提升并发处理能力
- 实现读写资源隔离,避免慢查询影响写操作
- 结合主从复制,实现高可用架构
常见实现方式:
- 应用层实现:在代码中根据操作类型路由到不同数据库,无需额外组件,但运维成本高
- 中间件实现:通过 MyCat 等中间件统一路由,对应用透明,便于运维与扩展(本章采用此方案)
二、案例环境与实施思路
2.1 案例环境规划
表格
| 主机角色 | 操作系统 | IP 地址 | 部署服务 |
|---|---|---|---|
| Master 主库 | openEuler 24.03 | 192.168.10.101 | MySQL 主服务 |
| Slave1 从库 | openEuler 24.03 | 192.168.10.102 | MySQL 从服务 |
| Slave2 从库 | openEuler 24.03 | 192.168.10.103 | MySQL 从服务 |
| MyCat 中间件 | openEuler 24.03 | 192.168.10.105 | MyCat 读写分离中间件 |
| 客户端 | openEuler 24.03 | 192.168.10.100 | 业务访问端 |
2.2 实施步骤总览
- 环境准备:关闭防火墙、SELinux,同步服务器时间
- 部署 MySQL 主从复制:配置主库、从库,完成数据同步验证
- 部署 MyCat 中间件:安装配置 MyCat,实现读写分离路由
- 功能验证:测试读写分离效果,验证数据一致性
三、MySQL 主从复制部署
3.1 环境准备(所有节点执行)
bash
运行
# 关闭防火墙与SELinux
[root@localhost ~]# systemctl stop firewalld && systemctl disable firewalld
[root@localhost ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
[root@localhost ~]# setenforce 0
# 同步时间
[root@localhost ~]# yum install -y ntpdate
[root@localhost ~]# ntpdate ntp.aliyun.com
3.2 主库(Master)配置
(1)安装 MySQL(二进制方式)
bash
运行
# 解压安装包
[root@master ~]# tar -zxf mysql-8.0.36-linux-glibc2.28-x86_64.tar.gz -C /usr/local/
[root@master ~]# mv /usr/local/mysql-8.0.36-linux-glibc2.28-x86_64 /usr/local/mysql
# 创建数据目录与专用用户
[root@master ~]# mkdir -p /usr/local/mysql/data
[root@master ~]# useradd -M -s /sbin/nologin mysql
[root@master ~]# chown -R mysql:mysql /usr/local/mysql
# 初始化数据库
[root@master ~]# /usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
记录初始化生成的临时密码,用于首次登录。
(2)配置主库参数
bash
运行
[root@master ~]# vim /etc/my.cnf
ini
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
socket=/usr/local/mysql/data/mysql.sock
server-id=1 # 主库唯一ID,不可与从库重复
log-bin=/usr/local/mysql/data/mysql-bin # 开启二进制日志
binlog_format=MIXED # 混合模式复制
gtid_mode=ON # 开启GTID(可选,简化复制配置)
enforce_gtid_consistency=ON
(3)配置 systemd 服务与启动
bash
运行
# 配置环境变量
[root@master ~]# echo 'export PATH=$PATH:/usr/local/mysql/bin' >> /etc/profile
[root@master ~]# source /etc/profile
# 配置systemd服务
[root@master ~]# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
[root@master ~]# chmod +x /etc/init.d/mysqld
[root@master ~]# vim /lib/systemd/system/mysqld.service
ini
[Unit]
Description=MySQL Server
After=network.target
[Service]
Type=forking
ExecStart=/etc/init.d/mysqld start
ExecReload=/etc/init.d/mysqld restart
ExecStop=/etc/init.d/mysqld stop
PrivateTmp=true
[Install]
WantedBy=multi-user.target
bash
运行
# 启动服务并设置开机自启
[root@master ~]# systemctl daemon-reload
[root@master ~]# systemctl start mysqld && systemctl enable mysqld
# 重置root密码
[root@master ~]# mysql -uroot -p
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'Master@123456';
mysql> FLUSH PRIVILEGES;
(4)创建复制专用账号
sql
mysql> CREATE USER 'repl'@'%' IDENTIFIED BY 'Repl@123456';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
mysql> FLUSH PRIVILEGES;
(5)查看主库状态
sql
mysql> SHOW MASTER STATUS;
记录File(二进制日志文件名)和Position(日志偏移量),用于从库配置。
3.3 从库(Slave1/Slave2)配置
(1)安装 MySQL(同主库步骤,省略重复操作)
注意:
server-id需设置为唯一值(Slave1 设为 2,Slave2 设为 3),不可与主库或其他从库重复。
(2)配置从库参数
bash
运行
[root@slave1 ~]# vim /etc/my.cnf
ini
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
socket=/usr/local/mysql/data/mysql.sock
server-id=2 # 从库唯一ID
relay-log=/usr/local/mysql/data/relay-bin # 开启中继日志
read_only=ON # 从库设为只读(避免误写)
gtid_mode=ON
enforce_gtid_consistency=ON
(3)配置主从同步
sql
mysql> CHANGE MASTER TO
MASTER_HOST='192.168.10.101',
MASTER_USER='repl',
MASTER_PASSWORD='Repl@123456',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=157; # 对应主库SHOW MASTER STATUS的结果
(4)启动从库同步
sql
mysql> START SLAVE;
mysql> SHOW SLAVE STATUS\G
验证关键状态:
Slave_IO_Running=Yes、Slave_SQL_Running=Yes,表示同步正常。
3.4 主从复制验证
-
主库创建测试库: sql
mysql> CREATE DATABASE db_test; -
从库查看数据库: sql
mysql> SHOW DATABASES;若能看到
db_test,说明主从同步成功。
四、MyCat 读写分离部署
4.1 安装 MyCat 中间件
(1)安装 JDK 环境
bash
运行
[root@mycat ~]# yum install -y java-1.8.0-openjdk-devel
(2)安装 MyCat
bash
运行
[root@mycat ~]# unzip mycat2-install-template-1.20.zip -d /usr/local/
[root@mycat ~]# mv /usr/local/mycat2 /usr/local/mycat
# 配置环境变量
[root@mycat ~]# echo 'export PATH=$PATH:/usr/local/mycat/bin' >> /etc/profile
[root@mycat ~]# source /etc/profile
# 启动MyCat
[root@mycat ~]# mycat start
4.2 配置 MyCat 读写分离
(1)创建数据库连接账号
在主库执行,为 MyCat 创建专用账号:
sql
mysql> CREATE USER 'mycat'@'%' IDENTIFIED BY 'Mycat@123';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'mycat'@'%';
mysql> FLUSH PRIVILEGES;
(2)配置数据源
登录 MyCat 控制台,添加主从数据源:
bash
运行
[root@mycat ~]# mysql -uroot -p123456 -h192.168.10.105 -P8066
sql
-- 添加主库数据源
mysql> create dataSource(name="master", url="jdbc:mysql://192.168.10.101:3306?useSSL=false&serverTimezone=Asia/Shanghai", user="mycat", password="Mycat@123");
-- 添加从库1数据源
mysql> create dataSource(name="slave1", url="jdbc:mysql://192.168.10.102:3306?useSSL=false&serverTimezone=Asia/Shanghai", user="mycat", password="Mycat@123");
-- 添加从库2数据源
mysql> create dataSource(name="slave2", url="jdbc:mysql://192.168.10.103:3306?useSSL=false&serverTimezone=Asia/Shanghai", user="mycat", password="Mycat@123");
(3)配置读写分离集群
sql
-- 创建主从集群,配置读写分离
mysql> createCluster(name="mysql_cluster", masters=["master"], slaves=["slave1","slave2"]);
(4)配置负载均衡策略
修改 MyCat 配置文件,设置读请求负载均衡:
bash
运行
[root@mycat ~]# vim /usr/local/mycat/conf/clusters/mysql_cluster.cluster.json
json
{
"clusterType": "MASTER_SLAVE",
"loadBalance": {
"defaultLoadBalance": "BalanceRoundRobin",
"loadBalances": [
{
"name": "BalanceRoundRobin",
"type": "ROUND_ROBIN"
}
]
}
}
重启 MyCat 生效配置:
mycat restart
4.3 读写分离验证
(1)测试写操作
登录 MyCat,执行写操作:
sql
mysql> CREATE DATABASE db_test;
mysql> USE db_test;
mysql> CREATE TABLE test_zang (id INT, name VARCHAR(20), address VARCHAR(50));
mysql> INSERT INTO test_zang VALUES(1,'zhang','this is master');
写操作会自动路由到主库,同步到从库。
(2)测试读操作
多次执行查询,验证负载均衡:
sql
mysql> SELECT * FROM test_zang;
读请求会按轮询策略分流到 Slave1 和 Slave2,实现读写分离。
总结
本章系统完成了 MySQL 主从复制与读写分离的全流程部署,核心要点总结如下:
- 主从复制核心 :基于二进制日志 + 中继日志实现数据同步,
server-id唯一、Slave_IO/SQL_Running正常是同步关键。 - 读写分离价值:通过 MyCat 中间件分流读写请求,大幅提升主库并发能力,实现高可用架构。
- 架构优化方向:结合 GTID 简化复制配置,通过负载均衡策略优化读请求分发,保障数据一致性。
- 生产环境注意:定期监控主从同步状态,避免延迟导致数据不一致;读写分离需结合业务场景适配,避免分布式事务问题。
通过本章学习,可掌握企业级 MySQL 高并发、高可用架构的核心搭建技能,为业务系统的稳定运行提供坚实保障。