MyCAT 介绍,MyCAT主要功能 ,MyCAT 安装,MyCAT 配置(灵异问题,见文末)

MyCAT介绍

Mycat是一个介于数据库与应用之间,进行数据处理与交互的中间服务! 通俗点讲,应用层可以将它看作是一个数据库的代理(或者直接看成加强版数据库)。但是由于真正的数据库需要存储引擎,而 Mycat 并没有存储引擎,Mycat服务不保存真正的数据,所以并不是完全意义的分布式数据库系统。所以称Mycat这样类型的数据库中间代理服务的产品为数据库中间件。
在这里插入图片描述

MyCAT 主要功能

读写分离
系统可配置是否开启读写分离,不开启读写分离机制,所有读写操作都发送到当前指定的数据库host连接上,也就是所有请求在同一个connection数据库连接里面。开启读写分离需要指定读写各自的host配置连接,所有读操作都自动发送到指定的 writeHost和readHost上

分库分表
分库分表的概念大家都知道,在原始的处理方式中底层查询分库分表的逻辑相对复杂相对来说分表操作查询次数与获取次数较多,此时MyCAT替我们解决了这个问题,它无需我们处理多个连接库,或多个表,只需要配置好逻辑库逻辑表就可以了,使用的时候和原始连接数据库相同,不需要关注过多的库和表

可查看schema.xml 的详细配置

基本概念

 逻辑库(Schema)
 逻辑表(table)
 分片节点(dataNode)
 节点主机(dataHost)
 分片规则(rule)
 全局序列号(sequence)

在这里插入图片描述

逻辑库(Schema)

在实际的开发中,开发人员不需要知道数据库中间件的存在,开发人员只需要有数据库的概念就可以了。所以数据库中间件可以被看做是一个或者多个数据库集群构成的逻辑库。例如:上图中的例子,我们可以理解为系统先做了垂直切分,被分为了3个库,用户库,订单库,商品库,而这3个库就被称为逻辑库。

逻辑表(table)

既然有逻辑库,那么就有逻辑表,对于应用系统来说,读写数据的表,就是逻辑表。而逻辑表中的数据,则是被水平切分后,分布在不同的分片库中。如上图所示:假设用户库中有一张用户表,这个用户表就被称为逻辑表,而用户表又被水平切分为3个表,每一个表中都存储一部分用户数据。业务系统在进行用户数据的读写时,只需要操作逻辑表就可以了,后面的分片细节则由MyCat进行操作,这些对于业务开发人员来说时完全透明的。当然,有些表的数据量没有那么大,完全不需要进行分片,只在一个物理的数据库表中即可。

凡是我们做的数据水平切分的表,我们把它叫做分片表。而数据量比较小,没有进行分片的表,我们叫它非分片表。

在真实的业务系统中,往往存在着大量的字典表,这些表的数据基本上很少变动,比如:订单状态。我们查询的时候,往往需要关联字典表去查询,比如:查询订单时,需要把订单状态关联查出,如果订单表做了分片,分布在不同的数据库中,而订单状态表由于数据量小,没有做分片,那么我们查询的时候就要跨库关联查询订单状态,增加了不必要的麻烦,不如我们干脆把订单状态表冗余到所有的订单分片库中,这样关联查询就不需要跨库了。我们把这种通过数据冗余方式复制到所有的分片库中的表,叫做全局表。

分片节点(dataNode)

数据被切分后,一张大表被分到不同的分片数据库上面,每个分片表所在的数据库就叫做分片节点。

节点主机(dataHost)

数据切分后,每一个分片节点不一定都会占用一个真正的物理主机,会存在多个分片节点在同一个物理主机上的情况,这些分片节点所在的主机就叫做节点主机。为了避免单节点并发数的限制,尽量将读写压力高的分片节点放在不同的节点主机上。

分片规则(rule)

一个大表被拆分成多个分片表,就需要一定的规则,按照某种业务逻辑,将数据分到一个确定的分片当中,这个规则就叫做分片规则。数据切分选择合适的分片规则非常重要,这将影响到后的数据处理难度,结合业务,选择合适的分片规则,是对架构师的一个重大考验。对于架构师来说,选择分片规则是一个艰难的,难以抉择的过程。

全局序列号(sequence)

大家有没有想过,数据切分以后,数据库表的中的id怎么办?原来在一张表的时候,我们采用id自增,但是数据分布到多个库怎么办?比如:向用户表插入数据,第一条记录插入了用户库1,它的id为1;第二条记录插入了用户库2,如果是自增,它的id也为1。这样id就混乱了,我们也无法确定一条数据的唯一标识了。这时,我们需要借助外部的机制保证数据的唯一标识,这种保证数据唯一标识的机制,我们叫做全局序列号。

MyCAT 安装

mycat 2.0 与 1.6相关版本差异较大还在开发中不推荐上生产环境,官方推荐使用 MyCAT1.6.7.6 版本作为生产环境的配置

安装环境(不会吧不会吧,真的有人还用这么低的环境版本吧)

jdk:要求jdk必须是1.7及以上版本

Mysql:推荐mysql是5.5以上版本

第一步 下载软件压缩包

官网地址
http://www.mycat.org.cn/
本文使用的文件下载地址 (本文介绍linux安装配置步骤,windows 配置大同小异)
http://dl.mycat.org.cn/1.6.7.6/20201126013625/Mycat-server-1.6.7.6-release-20201126013625-linux.tar.gz
此处我们只介绍 MyCAT1.6.7.6 的安装配置过程,官方最新通知目前1.6只维护1.6.7.6的版本
在这里插入图片描述

第二步 上传并解压到指定位置

进入到文件上传目录 解压安装包
tar -zxvf Mycat-server-1.6.7.6-release-20201126013625-linux.tar.gz

第三步 修改相关配置

主要配置文件如下

  1. server.xml

修改 root 账户的密码和指定库(此处删除了原始的库名配置),此处定义了一个root用户,可以管理的逻辑库为testDb,对应schema.xml中的schema name=“testDb” 定义其它用户则和root账户配置相同即可在这里插入图片描述

  1. schema.xml

此处不用看原始的复杂配置内容和注释,内容结构大致为
在这里插入图片描述

首先修改数据获取的连接配置 ,再指定连接地址名
在这里插入图片描述

其次配置节点名称,指定连接的数据库名 name 节点名, dataHost 连接地址名 ,database 该连接中的数据库名称, 此处如果有多个库时 dataHost 可配置多个连接名由逗号隔开,当我们配置完成后,当两个连接地址中的表名结构相同时,此时连接mycat 查询时两个库的数据会自动在同一个逻辑表中

在这里插入图片描述

配置逻辑库 schema 逻辑库标签,name指定 逻辑库名称

在这里插入图片描述

逻辑表
(注:不管大小写表明如何 mycat 全部会转为小写,如果mysql不开启忽略大小写会提示找不到数据表)
此处我配置了多个table ,测试时只配置一个查看即可, 配置好 name dataNode 即可 其它属性配置可查看官方文档深入了解
name 指定表名,此处的表名必须存在于数据库中,否则连接操作时会提示表不存在, primaryKey 指定id ,当主键自动增时需要配置 autoIncrement 是否全局表, dataNode 从那个节点中获取数据, subTables 分表时表名不同配置,rule 分片规则

在这里插入图片描述

  1. rule.xml (此处仅介绍与简单配置规则,首次安装配置可先忽略)

此处配置分片规则,如:如何配置日表分片规则

name 指定分片规则名称
columns 指定 分片依据哪一个表字段
algorithm 指定分片方法
在这里插入图片描述

name 于上述 algorithm 指定名称相同 class 原系统的时间方法路径 dataFormar 转换日期格式 sBeginDate开始时间SpartionDay 分表时间间隔
在这里插入图片描述
表调用分片规则的配置 rule 对应上述tableRyle的名称 subTables 指定表明规则和范围 如:
tb_information_push_log_2020120$1-9,tb_information_push_log_202012$10-31,tb_information_push_log_2021010$1-9,tb_information_push_log_202101$10-31
由于mycat 分表规则适配 不灵活所以多个配置规则用逗号隔开
指定了 tb_information_push_log_ 表后缀为 20201201 到 20210131 的表分片,数据插入时会自动吧数据插入对应的表格中
注:Mycat 无法配置不存在的表名也就是说 ,上述配置的后缀表必须存在于数据库中

在这里插入图片描述

第四步 启动

进入MyCat 解压文件 bin目录中执行 启动命令

./mycat start

如下为 MyCat 所有命令
Usage: ./mycat { console | start | stop | restart | status | dump }

第五步 连接

可先在配置机上测试能否进入Mycat 执行如下命令

Mycat 默认连接端口 8066

mysql -u账户 -p密码 -P端口 -hIP
mysql -uroot -p123456 -P8066 -h127.0.0.1

外网连接和mysql 连接配置相同
在这里插入图片描述

最后附上我配置好的日表mycat 连接

原数据库有很多表如下:
在这里插入图片描述

mycat 连接数据库
此处原很多的log表数据都在 tb_information_push_log 逻辑表中
在这里插入图片描述

此文配置未详细讲述,配置详见官方文档
http://www.mycat.org.cn/
http://www.mycat.org.cn/document/mycat-definitive-guide.pdf
https://www.yuque.com/books/share/0576de75-ffc4-4c34-8586-952ae4636944

可能遇到的坑

问题1(java.sql.SQLException: Unknown system variable ‘query_cache_size’)

项目驱动调整为 5.1.35
切记(官方git上的issues)(确实解决了大部分问题,如果还提示上述错误请看下一步操作)
(此方法不推荐 : 可改源码提交sql方式 注:自己打包注意配置防火墙,和文件编码,注意配置缩进)
https://github.com/MyCATApache/Mycat-Server/issues/2559
在这里插入图片描述

当mysql版本为8以上版本时 ,需要修改配置支持 并替换 mycat bin 目录下的驱动
修改配置支持 :?useSSL=false&serverTimezone=UTC&characterEncoding=utf8
如:
dbc:mysql://127.0.0.1:3306?useSSL=false&serverTimezone=UTC&characterEncoding=utf8
替换驱动:
在这里插入图片描述

问题2(Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: #HY000)

提示这个错误时,基本错误为版本的默认参数被删除,或者文件保存格式问题
解决方法:
(问题大部分出在配置上)
切记切记,配置最好通过 vim 等命令去编辑 ,勿配置好后再替换文件(也不绝对)
第二种情况
在连接上加上如下参数:
characterEncoding=utf8
如:
dbc:mysql://127.0.0.1:3306?useSSL=false&serverTimezone=UTC&characterEncoding=utf8

问题3 (Caused by: io.mycat.config.util.ConfigException: org.xml.sax.SAXParseException; lineNumber: 155; columnNumber: 14; The content of element type “mycat:rule” must match “(tableRule*,function*)”.)

在这里插入图片描述

这个问题 是因为定义的规则和方法位置问题引起的,(可能不全是,但是如下时一种解决办法)
配置的规则名 必须与规则名一起,定义的方法必须与其它方法放在一起,如:

规则
规则
规则

方法
方法
方法

问题4 mycat 1.6 不支持json 类型 ,无论怎么处理都是乱码

目前解决办法只有不使用数据库的json字段 ,用text 或其它类型代替

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐