Mycat是什么:
Mycat是一个 数据库的中间件,支持 SQL92标准
支持MySQL、Oracle、DB2、SQLServer、PostgreSQL等DB的常见SQL语法
遵守 Mysql原生协议,跨语言,跨平台,跨数据库的通用中间件代理。
基于心跳的自动故障切换,支持读写分离,支持 MYSQL主从,以及集群操作。
首先在github上下载Mycat-Server的源代码:
https://github.com/MyCATApache/Mycat-Server
找到 项目当中的 MycatStartup.java 这个文件是一个入口文件,等下会用到。
-----------------------------------------------------------------------------------------------------------------------------
接下来演示mycat对mysql中的一张表进行垂直分表(单数据库大表拆分)的操作,即将一张表映射到mysql当中的三张表上
首先在某台服务器的mysql当中建立一张表如下图:
表名: company1
然后把company1这张表复制2份
表名: company2
表名: company3
在navicat当中是这样的:
然后回到 Mycat-Server这个项目中进行对应的配置:
看到 server.xml文件中的 <user 这个标签的配置
记下这里的 password和schemas,等下使用 navicat连接
然后过来配置 schema.xml文件:
替换成下面的配置:
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<!--
schema标签
name意思是 在mycat当中显示的模拟库的名称和 工程中server.xml文件中的 schemas 配置要一样
checkSQLschema select * from db1.table where 加了这个之后会默认识别 db1
table标签
name 对应 mycat中虚拟的表名称
subTables 对应的是实际 对应company表在 mysql中的实际分片,本例子中分了三片
dataNode 配置数据节点
rule 对应分片的规则,可以在 rule.xml文件当中查看
-->
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
<table name="company" subTables="company$1-3" dataNode="dn1" rule="mod-long" />
</schema>
<dataNode name="dn1" dataHost="localhost1" database="test" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- 数据的写操作,这里要配置数据库的真实连接地址 -->
<writeHost host="hostS1" url="192.168.159.136:3306" user="root"
password="root" />
</dataHost>
</mycat:schema>
然后把 MyCat-Server.java中的 MyCatStartUp.java这个文件运行一下
运行,在navicat控制端连接mycat
连接之后发现 TESTDB这个模拟库和 company 这个mycat中的模拟表
然后点击Mycat-Server中的查询-->新建查询,然后在控制台执行下面的语句:
INSERT INTO `company2` VALUES ('1', '华为');
INSERT INTO `company3` VALUES ('2', '中兴');
INSERT INTO `company1` VALUES ('3', 'OPPO');
INSERT INTO `company2` VALUES ('4', '百度');
INSERT INTO `company3` VALUES ('5', '小米');
INSERT INTO `company1` VALUES ('6', '阿里');
然后看实际数据库表中的数据,已经被mycat分流到不同的 company1、company2、company3表当中了如下图:
company1:
company2:
company3:
然后继续在控制台执行下面的语句:
explain select * from company;
可以看到下面的信息:
发现sql解释执行计划会遍历所有的表
-----------------------------------------------------------------------------------------------------------------------------
接下来演示下跨数据库分表的问题:
在schema.xml文件当中进行下面的配置:
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<!-- schema 当中的
name 属性配置了新的数据库名称
checkSQLschema select * from db1.table where 加了这个之后会默认识别 db1
-->
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
<table name="company" subTables="company$1-3" dataNode="dn1" rule="mod-long" />
<table name="record" dataNode="dn1,dn2,dn3" rule="mod-long" />
</schema>
<dataNode name="dn1" dataHost="localhost1" database="db1" />
<dataNode name="dn2" dataHost="localhost1" database="db2" />
<dataNode name="dn3" dataHost="localhost1" database="db3" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostS1" url="192.168.159.136:3306" user="root"
password="root" />
</dataHost>
</mycat:schema>
然后再192.168.159.136这台服务器上面建立三个 数据库 分别为 db1、db2、db3
配置完成后运行 MycatStartup.java 这个文件:
然后再在 Mycay-server.java 当中发起一个查询:
输入下面的建表语句
CREATE TABLE `record` (
`id` varchar(32) DEFAULT NULL,
`record_name` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
然后会发现在 管理配置的192.168.159.136这台服务器上出现了 schema.xml当中配置的record这张表,并且分配给了不同的三个数据库 db1、db2、db3
再次在Mycat-Server这个虚拟库下新建一个查询
insert into record(id,record_name)value(1,"hahaha");
insert into record(id,record_name)value(2,"hehehe");
insert into record(id,record_name)value(3,"gagaga");
然后可以再其他三个库当中看到record记录被分片路由,最后存储到三个不同的库,如下图所示:
db1中:
db2中:
db3中:
-----------------------------------------------------------------------------------------------------------------------------
接下来演示下mycat当中的读写分离:
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1" />
<dataNode name="dn1" dataHost="localhost1" database="DB" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>show slave status</heartbeat>
<writeHost host="hostM1" url="192.168.159.136:3306" user="root"
password="root" >
<readHost host="hostS1" url="192.168.159.135:3306" password="root" user="root" />
</writeHost>
<!--
<writeHost host="hostS1" url="192.168.159.135:3306" user="root"
password="root" />
-->
</dataHost>
</mycat:schema>
-----------------------------------------------------------------------------------------------------------------------------