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

相关推荐
六月雨滴44 分钟前
Oracle 性能监控体系概述
数据库·oracle·dba
计算机安禾1 小时前
【算法分析与设计】第38篇:最近点对与分治在几何中的应用
java·服务器·网络·数据库·算法
柏舟飞流1 小时前
向量数据库:从底层原理到选型实战
数据库
__Witheart__1 小时前
Android 驱动编译为模块或者built-in内核
android·linux·数据库
ZC跨境爬虫1 小时前
SQL学习日志 Day_1:初识SQL,开启数据之旅
数据库·sql·学习
梦梦代码精1 小时前
功能堆砌不如好扩展:4 款开源商城系统的选型思考
java·docker·uni-app·开源·php
计算机安禾1 小时前
【算法分析与设计】第37篇:平面扫描与线段交问题
java·大数据·数据库·算法·机器学习
兰令水1 小时前
leecodecode【二叉树排序+最近公共祖先】【2026.6.2打卡-java版本】
java·数据结构·算法·leetcode
人道领域1 小时前
【LeetCode刷题日记】77&&216.回溯算法剪枝优化在组合问题中的应用
java·算法·leetcode