MYCAT分库分表中间件的简单配置与使用

前一段时间读了一本分布式相关的书籍,讲到了一种mysql的分库分表的中间件——shark,对它进行了一点研究,想用在实验室要做的分布式交换系统之中。但是后来发现了一个问题,shark不支持强一致性的系统,而实验室的分布式交换系统对于强一致性要求又比较高,不得已放弃学习shark,到网上查找资料,发现有一款国人自主开发的mysql分库分表中间件——MyCat的评价非常不错,于是来学习学习。

MYCAT是mysql分库分表中间件,前身是由阿里开发的Cobar,但开源了一段时间后就不再维护了。于是MYCAT在这个基础之上继续开发,优化了很多机制(如由BIO优化为NIO),在大数据时代,其重要性愈发明显。以下是官方网站(www.mycat.io)中介绍的片段:

什么是MYCAT

  • 一个彻底开源的,面向企业应用开发的大数据库集群
  • 支持事务、ACID、可以替代MySQL的加强版数据库
  • 一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群
  • 一个融合内存缓存技术、NoSQL技术、HDFS大数据的新型SQL Server
  • 结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品
  • 一个新颖的数据库中间件产品

MYCAT的架构为:

MYCAT的开源社区为了帮助使用者更好更快的掌握MYCAT使用技巧和方法,撰写了《MYCAT》权威指南,可以到官方网站上下载电子版。

下面开始简单的配置与使用。

首先环境是ubuntu-14.04操作系统,装好mysql-5.6。还由于MYCAT是用JAVA编写的,需要java7以上的环境。在MYCAT的官方网站上下载MYCAT到系统之中(在写这篇文章的时候,MYCAT的最新版本是1.6),解压并且拷贝到/usr/local/Mycat/目录下。编辑/etc/profile文件,在末尾添加export MYCAT_HOME=/usr/local/Mycat,保存退出,执行source /etc/profile使其生效。

在不配置集群的情况下,此时应该可以启动mycat了,通过$MYCAT_HOME/bin/mycat start即可在后台启动mycat,将start改为console可以在控制台启动。如果发现启动不了,可以查看$MYCAT_HOME/logs/下可以查看MYCAT的日志,一般通过日志都可以看出有什么问题,如主机名没绑定等问题。如果是mysql的用户名密码不对,导致MYCAT连接mysql失败,不着急,看后面。

然后就是MYCAT的重点了,几个关键配置文件($MYCAT_HOME/conf/目录下)的配置方法:

(1)server.xml

这个配置文件定义了MYCAT服务的基本信息,如MYCAT的用户名及密码,还有对哪些逻辑库有操作权限等等。对于最简单的配置来说,关心用户配置即可:

这里配置了两个用户,root和user,root用户可以操作的逻辑库为TESTDB,密码为root; user用户的密码为user,可以操作的逻辑库也为TESTDB,但是只有可读权限。

(2)schema.xml

这个配置文件定义的内容就有点多了。首先说一下个人对于逻辑库的理解,逻辑库实际上是在MYCAT中才存在的数据库,在实际的mysql中并不存在这个数据库,所以才是逻辑上的数据库,设计逻辑库的原因是要让MYCAT中的一个库就能对应到mysql中的不同的库,最终实现分库分表。下面是逻辑库的定义:

这里定义了一个逻辑库TESTDB,里面有一张逻辑表travelrecord(原来默认的一逻辑些表已经注释),它的主键是id,有三个数据节点(dataNode)dn1、dn2、dn3(配置见后面),所使用的分片算法是auto-sharding-long(配置见后面)。

接下来是数据节点的定义(dataNode):

其中数据节点dn1对应的主机是localhost1,实际数据库是db1;数据节点dn2对应的主机是localhost1,实际数据库是db2;数据节点dn3对应的主机是localhost1,实际数据库是db3。对于主机localhost1的配置,即是locathost:3306,用户名配置为root,密码配置为自己mysql数据库实际的密码(前面如果由于数据库密码不对导致MYCAT无法连接mysql的话,此时应该可以连接了)

(3)rule.xml

这个配置文件配置了分片算法。前面我们定义逻辑表travelrecord使用分片算法auto-sharding-long,于是在这个文件中定义:

这个键值对定义了auto-sharding-long算法使用id列来进行判断,具体实现为rang-long:

这个键值对定义了rang-long实现的类,和具体实现方法的文件为conf目录下的autopartition-long.txt文件,这个文件的内容为:

可见,根据id进行分片,id为0-50000时,分片到index为0的数据库(即db1);id为50001-100000时,分片到index为1的数据库(即db2);id为100001-150000时,分片到index为2的数据库(即db3)。

此时,需要在mysql数据库中新建三个数据库(即在MYCAT中定义的db1、db2、db3):

create database db1; create database db2; create database db3;

在每个库中新建表travelrecord:

create table travelrecord (id bigint not null primary key,user_id varchar(100),traveldate DATE, fee decimal,days int);

分别在三个数据库中添加一条数据(注意id):

insert into travelrecord(id,user_id,traveldate,fee,days) values(1,’Victor’,20160101,100,10);

insert into travelrecord(id,user_id,traveldate,fee,days) values(5000001,’Job’,20160102,100,10);

insert into travelrecord(id,user_id,traveldate,fee,days) values(10000001,’Slow’,20160103,100,10);

这个时候,使用navicat工具,连接到MYCAT,用户名之前配置的为root,密码之前也配置的为root,端口为8066(MYCAT对外提供服务器的默认端口)。可以发现有一个逻辑库TESTDB,逻辑库中有一张逻辑表travelrecord,表中可以查询到之前在mysql中的三个数据库(db1,db2,db3)中添加的三条记录:

此时我们在逻辑表中添加一条记录,id为50002,其它内容随便填。按照分片规则,此时应该分片到实际数据库db2,我们这时到mysql的db2数据库的travelrecord表中查看,就可以看到这条记录:

当然,我们也可以在逻辑表中删除id为50002的记录,再到mysql的db2数据库的travelrecord表中查看,发现这条记录已经被删除了。

这只是一个非常简单的分库分表的示例。在系统分布式化、大规模化的方面,在大量数据得到分库分表后,同时实现MYCAT集群化可以在一定程度上缓解数据库读写瓶颈的问题。

当然,据开源社区给的文档,MYCAT还有好多好玩的功能,如MYCAT监控、MYCAT通过zookeeper启动等,在此不一一介绍了。

共有 0 条评论

Top