十七,MyCat配置分库分表

239 阅读12分钟

一,介绍

image-20240907084104155

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

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

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


拆分策略:

image-20240907084238021

  • 垂直拆分

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

    特点:

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

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

    特点:

    1. 每个表的结构都不一样。
    2. 每个表的数据也术一样,一般通过一列(主键/外键)关联。
    3. 所有表的并集是全量数据。
    image-20240907085803176
  • 水平拆分

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

    特点:

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

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

    特点:

    1. 每个表的结构都一样
    2. 每个表的数据都不一样
    3. 所有表的并集是全量数据
    image-20240907090116577转存失败,建议直接上传图片文件
  • 总结:水平是拆分数据,垂直是拆分结构


实现技术:

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

image-20240907090541023

二,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目录结构

    image-20240907103539881

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

    conf:存放mycat的配置文件

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

    logs:存放mycat的日志文件

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


核心概念介绍:

image-20240907103939679

三,MyCat入门

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

    image-20240907105210182
  • 环境准备:

    image-20240907105353687
  • 分配配置schema.xml

    image-20240907105457670

    配置mycat的用户以及用户的权限信息(server.xml)

    image-20240907110341219

  • 启动服务

    切换到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

image-20240907144940938

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子标签,定义这种分片规则关联的一些属性配置,有些直接配置在子标签里面,有些是关连到外部文件里面。

image-20240907145112222

4.3 server.xml

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

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

  • user标签

    image-20240907150133363

五,MyCat分片

5.1 垂直拆分

  • 场景

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

    image-20240907151224174

  • 准备工作:

    image-20240907151327241

  • 配置Mycat

    image-20240907151433210

    image-20240907151517111

image-20240907151828374

5.2 水平拆分

  • 场景

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

    image-20240907152206580

  • 准备工作

    image-20240907152234618

  • 配置Mycat

    image-20240907152303860

5.3 分片规则

5.3.1 范围分片

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

image-20240907152618172

配置方式:

image-20240907152640741

id超出范围会报错!

5.3.2 取模分片

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

image-20240907152854205

配置方式

image-20240907152907516

5.3.3 一致性hash

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

image-20240907165049961

配置方式

image-20240907165109728

5.3.4 枚举分片

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

image-20240907165315968

配置方式

image-20240907165339531

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

5.3.5 应用指定算法

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

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

配置方式

image-20240907165807215

5.3.6 固定分片hash算法

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

image-20240907170207391


配置方式

image-20240907170847139

代码解释:

<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算法,算出分片。

image-20240907171026324

配置方式

image-20240907171431425

代码解释

  • partitionCount:分片的数量

  • partitionLength:分片的长度

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

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

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

5.3.8 按天分片

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

image-20240907171550695

配置方式

image-20240907171732530

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

5.3.9 按自然月份分片

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

image-20240907171944855

配置方式

image-20240907172031594

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

六,MyCat管理及监控

6.1 Mycat原理

image-20240907191205731

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文件中配置

    image-20240907193140349

6.3.3 配置mycat-web

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

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

    image-20240907193415865