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 高并发、高可用架构的核心搭建技能,为业务系统的稳定运行提供坚实保障。

相关推荐
独隅2 小时前
MacOS 系统下 ADB (Android Debug Bridge) 全面安装与配置指南
android·macos·adb
刘晨鑫12 小时前
MySQL主从复制与读写分离
数据库·mysql·adb
炸炸鱼.1 天前
MySQL 全量、增量备份与恢复(极简易懂版)
android·adb
独隅1 天前
Linux 系统下 ADB 环境 的详细安装步骤和基础设置指南
linux·运维·adb
2301_805348971 天前
MySQL源码编译部署主从及MHA高可用集群实战
adb
Carino_U1 天前
全面理解mysql架构
mysql·adb·架构
w-白兰地1 天前
配置Unity中的ADB环境变量
unity·adb·游戏引擎
Yang-Never1 天前
ADB ->Android 实时监控内存
android·开发语言·adb·android studio