Mycat 学习(一)

Mycat 概述

Mycat 是什么?从定义和分类来看,它是一个开源的分布式数据库系统,是一个实现了MySQL 协议的的Server,前端用户可以把它看作是一个数据库代理,用MySQL 客户端工具和命令行访问,而其后端可以用MySQL 原生(Native)协议与多个MySQL 服务器通信,也可以用JDBC 协议与大多数主流数据库服务器通信,其核心功能是分表分库,即将一个大表水平分割为N 个小表,存储在后端MySQL 服务器里或者其他数据库里。

Mycat 发展到目前的版本,已经不是一个单纯的MySQL 代理了,它的后端可以支持MySQL、SQLServer、Oracle、DB2、PostgreSQL 等主流数据库,也支持MongoDB 这种新型NoSQL 方式的存储,未来还会支持更多类型的存储。而在最终用户看来,无论是那种存储方式,在Mycat 里,都是一个传统的数据库表,支持标准的SQL 语句进行数据的操作,这样一来,对前端业务系统来说,可以大幅降低开发难度,提升开发速度。

对于DBA 来说,可以这么理解Mycat:

Mycat 就是MySQL Server,而Mycat 后面连接的MySQL Server,就好象是MySQL 的存储引擎,如InnoDB,MyISAM 等,因此,Mycat 本身并不存储数据,数据是在后端的MySQL 上存储的,因此数据可靠性以及事务等都是MySQL 保证的。

对于软件工程师来说,可以这么理解Mycat:

Mycat 就是一个近似等于MySQL 的数据库服务器,可以用连接MySQL 的方式去连接Mycat(除了端口不同,默认的Mycat 端口是8066 而非MySQL 的3306,因此需要在连接字符串上增加端口信息),大多数情况下,可以用你熟悉的对象映射框架使用Mycat。

对于架构师来说,可以这么理解Mycat:

Mycat 是一个强大的数据库中间件,不仅仅可以用作读写分离、以及分表分库、容灾备份,而且可以用于多租户应用开发、云平台基础设施、让你的架构具备很强的适应性和灵活性。

Mycat 原理

Mycat 的原理中最重要的一个动词是“拦截”,它拦截了用户发送过来的SQL 语句,首先对SQL 语句做了一些特定的分析:如分片分析、路由分析、读写分离分析、缓存分析等,然后将此SQL 发往后端的真实数据库,

并将返回的结果做适当的处理,最终再返回给用户。

image.png

Orders 表被分为三个分片datanode(简称dn),这三个分片是分布在两台MySQL Server 上(DataHost),即datanode=database@datahost 方式,因此你可以用一台到N 台服务器来分片,分片规则为(sharding rule)典型的字符串枚举分片规则,一个规则的定义是分片字段(sharding column)+分片函数(rulefunction),这里的分片字段为prov 而分片函数为字符串枚举方式。

当Mycat 收到一个SQL 时,会先解析这个SQL,查找涉及到的表,然后看此表的定义,如果有分片规则,则获取到SQL 里分片字段的值,并匹配分片函数,得到该SQL 对应的分片列表,然后将SQL 发往这些分片去执行,最后收集和处理所有分片返回的结果数据,并输出到客户端。以select * from Orders where prov=?语句为例,查到prov=wuhan,按照分片函数,wuhan 返回dn1,于是SQL 就发给了MySQL1,去取DB1 上的查询结果,并返回给用户。

如果上述SQL 改为select * from Orders where prov in (‘wuhan’,‘beijing’),那么,SQL 就会发给MySQL1 与MySQL2 去执行,然后结果集合并后输出给用户。但通常业务中我们的SQL 会有Order By 以及Limit 翻页语法,此时就涉及到结果集在Mycat 端的二次处理。

常见概念

逻辑库 (schema)

通常对实际应用来说,并不需要知道中间件的存在,业务开发人员只需要知道数据库的概念,所以数据库中间件可以被看做是一个或多个数据库集群构成的逻辑库。

逻辑表( table

既然有逻辑库,那么就会有逻辑表,分布式数据库中,对应用来说,读写数据的表就是逻辑表。逻辑表,可以是数据切分后,分布在一个或多个分片库中,也可以不做数据切分,不分片,只有一个表构成。

分片表

分片表,是指那些原有的很大数据的表,需要切分到多个数据库的表,这样,每个分片都有一部分数据,所有分片构成了完整的数据。

非分片表

一个数据库中并不是所有的表都很大,某些表是可以不用进行切分的,非分片是相对分片表来说的,就是那些不需要进行数据切分的表。

ER

关系型数据库是基于实体关系模型(Entity-Relationship Model)之上,通过其描述了真实世界中事物与关系,Mycat 中的ER 表即是来源于此。根据这一思路,提出了基于E-R 关系的数据分片策略,子表的记录与所关联的父表记录存放在同一个数据分片上,即子表依赖于父表,通过表分组(Table Group)保证数据Join 不会跨库操作。

表分组(Table Group)是解决跨分片数据join 的一种很好的思路,也是数据切分规划的重要一条规则。

全局表

一个真实的业务系统中,往往存在大量的类似字典表的表,这些表基本上很少变动,字典表具有以下几个特性:

• 变动不频繁;

• 数据量总体变化不大;

• 数据规模不大,很少有超过数十万条记录。

对于这类的表,在分片的情况下,当业务表因为规模而进行分片以后,业务表与这些附属的字典表之间的关联,就成了比较棘手的问题,所以Mycat 中通过数据冗余来解决这类表的join,即所有的分片都有一份数据的拷贝,所有将字典表或者符合字典表特性的一些表定义为全局表。

数据冗余是解决跨分片数据join 的一种很好的思路,也是数据切分规划的另外一条重要规则。

分片节点 (dataNode)

数据切分后,一个大表被分到不同的分片数据库上面,每个表分片所在的数据库就是分片节点(dataNode)。

节点主机 (dataHost)

数据切分后,每个分片节点(dataNode)不一定都会独占一台机器,同一机器上面可以有多个分片数据库,这样一个或多个分片节点(dataNode)所在的机器就是节点主机(dataHost),为了规避单节点主机并发数限制,尽量将读写压力高的分片节点(dataNode)均衡的放在不同的节点主机(dataHost)。

分片规则 (rule)

前面讲了数据切分,一个大表被分成若干个分片表,就需要一定的规则,这样按照某种业务规则把数据分到某个分片的规则就是分片规则,数据切分选择合适的分片规则非常重要,将极大的避免后续数据处理的难度。

全局序列号 (sequence)

数据切分后,原有的关系数据库中的主键约束在分布式条件下将无法使用,因此需要引入外部机制保证数据唯一性标识,这种保证全局性的数据唯一标识的机制就是全局序列号(sequence)

Mycat安装与部署

MyCAT 是使用JAVA 语言进行编写开发,使用前需要先安装JAVA 运行环境(JRE),由于MyCAT 中使用了JDK7 中的一些特性,所以要求必须在JDK7 以上的版本上运行。同时Mysql建议使用5.5以上版本,5.6为宜。

进入github.com/MyCATApache…dl.mycat.io/, 在列表中选择一个合适自己操作系统的包下载,然后解压在某个目录下。

Mycat是个标准的Java程序,解压后即可运行。Linux下执行 mycat ,windows下执行 startup_nowrap.bat

在Mycat的目录中: image.png

bin 程序目录,存放了启动脚本,除了提供封装成服务的版本之外,也提供了nowrap 的脚本命令。

注:mycat 支持的命令{ console | start | stop | restart | status | dump }

conf 目录下存放配置文件,server.xml 是Mycat 服务器参数调整和用户授权的配置文件,schema.xml 是逻辑库定义和表以及分片定义的配置文件,rule.xml 是分片规则的配置文件,分片规则的具体一些参数信息单独存放为文件,也在这个目录下,配置文件修改,需要重启Mycat 或者通过9066 端口reload.

lib 目录下主要存放mycat 依赖的一些jar 文件.

日志存放在logs/mycat.log 中,每天一个文件,日志的配置是在conf/log4j.xml 中,根据自己的需要,可以调整输出级别为debug,debug 级别下,会输出更多的信息,方便排查问题。

管理命令

MyCAT 自身有类似其他数据库的管理监控方式,可以通过Mysql 命令行,登录管理端口(9066)执行相应的SQL 进行管理,也可以通过jdbc 的方式进行远程连接管理。

登录:目前mycat 有两个端口,8066 数据端口,9066 管理端口,命令行的登陆是通过9066 管理端口来操作,登录方式类似于mysql 的服务端登陆。

mysql -h127.0.0.1 -utest -ptest -P9066 [-dmycat]

-h 后面是主机,即当前mycat 按照的主机地址,本地可用127.0.0.1 远程需要远程ip

-u Mycat server.xml 中配置的逻辑库用户

-p Mycat server.xml 中配置的逻辑库密码

-P 后面是端口默认9066,注意P 是大写

-d Mycat server.xml 中配置的逻辑库

show @@help; 可以查看所有的命令

reload @@config; 该命令用于更新配置文件,例如更新schema.xml 文件后在命令行窗口输入该命令,可不用重启即进行配置文件更新。

show @@database; 该命令用于显示MyCAT 的数据库的列表,对应schema.xml 配置文件的schema 子节点

show @@datanode; 该命令用于显示MyCAT 的数据节点的列表,对应schema.xml 配置文件的dataNode 节点,其中,“NAME”表示dataNode 的名称;“dataHost”表示对应dataHost 属性的值,即数据主机;“ACTIVE”表示活跃连接数;“IDLE”表示闲置连接数;“SIZE”对应总连接数量。

运行如下命令,可查找对应的schema 下面的dataNode 列表:

show @@datanode where schema = ?

show @@version该命令用于获取MyCAT 的版本

show @@connection该命令用于获取Mycat 的前端连接状态,即应用与mycat 的连接

kill @@connection id,id,id用于杀掉连接。

show @@backend查看后端连接状态。

show @@sql ; ****用来记录用户通过本地8066 端口向Mycat-Server 发送的SQL 请求执行

信息

show @@sql.slow ; ****请求执行SQL 语句中超过慢SQL 时间阈值的(reload @@sqlslow=0 ; # 是的这条命令就是刚才提到的'如何设定慢SQL' 时间阈值的命令)

show @@sql.sum ; ****执行的SQL 命令的统计信息数据

猜你喜欢

转载自juejin.im/post/7069405042863767560
今日推荐