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 大大降低了分库分表的技术门槛,是构建高并发、大数据量应用的重要工具。

相关推荐
谢语花2 小时前
【VS2022】LNK assimp64.lib找不到文件_openframework
android·运维·服务器
马克学长2 小时前
SSM村务管理系统s2qnw(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
java·服务器·数据库
tt666qq2 小时前
运维自动化之 Ansible 核心知识点总结
运维·自动化·ansible
2301_818411553 小时前
rpm软件包管理以及yum,apt的前端软件包管理器
linux·运维·服务器
数据知道3 小时前
Go基础:用Go语言操作redis详解
开发语言·数据库·redis·golang·go语言
源文雨3 小时前
MacOS 下 Warp ping 局域网设备报错 ping: sendto: No route to host 的解决方法
运维·网络协议·安全·macos·网络安全·ping
zym大哥大4 小时前
MySQL数据库访问
数据库·mysql
CS Beginner4 小时前
【Linux】安装配置mysql中出现的问题1
linux·mysql·adb
飘飞雪4 小时前
深入浅出kafka:kafka演进以及核心功能介绍
数据库·分布式·kafka