网站Logo 苏叶的belog

MyCat配置分库分表

wdadwa
1
2026-03-25

一,介绍

2953321-20240907084116711-511007134.png

随着互联网及移动互联网的发展,应用系统的数据量也是成指数式增长,若采用单数据库进行数据存储,存在以下性能瓶颈:

  1. IO瓶颈:热点数据太多,数据库缓存不足,产生大量磁盘10,效率较低。 请求数据太多,带宽不够,网络!0瓶颈。
  2. CPU瓶颈:排序、分组、连接查询、聚合统计等SQL会耗费大量的CPU资源,请求数太多,CPU出现瓶颈。

分库分表的中心思想都是将数据分散存储,使得单一数据库 / 表的数据量变小来缓解单一数据库的性能问题,从而达到提升数据库性能的目的。


拆分策略:

2953321-20240907084237318-1686057957.png

  • 垂直拆分
    垂直分库:以表为依据,根据业务将不同表拆分到不同库中。
    特点:

    1. 每个库的表结构都不一样。
    2. 每个库的数据也不一样。
    3. 所有库的并集是全量数据。
      2953321-20240907085658432-1848956385.png

    垂直分表:以字段为依据,根据字段属性将不同字段拆分到不同表中。
    特点:

    1. 每个表的结构都不一样。
    2. 每个表的数据也术一样,一般通过一列(主键/外键)关联。
    3. 所有表的并集是全量数据。
      2953321-20240907085802411-1480536564.png
  • 水平拆分
    水平分库:以字段为依据,按照一定策略,将一个库的数据拆分到多个库中。
    特点:

    1. 每个库的表结构都一样
    2. 每个库的数据都不一样
    3. 所有库的并集是全量数据
      2953321-20240907090024679-2001978200.png

    水平分表:以字段为依据,按照一定策略,将一个表的数据拆分到多个表中。
    特点:

    1. 每个表的结构都一样
    2. 每个表的数据都不一样
    3. 所有表的并集是全量数据
  • 总结:水平是拆分数据,垂直是拆分结构


实现技术:

  • shardingjDBC:基于AOP原理,在应用程序中对本地执行的SQL进行拦截,解析、改写、路由处理。需要自行编码配置实现,只支持java语言,性能较高。
  • MyCat:数据库分库分表中间件,不用调整代码即可实现分库分表,支持多种语言,性能不及shardingjDBC

2953321-20240907090540259-184719468.png

二,MyCat概述

Mycat 是开源的、活跃的、基于 java 语言编写的 MySQL数据库中间件。可以像使用 mysql 一样来使用 mycat,对于开发人员来说根本感觉
不到 mycat 的存在。

优势:

  • 性能可靠稳定
  • 强大的技术团队
  • 体系完善
  • 社区活跃

  • 下载:

    | MYCAT 官方网站—中国第一开源分布式数据库中间件

  • 安装:

    Mycat 是采用 java 语言开发的开源的数据库中间件,支持 Windows 和 Linux 运行环境,下面介绍 MyCat 的 Linux 中的环境搭建。我们需要在准备好的服务器中安装如下软件。

    • MySQL
    • JDK
    • Mycat
    服务器安装软件说明
    192.168.200.210JDK,MycatMyCat中间件服务器
    192.168.200.210MySQL分片服务器
    192.168.200.213MySQL分片服务器
    192.168.200.214MySQL分片服务器
  • Mycat 目录结构
    2953321-20240907103539476-160453844.png

    bin:存放可执行文件,用于启动停止 mycat

    conf:存放 mycat 的配置文件

    lib:存放 mycat 的项目依赖包(jar)

    logs:存放 mycat 的日志文件

  • 进入 lib 目录,将 mysql 驱动包替换为 mysql8.0 的驱动包,记得改权限


核心概念介绍:

2953321-20240907103939192-515944011.png

三,MyCat入门

  • 需求: 由于 tb_order 表中数据量很大,磁盘 IO 及容量都到达了瓶颈,现在需要对 tb_order 表进行数据分片,分为三个数据节点,每一个节点主机位于不同的服务器上, 具体的结构,参考下图:

    2953321-20240907105209577-355140109.png

  • 环境准备:
    2953321-20240907105352916-840795237.png

  • 分配配置schema.xml
    2953321-20240907105457213-2041108109.png

    配置 mycat 的用户以及用户的权限信息 (server.xml)
    2953321-20240907110340440-1527663768.png

  • 启动服务

    切换到 Mycat 的安装目录,执行如下命令,启动 Mycat

    #启动
    bin/mycat start
    #停止
    bin/mycat stop
    

    mycat 启动之后,占用端口号 8066

    查看服务是否启动成功

    tail -f logs/wrapper.log
    #只要出现MyCat Server startup successfully代表启动成功
    
  • 分片测试

    通过如下执行,就可以连接并登录 Mycat

    mysql -h 192.168.200.210 - P 8066 -uroot -p123456
    

    然后就可以在 MyCat 中来创建表,并往表结构中插入数据,查看数据在 MySQL 中的分布情况。

    create table TB_ORDER(
    	id bigint(20) not null,
        title varchar(100) not null,
        primary key(id)
    );
    insert into TB_ORDER(id,title) values(1,'goods1');
    insert into TB_ORDER(id,title) values(2,'goods2');
    insert into TB_ORDER(id,title) values(3,'goods3');
    insert into TB_ORDER(id,title) values(10000000,'goods10000000');
    insert into TB_ORDER(id,title) values(100000000,'goods100000000');
    

四,MyCat配置

4.1 schema.xml

schema.xml 作为 MyCat 中最重要的配置文件之一,涵盖了 MyCat 的逻辑库、逻辑表 、分片规则、分片节点及数据源的配置。

主要包含以下三组标签

  • schema标签:主要配置逻辑库,逻辑表的相关信息。
  • datanode标签:主要配置逻辑节点的相关信息。
  • datahost标签:主要配置节点主机以及数据源的相关信息。

4.1.1 schema标签

<schema name="DB01" checkSQLschema="true" sqlMaxLimit="100">
	<table name="TB_ORDER" dataNode="dn1,dn2,dn3" rule="auto-sharding-long"/>
</schema>

schema 标签用于定义 MyCat 实例中的逻辑库,一个 MyCat 实例中,可以有多个逻辑库,可以通过 schema 标签来划分不同的逻辑库。

MyCat 中的逻辑库的概念,等同于 MySQL 中的 database 概念, 需要操作某个逻辑库下的表时, 也需要切换逻辑库 (use xxx)。

核心属性:

  • name:值自定义的逻辑库名
  • checkSQLschema:在SQL语句操作时如果指定了数据库名称,执行时是否自动去除;true自动去除,false不去除
  • sqlMaxLimit:如果未指定limit进行查询,列表查询模式则最多查询的记录数。

table 标签

  • table 标签定义了 MyCat 中逻辑库 schema 下的逻辑表,所有需要拆分的表都需要在 table 标签中定义

  • 核心属性:

    • name:定义逻辑表表名,在改逻辑库下唯一。
    • dataNode:定义逻辑表所属的dataNode,该属性需要与dataNode标签中的name对应;多个dataNode用逗号分隔。
    • rule:分片规则的名字,分片规则名字是在rule.xml中定义的。
    • primaryKey:逻辑表对应真实表的主键。
    • type:逻辑表的类型,目前逻辑表只有全局表和普通表,如未配置,就是普通表,全局表配置为:global

4.1.2 dataNode标签

<dataNode name="dn1" dataHost="dataHost1" database="db01"/>
<dataNode name="dn2" dataHost="dataHost2" database="db01"/>
<dataNode name="dn3" dataHost="dataHost3" database="db01"/>

dataNode 标签中定义了 MyCat 中的数据节点, 也就是我们通常说的数据分片。一个 dataNode 标签就是一个独立的数据分片。

核心属性:

  • name:定义了数据节点名称
  • dataHost:数据库实例主机名称,引用自dataHost标签中的name属性
  • database:定义分片所属数据库

4.1.3 dataHost标签

<dataHost name="dhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="jdbc">
    
	<heartbeat>select user()</heartbeat>
	
    <writeHost host="master" url="jdbc:mysql://192.168.200.210:3306" user="root" password="1234">
    </writeHost>
    
</dataHost>

该标签在 MyCat 逻辑库中作为底层标签存在, 直接定义了具体的数据库实例、读写分离、心跳语句。

核心属性:

  • name:唯一标识,供上层标签使用。
  • maxCon/minCon:最大连接数/最小连接数
  • balance:负载均衡策略,取值为0,1,2,3
  • writeType:写操作分发方式
    • 0:写操作转发到第一个writeHost,第一个挂了,切换到第二个
    • 1:写操作随机分发到配置的writeHost
  • dbDriver:数据库驱动,支持native,jdbc

2953321-20240907144958367-964205469.png

4.2 rule.xml

rule.xml定义所有拆分表的规则,在使用过程中可以灵活的使用分片算法,或者对同一个分片算法使用不同的参数,它让分片过程可配置化。主要包含两类标签:

  • tableRule:主要定义涉及到的分片规则
    • name属性:用于给schema.xmlschema标签的rule属性引用
    • rule子标签,定义分片规则
      • columns:要根据哪个字段进行数据分片
      • algorithm:分片的算法name,就是function标签的name的引用
  • Function:主要定义分片所涉及到的java类和参数配置
    • name属性就是给algorithm引用的
    • class属性:mycat自带的分片规则的java类
      • property子标签,定义这种分片规则关联的一些属性配置,有些直接配置在子标签里面,有些是关连到外部文件里面。

2953321-20240907145112133-1780716180.png

4.3 server.xml

server.xml 配置文件包含了 MyCat 的系统配置信息,主要有两个重要的标签:system、user。

  • system标签:对应的 mycat 系统配置项及其含义,例如一些端口配置等,这个直接去查文档。

  • user标签

2953321-20240907150133293-753799240.png

五,MyCat分片

5.1 垂直拆分

  • 场景

    在业务系统中, 涉及以下表结构, 但是由于用户与订单每天都会产生大量的数据, 单台服务器的数据存储及处理能力是有限的, 可以对数据
    库表进行拆分, 原有的数据库表如下。

2953321-20240907151238095-1784650624.png

  • 准备工作:
    2953321-20240907151327233-1418856879.png

  • 配置 Mycat
    2953321-20240907151435569-856460443.png

2953321-20240907151517139-1171182653.png


image-20240907151828374

5.2 水平拆分

  • 场景

    在业务系统中, 有一张表 (日志表),业务系统每天都会产生大量的日志数据,单台服务器的数据存储及处理能力是有限的, 可以对数据库表进行拆分。

2953321-20240907152206578-666272342.png

  • 准备工作
    2953321-20240907152234380-298628060.png

  • 配置 Mycat

2953321-20240907152317325-1470388500.png

5.3 分片规则

5.3.1 范围分片

范围分片:根据指定的字段及其配置的范围与数据节点的对应情况,来决定该数据属于哪一个分片。

2953321-20240907152618172-92374817.png


配置方式:

2953321-20240907152640767-2063244446.png

id 超出范围会报错!

5.3.2 取模分片

取模分片:根据指定的字段值与节点数量进行求模运算,根据运算结果,来决定该数据属于哪一个分片。

2953321-20240907152853949-1878064975.png


配置方式

2953321-20240907152907435-803549894.png

5.3.3 一致性hash

所谓一致性哈希 **,相同的哈希因子计算值总是被划分到相同的分区表中 **,不会因为分区节点的增加而改变原来数据的分区位置。

2953321-20240907165050104-1339944196.png


配置方式

2953321-20240907165109933-602483226.png

5.3.4 枚举分片

枚举分片:通过在配置文件中配置可能的枚举值,指定数据分布到不同数据节点上, 本规则适用于按照省份、性别、状态拆分数据等业务。

2953321-20240907165315848-700698419.png


配置方式

2953321-20240907165339719-1320579136.png

前面写枚举值,后面写保存在哪个节点

5.3.5 应用指定算法

应用指定算法:运行阶段由应用自主决定路由到那个分片, 直接根据字符子串 (必须是数字) 计算分片号。

  • 字符串子串:根据字符串字段里面的指定部分子串来计算分片号。

2953321-20240907165709903-193752552.png


配置方式

2953321-20240907165807577-201187003.png

5.3.6 固定分片hash算法

固定分片 hash 算法:该算法类似于十进制的求模运算,但是为二进制的操作,例如,取过 d 的二进制低 10 位与 1111111111 进行位 & 运算。

2953321-20240907170207319-1625170578.png


配置方式

2953321-20240907170847516-1543259054.png

代码解释:

<property name="partitionCount">2,1</property>
<property name="partitionLength">256,512</property>
  • partitionCount:分片的数量

  • partitionLength:分片的长度

    2 代表有两个分片节点,1 代表有 1 个分片节点,这个 2 代表前面 2 个分片节点的长度都是 256,1 代表后面节点长度为 512

5.3.7 字符串hash解析

字符串 hash 解析:截取字符串中的指定位置的子字符串, 进行 hash 算法,算出分片。

2953321-20240907171026177-1091505728.png


配置方式
2953321-20240907171431548-1065731717.png

代码解释

  • partitionCount:分片的数量

  • partitionLength:分片的长度

    这俩参数和上一个算法的设置方法是一样的。

  • hashSlice:哈希运算位,格式是start:end,就是我们在 hash 运算截取子字符串的范围。

    • 如果0出现在end位置,代表的是整个字符串长度
    • 如果-1出现在end位置,代表的是字符串长度-1
    • 如果end是大于0的,代表数字本身

5.3.8 按天分片

按天分片:指定开始,结束时间,时间间隔。比如说第一个 10 天就存储在第一个分片,第二个十天存储在第二个分片。

2953321-20240907171550574-1839789171.png


配置方式

2953321-20240907171732840-1709527786.png

红色的字体意思是,时间拆分出的分片数量必须和我们 dataNode 数量保持一致

5.3.9 按自然月份分片

按自然月份分片:使用场景为按照月份来分片, 每个自然月为一个分片,如下图,配置了起始时间和结束时间后,超出的部分重新循环到第一个分片,第二个分片这样。

2953321-20240907171944690-1661704099.png


配置方式

2953321-20240907172031654-652556550.png

红色字体的意思是,配置出来的分片数量必须和 dataNode 的数量保持一致。

六,MyCat管理及监控

6.1 Mycat原理

2953321-20240907191220040-1243978681.png

6.2 Mycat管理工具

Mycat 默认开通 2 个端口,可以在server.xml中进行修改。

  • 8066 数据访问端口,即进低 DML和 DDL操作。
  • 9066 数据库管理端口,即 mycat 服务管理控制功能,用于管理mycat的整个集群状态
mysql -h 192.168.200.210 -P 9066 -u root -p 123456
命令解释
show @@help查看Mycat管理工具帮助文档
show @@version查看Mycat版本
reload @@config重新加载Mycat的配置文件
show @@datasource查看Mycat的数据源信息
show @@datanode查看Mycat现有的分片节点信息
show @@threadpool查看Mycat的线程池信息
show @@sql查看执行的SQL
show @@sql.sum查看执行的SQL统计

6.3 Mycat监控

6.3.1 介绍

Mycat-eye

Mycat-web(Mycat-eye)是对 mycat-server 提供监控服务,功能不局限于对 mycat-server 使用。他通过 JDBC 连接对 Mvcat、Mvsql 监控,控远程服务器 (目前仅限于 linux 系统) 的 cpu、内存、网络、磁盘。

Mycat-eye 运行过程中需要依赖 zookeeper,因此需要先安装 zookeeper

6.3.2 安装

  • 安装 Zookeeper

    1. 上传安装包zookeeper-3.4.6.tar.gz

    2. 解压

      tar -zxvf zookeeper-3.4.6.tar.gz -C /usr/local
      
    3. 创建数据存放目录

      cd /usr/local/zookeeper-3.4.6/
      mkdir data
      
    4. 修改配置文件名称并配置

      cd config
      mv zoo_sample.cfg zoo.cfg
      
    5. 配置数据存放目录

      dataDir=/usr/local/zookeeper-3.4.6/data
      
    6. 启动

      bin/zkServer.sh start
      bin/zkServer.sh status
      
  • 安装 Mycat-web

    1. 上传安装包Mycat-web.tar.gz

    2. 解压

      tar -zxvf Mycat-web.tar.gz -C /usr/local
      
    3. 目录介绍

      • etc:jetty配置文件
      • lib:依赖jar包
      • mycat-web:mycat-web项目
      • readme.txt
      • start.jar:启动jar
      • start.sh:linux启动脚本
    4. 启动

      sh start.sh
      
    5. 访问

      http://192.168.200.210:8082/mycat
      

    备注:

    • 如果Zookeeper与Mycat-web不在一个服务器,需要设置zookeeper的地址;在/usr/local/mycat-web/mycat-web/WEB-INF/classes/mycat.properties文件中配置

2953321-20240907193156124-1582581659.png

6.3.3 配置mycat-web

  • 开启 Mycat 的实时统计功能 (server.xml)

    <property name="useSqlStat">1</property><!--1开启,0关闭-->
    
  • 在 Mycat 监控界面配置服务地址
    2953321-20240907193431609-1628449065.png

动物装饰