mycat - 简单安装与测试

安装

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的特性。

转载于:https://my.oschina.net/thinwonton/blog/3094165

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值