MySQL 主从复制、MyCat 读写分离与分库分表实战

一、学习目标

  • 掌握 MySQL 主从复制的配置与验证
  • 理解 MyCat 中间件核心概念
  • 实现 MyCat 读写分离与分库分表配置

二、MySQL 主从复制

2.1 安装 MySQL(CentOS7 环境)

2.1.1 下载并安装 YUM 库

shell

复制代码
# 下载YUM库
wget  http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm
# 安装YUM库
rpm -ivh mysql57-community-release-el7-10.noarch.rpm
2.1.2 安装数据库

shell

复制代码
yum -y install mysql-community-server  --nogpgcheck
2.1.3 服务管理

shell

复制代码
# 启动/停止/重启/查看状态/设置开机自启
systemctl start mysqld
systemctl stop mysqld
systemctl restart mysqld
systemctl status mysqld
systemctl enable mysqld
2.1.4 初始化配置

shell

复制代码
# 查找初始密码
grep "password" /var/log/mysqld.log
# 登录数据库(粘贴上述密码)
mysql -u root -p

mysql

复制代码
# 修改密码策略(降低复杂度要求)
SET GLOBAL validate_password_policy=LOW;
SET GLOBAL validate_password_length=4;
# 修改root密码
ALTER USER 'root'@'localhost' IDENTIFIED BY '1111';
# 开启远程连接
use mysql;
select User,Host from user;
update user set host ="%" where user = "root";
flush privileges;

2.2 MySQL 主从复制配置

2.2.1 主从复制核心原理
  1. MySQL 默认支持主(master)从(slave)架构
  2. 核心效果:主库操作实时同步到从库
  3. 实现本质:主库操作写入日志,从库读取日志重放操作
  4. 核心要素:
    • 主库开启日志功能
    • 主 / 从库配置唯一 server_id(主 < 从)
    • 每个 MySQL 实例配置唯一 uuid(克隆虚拟机需修改)
2.2.2 配置步骤
1. 克隆 MySQL 虚拟机

基于已安装的 MySQL 节点克隆出从库节点,后续分别配置主 / 从库。

2. 配置主数据库
  • 修改主库my.cnf文件,开启日志并配置 server_id

  • 重启 MySQL:service mysqld restart

  • 查看主库状态:验证日志功能与 server_id 配置生效

3. 配置从数据库
  • 修改从库my.cnf中的 server_id(需与主库不同)
  • 修改data/auto.cnf中的 uuid(保证唯一)
  • 重启 MySQL:systemctl restart mysqld
  • 配置主从关联:

进入mysql

复制代码
​mysql> stop slave;
# 关联主库信息(替换为实际IP/日志文件)
mysql> change master to master_host='192.168.204.136',master_user='root',master_password='1111',master_log_file='master_log.000001';
mysql> start slave;
  • 验证从库状态:

mysql

复制代码
show slave status \G;

需确保 IO 线程和 SQL 线程均为开启状态,无报错则配置成功。

4. 验证主从关系

在主库新建数据库 / 表 / 插入数据,观察从库是否同步更新。

三、MyCat 中间件

3.1 MyCat 简介

MyCAT 是国产开源数据库中间件(前身是 Cobar),兼容 MySQL 协议,可实现读写分离、分库分表等能力,应用层可将其视为普通 MySQL 服务。

3.2 MyCat 核心能力

  • 多数据库兼容
  • 垂直拆分(分库):按业务将库分布到不同MySQL节点
  • 水平拆分(分表):将单表数据拆分到多个MySQL节点
  • 读写分离:分离读 / 写请求到不同数据库节点

3.3 MyCat 安装(CentOS7 环境)

3.3.1 下载与解压

官方网站:| MYCAT官方网站---中国开源分布式数据库中间件

github地址:MyCATApache · GitHub

下载完成后上传到linux服务器

shell

复制代码
# 上传MyCat压缩包后解压到指定目录
tar -zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C /usr/local
3.3.2 服务管理

shell

复制代码
# 进入MyCat/bin目录
cd /usr/local/mycat/bin
# 启动/停止/重启/查看状态
./mycat start
./mycat stop
./mycat restart
./mycat status

默认端口 8066,可通过 MySQL 客户端直接连接。

四、MyCat 分库分表与读写分离实战

4.1 环境准备

节点类型 操作系统 软件版本 数据库名 IP 地址
MySQL1 CentOS7 MySQL5.7 db1 192.168.25.134
MySQL2 CentOS7 MySQL5.7 db2 192.168.25.135
MySQL3 CentOS7 MySQL5.7 db3 192.168.25.136
MyCat CentOS7 1.6release - 192.168.25.137

4.2 MyCat 核心概念

  1. 逻辑库(schema):逻辑上完整的数据库
  2. 逻辑表(table):逻辑上完整的表
  3. 数据主机(dataHost):数据库所在服务器
  4. 数据节点(dataNode):服务器上的具体 MySQL 实例
  5. 分片规则(rule):数据拆分的规则

4.3 核心配置文件

4.3.1 schema.xml(核心配置)

管理逻辑库、表、分片规则、数据节点 / 主机,示例配置:

xml

复制代码
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
	<schema name="power_shop" checkSQLschema="false" sqlMaxLimit="100">
		<table name="tb_content" dataNode="dn1,dn2,dn3" rule="crc32slot" />
		<table name="tb_content_category" dataNode="dn1,dn2,dn3" rule="crc32slot1"/>
		<table name="tb_item" dataNode="dn1,dn2,dn3" rule="crc32slot2" />
		<table name="tb_item_cat" dataNode="dn1,dn2,dn3" rule="crc32slot3" />
		<table name="tb_item_desc" dataNode="dn1,dn2,dn3" rule="crc32slot4"  />
		<table name="tb_item_param" dataNode="dn1,dn2,dn3" rule="crc32slot5"  />
		<table name="tb_item_param_item" dataNode="dn1,dn2,dn3" rule="crc32slot6" />
		<table name="tb_order" dataNode="dn1,dn2,dn3" rule="crc32slot7" />
		<table name="tb_order_item" dataNode="dn1,dn2,dn3" rule="crc32slot8" />
		<table name="tb_order_shipping" dataNode="dn1,dn2,dn3" rule="crc32slot9" />
		<table name="tb_user" dataNode="dn1,dn2,dn3" rule="crc32slot10" />
	</schema>

	<dataNode name="dn1" dataHost="localhost1" database="db1" />
	<dataNode name="dn2" dataHost="localhost1" database="db2" />
	<dataNode name="dn3" dataHost="localhost1" database="db3" />

	<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
		writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
		<heartbeat>select user()</heartbeat>
		<writeHost host="hostM1" url="192.168.233.137:3306" user="root" password="1111">
			<readHost host="hostS2" url="192.168.233.138:3306" user="root" password="1111" />
		</writeHost>
	</dataHost>
</mycat:schema>
4.3.2 server.xml(用户权限配置)

配置连接 MyCat 的用户名、密码、逻辑库权限:

xml

复制代码
<user name="root">
    <property name="password">1111</property>
    <property name="schemas">power_shop</property>
</user>

<user name="user">
    <property name="password">1111</property>
    <property name="schemas">power_shop</property>
    <property name="readOnly">true</property>
</user>
4.3.3 rule.xml(分片规则配置)

常用分片规则:

  • auto-sharding-long:按数值范围分片(如 1-500 万存 db1)
  • crc32slot:按 crc32 算法哈希分片

示例配置:

xml

复制代码
<tableRule name="crc32slot1">
    <rule>
    	<columns>id</columns>
    	<algorithm>crc32slot</algorithm>
    </rule>
</tableRule>
<tableRule name="crc32slot2">
    <rule>
   	 	<columns>id</columns>
   		<algorithm>crc32slot</algorithm>
    </rule>
</tableRule>
<!-- 其余表规则配置省略 -->
<function name="crc32slot" class="io.mycat.route.function.PartitionByCRC32PreSlot">
    <property name="count">3</property><!-- 分片节点数量 -->
</function>

4.4 测试验证

4.4.1 前置准备

在主 MySQL 节点创建 db1、db2、db3 数据库。

4.4.2 功能验证
  1. 重启 MyCat:./mycat restart
  2. 通过 MySQL 客户端连接 MyCat(端口 8066),创建表并插入数据
  1. 分表验证:查看各 MySQL 节点的 db1/db2/db3,确认数据按规则分片存储
  1. 项目集成验证:修改项目数据源连接 MyCat,测试 CRUD 功能

yaml

复制代码
spring:
  application:
    name: power-shop-item
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://192.168.233.139:8066/power_shop?characterEncoding=UTF-8
    username: root
    password: 1111
    type: com.alibaba.druid.pool.DruidDataSource

五、总结

本文完整梳理了 MySQL 主从复制的搭建流程,以及基于 MyCat 中间件实现分库分表、读写分离的核心配置与验证步骤。通过主从复制可实现数据备份与读写分离的基础,而 MyCat 则进一步解决了单库单表的性能瓶颈问题,适用于高并发、大数据量的业务场景。实际应用中需根据业务特点选择合适的分片规则,并做好节点监控与故障转移配置。

相关推荐
用户128526116024 小时前
我把祖传Java项目重构后,接口响应从3s砍到了200ms,只改了这几行代码
java
Linsk4 小时前
组件 = 模板 + 业务逻辑
java·前端·vue.js
Nturmoils5 小时前
订单列表慢查询,先看 WHERE、ORDER BY 和 LIMIT
数据库
星沉远浦5 小时前
用Gemini高效解决Java代码报错难以定位的问题
java
用户298698530149 小时前
Word 文档字符级格式化:Java 实现方案详解
java·后端
渣波9 小时前
拒绝 SQL 焦虑!手把手带你用 NestJS + Prisma + DTO 写出“防弹”级后端代码
javascript·数据库·后端
笨鸟飞不快9 小时前
从单个服务到集群:一次完整的性能排查复盘
java·前端
荣码9 小时前
用Streamlit给AI应用套个界面,10行代码出Web页面
java·python
SamDeepThinking9 小时前
Java微服务练习方式
java·后端·微服务