一、学习目标
- 掌握 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 主从复制核心原理

- MySQL 默认支持主(master)从(slave)架构
- 核心效果:主库操作实时同步到从库
- 实现本质:主库操作写入日志,从库读取日志重放操作
- 核心要素:
- 主库开启日志功能
- 主 / 从库配置唯一 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 核心概念
- 逻辑库(schema):逻辑上完整的数据库
- 逻辑表(table):逻辑上完整的表
- 数据主机(dataHost):数据库所在服务器
- 数据节点(dataNode):服务器上的具体 MySQL 实例
- 分片规则(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 功能验证
- 重启 MyCat:
./mycat restart - 通过 MySQL 客户端连接 MyCat(端口 8066),创建表并插入数据

- 分表验证:查看各 MySQL 节点的 db1/db2/db3,确认数据按规则分片存储

- 项目集成验证:修改项目数据源连接 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 则进一步解决了单库单表的性能瓶颈问题,适用于高并发、大数据量的业务场景。实际应用中需根据业务特点选择合适的分片规则,并做好节点监控与故障转移配置。