Mycat是阿里开源的数据库中间件,用java语言编写,目前是1.x版本,2.0版本正在研发中。
Mycat支持的数据库很多,目前常用的基本都包含了,mysql,postgresql,sqlserver,oracle,db2等等。Mycat的作用和其他中间件一样,最简单的功能来说,就是支持分库功能,这个在海量数据的应用中非常方便,无需我们人为编码来进行分库分表,直接通过连接Mycat,他帮我屏蔽了底层实现细节,我们就像普通数据库一样去使用,无需关心怎么对应物理数据库中的具体哪个库或者哪张表。
这里以mysql数据库为例,我们通过Mycat来连接mysql,实现分库功能。
准备工作:
1、安装jdk,因为Mycat是java语言编写,运行依赖jre。
2、安装mysql。其实不用按照官方文档或者其他博客,需要安装mysql主从复制集群,单机版的mysql也可以。
3、安装Mycat。下载github或者官网的压缩包解压即可运行。
这里我的环境里面有了jdk以及mysql,只需要下载Mycat,这里mysql的用户名密码是huali/huali2019,mysql数据库安装在本机,因此host就是127.0.0.1,端口默认3306。这里有必要区分一下Mycat连接的用户名和密码,默认是root/123456,端口是8066。
这个实验的目的是验证Mycat的分库功能,我们首先连接mysql,在上面建立三个数据库分别为:db1,db2,db3,为后面Mycat启动做准备。
此时,db1,db2,db3中均是没有表的:
接着,我们修改Mycat的配置文件,conf目录下的schema.xml,指定会做分库的表,以及数据库连接信息:
table指定了会分库的表,使用默认的规则auto-sharding-long,即5,000,000条记录为一组,会存放在db1,超过5,000,000条记录存放在db2中,超过10,000,000条记录存放在db3中。
在dataNode中,我们指定了三个数据库,就是前面我们在mysql中提前创建的。
在dataHost中,我们只需要指定一个writeHost即可,这里既可以写入数据,也可以读取数据,就是官网配置中的主从复制中的主节点,这里因为是单机版的mysql,这里就填写一个主机信息即可。其中,标注为的是注解,我们不用关注。另外,在Mycat中,对应的数据库是TESTDB,在这里的schema标签体中,一开始就声明了。
Mycat提供了访问他的数据库用户名和密码,默认有一个root/123456的用户名和密码。在server.xml配置文件中,我们可以看到相关配置信息:
至此,分库分表的准备工作已经就绪,就等着启动Mycat,然后进入Mycat中进行操作。
启动Mycat,命令 bin/mycat start
进入Mycat,前面提到过,使用Mycat就和使用mysql一样,我们也是通过mysql命令进入命令行,只不过这时候,连接信息是使用的Mycat,不是物理数据库mysql的。
查看数据库,发现只有TESTDB,这时候连接TESTDB,然后新建表users
mysql> create table users (id int primary key,name varchar(20),age int);
这时候,我们再回过头来看mysql数据库db1,db2,db3中自动创建了数据表users:
继续在Mycat中操作,我们插入三条记录,分别是id为1,5000001,10000001的记录,看看他们最终存入mysql的库是否是db1,db2,db3各一条记录。
mysql>insert into users (id,name,age) values (1,'aa',18),(5000001,'bb',20),(10000001,'cc',33);
在Mycat这里查看三条记录都在users表中,这是正常的,我们最后在物理存储库mysql中看看三条记录的分布:
可以看到,按照5,000,000记录的界限为分割依据,三条记录分别进入了三个数据库中。验证了Mycat分库的功能。
分库只是Mycat的一种功能,Mycat还提供了很多其他的功能,比如分布式事务(XA)。