MySQL 运维知识点(十五)---- 分库分表与MyCat

一、 分库分表介绍

1. 为什么要分库分表?

当单表数据量达到千万级别,或数据库实例的 QPS/TPS 过高导致性能瓶颈时,就需要考虑分库分表。

  • 垂直分库:按业务模块将不同表拆分到不同数据库中。

  • 水平分库:将同一个表的数据按某种规则拆分到多个数据库中。

  • 垂直分表:将一个宽表的字段按访问频率拆分成多个表。

  • 水平分表:将同一个表的数据按某种规则拆分到多个表中。

核心目的:解决由于数据量过大而导致的数据库性能瓶颈问题。

二、 Mycat 概述

1. 什么是 Mycat?

Mycat 是一个开源的分布式数据库系统,是一个实现了 MySQL 协议 的服务器。前端用户可以把它看作是一个数据库代理,其核心功能是分库分表

2. Mycat 的核心作用
  • 读写分离:自动将写操作路由到主库,读操作路由到从库。

  • 数据分片:将大数据表水平拆分,分布到多个后端 MySQL 节点上。

  • 多数据源整合:统一对外提供服务,隐藏后端复杂的分布式架构。

  • 高可用性:支持数据库故障自动切换。

3. Mycat 核心概念
概念 描述
逻辑库 应用程序直接连接的数据库,在 Mycat 中配置,不存在于实际 MySQL 中
逻辑表 在逻辑库中创建的表,是物理表的逻辑映射
数据节点 存储实际数据的数据库实例,如 192.168.1.1:3306/testdb
分片规则 决定数据如何分布到不同数据节点的算法

三、 Mycat 入门

1. 快速开始
  1. 下载安装:从官网下载 Mycat,解压即可。

  2. 配置文件 :主要修改 conf/ 目录下的配置文件。

  3. 启动 :执行 bin/mycat start

  4. 连接:使用 MySQL 客户端连接 Mycat(默认端口 8066)。

2. 连接 Mycat
bash 复制代码
mysql -u root -p -P 8066 -h 127.0.0.1

注意:连接的是 Mycat 服务,不是直接的 MySQL。

四、 Mycat 配置

Mycat 的核心配置文件都在 conf/ 目录下。

1. server.xml - 系统配置

定义用户、权限、系统参数等。

XML 复制代码
<user name="mycat_user">
    <property name="password">mycat_pass</property>
    <property name="schemas">TESTDB</property> <!-- 逻辑库名 -->
</user>
2. schema.xml - 逻辑库表配置

最重要的配置文件,定义逻辑库、逻辑表、数据节点、分片规则等。

XML 复制代码
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

    <!-- 定义逻辑库 -->
    <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
        <!-- 定义逻辑表 -->
        <table name="users" dataNode="dn1,dn2,dn3" rule="mod-long" />
    </schema>

    <!-- 定义数据节点 -->
    <dataNode name="dn1" dataHost="host1" database="db1" />
    <dataNode name="dn2" dataHost="host1" database="db2" />
    <dataNode name="dn3" dataHost="host2" database="db3" />

    <!-- 定义物理数据库连接 -->
    <dataHost name="host1" maxCon="1000" minCon="10" balance="0"
              writeType="0" dbType="mysql" dbDriver="jdbc">
        <heartbeat>select user()</heartbeat>
        <writeHost host="hostM1" url="jdbc:mysql://192.168.1.1:3306" 
                   user="root" password="123456"/>
    </dataHost>
    
</mycat:schema>
3. rule.xml - 分片规则配置

定义分片算法和规则。

五、 Mycat 分片

1. 常见分片规则
分片规则 描述 适用场景
取模分片 根据字段值取模分配到不同节点 数据均匀分布
范围分片 按字段值范围分配 按时间、ID范围划分
哈希分片 一致性哈希算法 减少数据迁移
枚举分片 按字段枚举值分配 如按地区、类型分片
2. 分片规则配置示例

取模分片

XML 复制代码
<!-- 在 rule.xml 中 -->
<tableRule name="mod-long">
    <rule>
        <columns>user_id</columns>
        <algorithm>mod-long</algorithm>
    </rule>
</tableRule>

<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
    <property name="count">3</property> <!-- 分成3片 -->
</function>

范围分片

XML 复制代码
<function name="rang-long" class="io.mycat.route.function.AutoPartitionByLong">
    <property name="mapFile">autopartition-long.txt</property>
</function>
在 autopartition-long.txt 中定义范围:
XML 复制代码
0-1000000=0
1000001-2000000=1
2000001-3000000=2

六、 Mycat 管理与监控

1. 管理命令
sql 复制代码
-- 查看数据节点状态
show @@datanode;

-- 查看连接状态
show @@connection;

-- 查看缓存
show @@cache;

-- 查看线程池状态
show @@threadpool;

-- 重启Mycat(在连接中执行)
reload @@config;
2. 监控方式
  • 命令行监控:通过 9066 管理端口连接
bash 复制代码
mysql -u root -p -P 9066 -h 127.0.0.1
  • Web 监控:部署 Mycat-web 进行图形化监控

  • JMX 监控:通过 JMX 接口获取运行状态

3. 常见管理操作
sql 复制代码
-- 在9066管理端口执行
-- 查看帮助
show @@help;

-- 查看系统状态
show @@system;

-- 查看SQL统计
show @@sql;

-- 查看慢SQL
show @@slow;

七、 Mycat 使用示例

1. 完整的分库分表示例

场景 :将 users 表按 user_id 取模分片到3个节点。

① schema.xml 配置

XML 复制代码
<schema name="TESTDB" checkSQLschema="false">
    <table name="users" primaryKey="user_id" dataNode="dn1,dn2,dn3" rule="mod-long" />
</schema>

<dataNode name="dn1" dataHost="host1" database="user_db1" />
<dataNode name="dn2" dataHost="host1" database="user_db2" />
<dataNode name="dn3" dataHost="host2" database="user_db3" />

<dataHost name="host1" maxCon="1000" dbType="mysql">
    <heartbeat>select user()</heartbeat>
    <writeHost host="hostM1" url="192.168.1.1:3306" user="root" password="123456"/>
</dataHost>

② 应用程序连接

java 复制代码
// JDBC连接字符串
String url = "jdbc:mysql://mycat-server:8066/TESTDB";
// 应用程序像使用普通MySQL一样操作,无需关心分片细节

八、 注意事项

  1. 分片键选择:选择查询频繁且数据分布均匀的字段作为分片键。

  2. 全局表:小量且需要频繁关联查询的表可配置为全局表,在所有节点冗余存储。

  3. ER表:有关联关系的表可配置为ER表,保证关联数据在同一分片。

  4. 分布式事务:Mycat 对分布式事务的支持有限,复杂事务需在应用层处理。

  5. SQL限制:某些复杂SQL(如子查询、跨分片JOIN)可能不被支持或性能较差。

总结

Mycat 作为分布式数据库中间件,核心价值在于让应用程序无感知地使用分库分表

使用流程

  1. 分析业务需求,设计分片方案

  2. 配置 server.xmlschema.xmlrule.xml

  3. 启动 Mycat 服务

  4. 应用程序连接 Mycat

  5. 通过管理端口监控运行状态

Mycat 大大降低了分库分表的技术门槛,是构建高并发、大数据量应用的重要工具。

相关推荐
淼淼爱喝水1 分钟前
openEuler 系统下 Ansible 一键安装教程(保姆级)
运维·ansible·openeuler
超级大只老咪2 分钟前
固定个数的状态,需要按顺序无限循环切换
数据库
XXOOXRT5 分钟前
零基础掌握Linux常用命令
linux·运维·服务器
@insist12321 分钟前
数据库系统工程师-云计算与大数据核心知识
大数据·数据库·云计算·软考·数据库系统工程师·软件水平考试
皙然24 分钟前
深度解析:关系型数据库与非关系型数据库(区别+原理+适用场景,一文吃透)
数据库·nosql
桌面运维家42 分钟前
KVM虚拟机:快照增量备份与Linux系统快速恢复
linux·运维·服务器
夕除1 小时前
Mysql
数据库·mysql
Sarapines Programmer1 小时前
【Docker】Windows 安装 Docker 简明指南
运维·docker·容器
LaughingZhu1 小时前
Product Hunt 每日热榜 | 2026-03-28
数据库·人工智能·经验分享·神经网络·chatgpt
知识分享小能手1 小时前
MongoDB入门学习教程,从入门到精通,MongoDB聚合框架(7)
数据库·学习·mongodb