安装
mycat提供了多种系统的安装包载地址:http://dl.mycat.io/ ,本文使用1.6.7.3版本。
mycat是用JDK开发的,所以需要安装JDK1.7版本以上。
windows下安装
运行 startup_nowrap.bat,启动成功后,在窗口输出sucessful。如果发生错误,可以查看日志,日志存放在 logs/mycat.log 中,每天一个文件,日志的配置是在 conf/log4j.xml 中。
linux下安装
验证
服务启动成功后,我们可以在命令窗口像连接mysql一样连接mycat。注意,这里需要借助mysql的客户端连接到mycat。
mycat默认下,在server.xml中配置了一个用户,并指定了该用户可以访问的逻辑数据库。
<user name="root" defaultAccount="true">
<property name="password">123456</property>
<property name="schemas">TESTDB</property>
</user>
我们通过该用户连接mycat,这里的端口使用8066,这里连接的是mycat不是mysql。然后,查看该数据库以及该数据库下的表。
mysql -uroot -p123456 -h127.0.0.1 -P8066;
mysql> show databases;
+----------+
| DATABASE |
+----------+
| TESTDB |
+----------+
mysql> use TESTDB;
Database changed
mysql> show tables;
+------------------+
| Tables in TESTDB |
+------------------+
| company |
| customer |
| customer_addr |
| employee |
| goods |
| hotnews |
| orders |
| order_items |
| travelrecord |
+------------------+
可以看到,逻辑库TESTDB里内置了许多表,这些表的配置在shema.xml中。
<schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100">
<!-- auto sharding by id (long) -->
<table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
<!-- 忽略 -->
</schema>
这时,如果我们select其中一张表,会发生错误,因为现在我们不存在对应的物理库和物理表。其实,现在mycat,一直在后台报错,与物理库连接失败。
mysql> select * from travelrecord;
ERROR 2013 (HY000): Lost connection to MySQL server during query
为了能顺利测试,我们需要停止mycat服务器。
修改下mycat的schema.xml文件,只保留一张表的声明。
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100">
<table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-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>
<!-- can have multi write hosts -->
<writeHost host="hostM1" url="localhost:3306" user="root"
password="123456">
</writeHost>
</dataHost>
</mycat:schema>
接下来,需要在分别在本地mysql服务器,创建db1、db2、db3三个库(MYCAT的术语是数据节点),并创建表travelrecord,表需要在mycat的控制台创建(mycat会根据声明,分别在三个库上创建该表),或者在db1-3三个库分别创建。
CREATE DATABASE IF NOT EXISTS `db1` DEFAULT CHARACTER SET utf8;
CREATE DATABASE IF NOT EXISTS `db2` DEFAULT CHARACTER SET utf8;
CREATE DATABASE IF NOT EXISTS `db3` DEFAULT CHARACTER SET utf8;
CREATE TABLE travelrecord (
id BIGINT NOT NULL PRIMARY KEY,
user_name VARCHAR ( 100 ),
traveldate DATE,
fee DECIMAL,
days INTEGER
);
重启mycat,通过命令行连接mycat后,查看当前逻辑库的表
mysql> use TESTDB;
Database changed
mysql> show tables;
+------------------+
| Tables in TESTDB |
+------------------+
| travelrecord |
+------------------+
1 row in set (0.00 sec)
只剩下travelrecord表而已。查看里面的数据,这时应该是空,现在不会报错了。
mysql> select * from travelrecord;
Empty set (0.06 sec)
我们添加一些数据
insert into travelrecord(id,user_name,traveldate,fee,days) values(1,'Victor',20160101,100,10);
insert into travelrecord(id,user_name,traveldate,fee,days) values(5000001,'Job',20160102,100,10);
insert into travelrecord(id,user_name,traveldate,fee,days) values(10000001,'Slow',20160103,100,10);
在mycat命令行中,查看这张表的数据
mysql> select * from travelrecord;
+----------+-----------+------------+------+------+
| id | user_name | traveldate | fee | days |
+----------+-----------+------------+------+------+
| 1 | Victor | 2016-01-01 | 100 | 10 |
| 5000001 | Job | 2016-01-02 | 100 | 10 |
| 10000001 | Slow | 2016-01-03 | 100 | 10 |
+----------+-----------+------------+------+------+
分别查看三个库的数据
mysql> select * from db1.travelrecord;
+----+---------+------------+------+------+
| id | user_name | traveldate | fee | days |
+----+---------+------------+------+------+
| 1 | Victor | 2016-01-01 | 100 | 10 |
+----+---------+------------+------+------+
row in set (0.00 sec)
mysql> select * from db2.travelrecord;
+---------+---------+------------+------+------+
| id | user_name | traveldate | fee | days |
+---------+---------+------------+------+------+
| 5000001 | Job | 2016-01-02 | 100 | 10 |
+---------+---------+------------+------+------+
row in set (0.00 sec)
mysql> select * from db3.travelrecord;
+----------+---------+------------+------+------+
| id | user_name | traveldate | fee | days |
+----------+---------+------------+------+------+
| 10000001 | Slow | 2016-01-03 | 100 | 10 |
+----------+---------+------------+------+------+
row in set (0.00 sec)
为什么数据会被分片保存到不同的数据库上呢?
在shema.xml中,定义了travelrecord表的规则,其中,rule 定义了分片的规则,使用 auto-sharding-long 分片规则。这个规则的定义在 rule.xml 中定义。
<function name="rang-long"
class="io.mycat.route.function.AutoPartitionByLong">
<property name="mapFile">autopartition-long.txt</property>
</function>
<tableRule name="auto-sharding-long">
<rule>
<columns>id</columns>
<algorithm>rang-long</algorithm>
</rule>
</tableRule>
该规则是按照范围进行分片,分片的字段是ID,实现类是 io.mycat.route.function.AutoPartitionByLong ,配置文件是 autopartition-long.txt。
明白了这些后,一起看下autopartition-long.txt
# range start-end ,data node index
# K=1000,M=10000.
0-500M=0
500M-1000M=1
1000M-1500M=2
ID在 0 - 5000000 被分片到数据节点db1。。。
总结
本文简单安装了mycat服务器,并通过一个例子初步测试了mycat的特性。