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

       前一段时间读了一本分布式相关的书籍,讲到了一种mysql的分库分表的中间件——sharding,对它进行了一点研究,想用在实验室要做的分布式交换系统之中。但是后来发现了一个问题,sharding不支持强一致性的系统,而实验室的分布式交换系统对于强一致性要求又比较高,不得已放弃学习sharding,到网上查找资料,发现有一款国人自主开发的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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值