Mycat之——路由转发实例解析

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/76862419

今天,给大家带来一篇通过一个配置实例来讲解Mycat路由转发的文章,熟悉Mycat的同学都知道,Mycat一个很重要的功能就是路由转发,那么,这篇文章就带着大家一起来看看Mycat是如何进行路由转发的,好了,不多说了,我们直接进入主题。

一、环境准备

1、软件版本

操作系统:CentOS-6.5-x86_64-bin-DVD1.iso
JDK版本:jdk1.7.0_80
Mycat版本:Mycat-server-1.5.1-RELEASE-20170717215510-Linux.tar.gz (下载源码自行编译的)
MySQL:5.6.32

注意:这里,我将Mycat和MySQL安装在同一台虚拟机(IP:192.168.209.140  主机名为:liuyazhuang140),大家也可以将Mycat和MySQL安装到不同的主机上,测试效果是一样的。

2、创建物理库

mysql -uroot -proot -h192.168.209.140 -P3306

drop database if exists db1;
create database db1;
drop database if exists db2;
create database db2;
drop database if exists db3;
create database db3;

二、配置

1、schema.xml配置





	
		
select user()

2、server.xml配置





	
	druidparser
       
	
	
		
		
		
		
		
		
		
	
	
		lyz.123
		lyz
	

	
		test
		lyz
		true
	
	

3、rule.xml配置





	
		
			id
			func1
		
	

	
		
			user_id
			func1
		
	

	
		
			sharding_id
			hash-int
		
	
	
		
			id
			rang-long
		
	
	
		
			id
			mod-long
		
	
	
		
			id
			murmur
		
	
	
		
			create_date
			partbymonth
		
	
	
		
			calldate
			latestMonth
		
	
	
	
		
			id
			rang-mod
		
	
	
	
		
			id
			jump-consistent-hash
		
	

	
		0
		2
		160
		
		
	
	
		partition-hash-int.txt
	
	
		autopartition-long.txt
	
	
		
		3
	

	
		8
		128
	
	
		24
	
	
		yyyy-MM-dd
		2015-01-01
	
	
	
        	partition-range-mod.txt
	
	
	
		3
	

三、测试

1、登录Mycat

命令行输入以下命令登录Mycat

mysql -ulyz -plyz.123 -h192.168.209.140 -P8066
D:\>mysql -ulyz -plyz.123 -h192.168.209.140 -P8066
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.5.8-mycat-1.5.1-RELEASE-20170807215126 MyCat Server (OpenCloundDB)

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

2、创建表测试

输入以下命令查看创建表的路由

create table travelrecord (id bigint not null primary key,user_id varchar(100),traveldate DATE, fee decimal,days int); 
结果如下:
mysql> explain create table travelrecord (id bigint not null primary key,user_id varchar(100),traveldate DATE, fee decimal,days int);
+-----------+-----------------------------------------------------------------------------------------------------------------------+
| DATA_NODE | SQL                                                                                                                   |
+-----------+-----------------------------------------------------------------------------------------------------------------------+
| dn1       | create table travelrecord (id bigint not null primary key,user_id varchar(100),traveldate DATE, fee decimal,days int) |
| dn2       | create table travelrecord (id bigint not null primary key,user_id varchar(100),traveldate DATE, fee decimal,days int) |
| dn3       | create table travelrecord (id bigint not null primary key,user_id varchar(100),traveldate DATE, fee decimal,days int) |
+-----------+-----------------------------------------------------------------------------------------------------------------------+
3 rows in set (0.00 sec)

mysql>
说明创建表的SQL语句被Mycat路由到dn1,dn2,dn3三个节点上,也就是说在3个节点上都执行了创建表的SQL。

我们输入建表语句:

mysql> create table travelrecord (id bigint not null primary key,user_id varchar(100),traveldate DATE, fee decimal,days int);
Query OK, 0 rows affected (0.18 sec)
此时,将会在dn1,dn2,dn3三个节点上创建travelrecord表。

3、录入数据测试

3.1录入到dn1节点

我们在命令行输入如下SQL语句:

explain insert into travelrecord (id,user_id,traveldate,fee,days) values(100001,'liuyazhuang','2017-08-07',510.5,3);
结果如下:

mysql> explain insert into travelrecord (id,user_id,traveldate,fee,days) values(100001,'liuyazhuang','2017-08-07',510.5,3);
+-----------+-------------------------------------------------------------------------------------------------------------+
| DATA_NODE | SQL                                                                                                         |
+-----------+-------------------------------------------------------------------------------------------------------------+
| dn1       | insert into travelrecord (id,user_id,traveldate,fee,days) values(100001,'liuyazhuang','2017-08-07',510.5,3) |
+-----------+-------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
说明Mycat将SQL路由到了dn1节点。

我们执行插入语句:

mysql> insert into travelrecord (id,user_id,traveldate,fee,days) values(100001,'liuyazhuang','2017-08-07',510.5,3);
Query OK, 1 row affected, 1 warning (0.01 sec)

mysql>

3.2录入到dn2节点

我们在命令行输入如下语句:

explain insert into travelrecord (id,user_id,traveldate,fee,days) values(8000004,'liuyazhuang','2017-08-07',510.5,3);
结果如下:

mysql> explain insert into travelrecord (id,user_id,traveldate,fee,days) values(8000004,'liuyazhuang','2017-08-07',510.5,3);
+-----------+--------------------------------------------------------------------------------------------------------------+
| DATA_NODE | SQL                                                                                                          |
+-----------+--------------------------------------------------------------------------------------------------------------+
| dn2       | insert into travelrecord (id,user_id,traveldate,fee,days) values(8000004,'liuyazhuang','2017-08-07',510.5,3) |
+-----------+--------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
说明Mycat将SQL路由到了dn2节点,我们执行插入语句:

mysql> insert into travelrecord (id,user_id,traveldate,fee,days) values(8000004,'liuyazhuang','2017-08-07',510.5,3);
Query OK, 1 row affected, 1 warning (0.06 sec)
3.3路由到dn3节点

我们在命令行输入如下语句

explain insert into travelrecord (id,user_id,traveldate,fee,days) values(10000004,'liuyazhuang','2017-08-07',510.5,3);
结果为:

mysql> explain insert into travelrecord (id,user_id,traveldate,fee,days) values(10000004,'liuyazhuang','2017-08-07',510.5,3);
+-----------+---------------------------------------------------------------------------------------------------------------+
| DATA_NODE | SQL                                                                                                           |
+-----------+---------------------------------------------------------------------------------------------------------------+
| dn3       | insert into travelrecord (id,user_id,traveldate,fee,days) values(10000004,'liuyazhuang','2017-08-07',510.5,3) |
+-----------+---------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
说明Mycat将SQL路由到了dn3节点,我们同样执行插入语句的操作

mysql>  insert into travelrecord (id,user_id,traveldate,fee,days) values(10000004,'liuyazhuang','2017-08-07',510.5,3);
Query OK, 1 row affected, 1 warning (0.01 sec)

4、查询测试

4.1查询所有数据

在命令行执行如下语句:

explain select * from travelrecord;
结果为:

mysql> explain select * from travelrecord;
+-----------+--------------------------------------+
| DATA_NODE | SQL                                  |
+-----------+--------------------------------------+
| dn1       | SELECT * FROM travelrecord LIMIT 100 |
| dn2       | SELECT * FROM travelrecord LIMIT 100 |
| dn3       | SELECT * FROM travelrecord LIMIT 100 |
+-----------+--------------------------------------+
3 rows in set (0.01 sec)
说明查询所有的数据,Mycat是将SQL语句路由到了所有的数据分片,即dn1,dn2,dn3节点上。

4.2根据id查询指定数据

我们分别在命令行中执行如下SQL:

explain select * from travelrecord where id = 1000004;
explain select * from travelrecord where id = 8000004;
explain select * from travelrecord where id = 10000004;
得到的结果依次如下:

mysql> explain select * from travelrecord where id = 1000004;
+-----------+---------------------------------------------------------+
| DATA_NODE | SQL                                                     |
+-----------+---------------------------------------------------------+
| dn1       | SELECT * FROM travelrecord WHERE id = 1000004 LIMIT 100 |
+-----------+---------------------------------------------------------+
1 row in set (0.06 sec)

mysql> explain select * from travelrecord where id = 8000004;
+-----------+---------------------------------------------------------+
| DATA_NODE | SQL                                                     |
+-----------+---------------------------------------------------------+
| dn2       | SELECT * FROM travelrecord WHERE id = 8000004 LIMIT 100 |
+-----------+---------------------------------------------------------+
1 row in set (0.00 sec)

mysql> explain select * from travelrecord where id = 10000004;
+-----------+----------------------------------------------------------+
| DATA_NODE | SQL                                                      |
+-----------+----------------------------------------------------------+
| dn3       | SELECT * FROM travelrecord WHERE id = 10000004 LIMIT 100 |
+-----------+----------------------------------------------------------+
1 row in set (0.00 sec)
说明:按照分片字段查询,Mycat只会将SQL路由到指定的数据分片。

5、删表测试

在命令行输入如下SQL:

explain drop table travelrecord;
结果如下:

mysql> explain drop table travelrecord;
+-----------+-------------------------+
| DATA_NODE | SQL                     |
+-----------+-------------------------+
| dn1       | drop table travelrecord |
| dn2       | drop table travelrecord |
| dn3       | drop table travelrecord |
+-----------+-------------------------+
3 rows in set (0.00 sec)
有结果可知,删表操作和创建表操作一样,Mycat在本实例中都会将SQL路由到所有的数据分片。

注意:本文的Mycat路由结果针对本文的配置实例,其他配置下,Mycat的路由结果可能会有不同。


你可能感兴趣的:(Mycat,Mycat)