MySQL主从复制与读写分离实战

技能目标

  • 深入理解 MySQL 主从复制的核心原理与工作流程
  • 熟练掌握 MySQL 主从复制的完整部署与验证流程
  • 精通基于 MyCat 中间件的读写分离架构搭建与配置
  • 掌握读写分离的负载均衡策略与业务适配方案

前言

在数据规模持续增长的业务场景中,单节点 MySQL 数据库在高并发读写、数据安全与高可用方面存在明显瓶颈。主从复制通过多节点数据同步实现数据冗余与故障切换,读写分离通过中间件分流读写请求,大幅提升数据库并发处理能力,是企业级数据库架构的核心优化方案。

本章从原理到实操,系统讲解 MySQL 主从复制的部署流程,结合 MyCat 中间件实现读写分离,帮助学习者构建高可用、高并发的数据库架构,为业务系统的稳定运行提供保障。


一、核心原理与架构认知

1.1 MySQL 主从复制原理

主从复制是 MySQL 实现数据多节点同步的核心机制,核心流程如下:

  1. 主库(Master) :所有写操作(INSERT/UPDATE/DELETE)执行完成后,将变更记录写入二进制日志(Binary Log),并通知从库拉取日志。
  2. 从库(Slave) :启动两个线程:
    • I/O 线程 :连接主库,请求拉取二进制日志,写入本地中继日志(Relay Log)
    • SQL 线程:读取中继日志,按顺序重放日志中的操作,实现与主库数据一致。
  3. 复制类型
    • 基于语句的复制:直接复制 SQL 语句,效率高但存在语法兼容风险
    • 基于行的复制:复制数据行变更,一致性高但日志体积大
    • 混合模式复制:默认模式,自动选择最优复制方式

1.2 MySQL 读写分离原理

读写分离将数据库的写操作 路由到主库,读操作分流到从库,核心价值:

  • 分担主库压力,提升并发处理能力
  • 实现读写资源隔离,避免慢查询影响写操作
  • 结合主从复制,实现高可用架构

常见实现方式:

  1. 应用层实现:在代码中根据操作类型路由到不同数据库,无需额外组件,但运维成本高
  2. 中间件实现:通过 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 实施步骤总览

  1. 环境准备:关闭防火墙、SELinux,同步服务器时间
  2. 部署 MySQL 主从复制:配置主库、从库,完成数据同步验证
  3. 部署 MyCat 中间件:安装配置 MyCat,实现读写分离路由
  4. 功能验证:测试读写分离效果,验证数据一致性

三、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=YesSlave_SQL_Running=Yes,表示同步正常。

3.4 主从复制验证

  1. 主库创建测试库: sql

    复制代码
    mysql> CREATE DATABASE db_test;
  2. 从库查看数据库: 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 主从复制与读写分离的全流程部署,核心要点总结如下:

  1. 主从复制核心 :基于二进制日志 + 中继日志实现数据同步,server-id唯一、Slave_IO/SQL_Running正常是同步关键。
  2. 读写分离价值:通过 MyCat 中间件分流读写请求,大幅提升主库并发能力,实现高可用架构。
  3. 架构优化方向:结合 GTID 简化复制配置,通过负载均衡策略优化读请求分发,保障数据一致性。
  4. 生产环境注意:定期监控主从同步状态,避免延迟导致数据不一致;读写分离需结合业务场景适配,避免分布式事务问题。

通过本章学习,可掌握企业级 MySQL 高并发、高可用架构的核心搭建技能,为业务系统的稳定运行提供坚实保障。

相关推荐
赛恩斯12 小时前
adb 的源代码分析,以及如何改造为外网远程连接的方式
数据库·adb
.柒宇.12 小时前
MySQL的MGR高可用
数据库·mysql·adb
User_芊芊君子13 小时前
0 基础学 MySQL !核心知识点梳理,搞定库表操作与 CRUD
数据库·mysql·adb
九皇叔叔1 天前
MySQL8.0 版本安装部署
android·adb
蓝眸少年CY2 天前
MaxWell 高级教程
adb
seabirdssss3 天前
Flutter 开发环境配置
android·windows·flutter·adb
不会写DN3 天前
如何排查 MySQL 慢查询
数据库·mysql·adb
su_ym81104 天前
adb原理及常用命令介绍
adb
REDcker4 天前
Android ADB 命令教程与速查
android·adb
l1o3v1e4ding4 天前
排查linux CentOS7.6的mysql(5.7.27)内存泄漏因OOM被系统kill的问题
linux·mysql·adb