20

博客园Logo
首页
新闻
博问
专区
闪存
班级
代码改变世界
搜索
注册
登录
博客园首页新随笔联系订阅管理
随笔 - 186 文章 - 0 评论 - 97
【Mycat】Mycat核心开发者带你轻松掌握Mycat路由转发!!
写在前面
熟悉Mycat的小伙伴都知道,Mycat一个很重要的功能就是路由转发,那么,这篇文章就带着大家一起来看看Mycat是如何进行路由转发的,好了,不多说了,我们直接进入主题。

环境准备
软件版本
操作系统:CentOS-6.8

JDK版本:jdk1.8

Mycat版本:Mycat-server-1.6

MySQL:5.7

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

创建物理库
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;
配置Mycat
schema.xml配置

<?xml version="1.0"?>

<mycat:schema xmlns:mycat=“http://org.opencloudb/” >

<schema name="binghe" checkSQLschema="false" sqlMaxLimit="100">
	<table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long"></table>
</schema>
<!-- <dataNode name="dn1$0-743" dataHost="localhost1" database="db$0-743" 
	/> -->
<dataNode name="dn1" dataHost="localhost1" database="db1" />
<dataNode name="dn2" dataHost="localhost1" database="db2" />
<dataNode name="dn3" dataHost="localhost1" database="db3" />
<!--<dataNode name="dn4" dataHost="sequoiadb1" database="SAMPLE" />
 <dataNode name="jdbc_dn1" dataHost="jdbchost" database="db1" /> 
<dataNode	name="jdbc_dn2" dataHost="jdbchost" database="db2" /> 
<dataNode name="jdbc_dn3" 	dataHost="jdbchost" 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="127.0.0.1:3306" user="root" password="root"></writeHost>
	
	<writeHost host="hostM2" url="127.0.0.1:3306" user="root" password="root"></writeHost>
	<!--<writeHost host="hostS1" url="localhost:3316" user="root"-->
		<!--password="123456" />-->
	<!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> -->
</dataHost>

</mycat:schema>
server.xml配置

<?xml version="1.0" encoding="UTF-8"?>

<mycat:server xmlns:mycat=“http://org.opencloudb/”>

druidparser


binghe.123
binghe


test
binghe
true

</mycat:server>
rule.xml配置

<?xml version="1.0" encoding="UTF-8"?>

<mycat:rule xmlns:mycat=“http://org.opencloudb/”>


id
func1

<tableRule name="rule2">
	<rule>
		<columns>user_id</columns>
		<algorithm>func1</algorithm>
	</rule>
</tableRule>

<tableRule name="sharding-by-intfile">
	<rule>
		<columns>sharding_id</columns>
		<algorithm>hash-int</algorithm>
	</rule>
</tableRule>
<tableRule name="auto-sharding-long">
	<rule>
		<columns>id</columns>
		<algorithm>rang-long</algorithm>
	</rule>
</tableRule>
<tableRule name="mod-long">
	<rule>
		<columns>id</columns>
		<algorithm>mod-long</algorithm>
	</rule>
</tableRule>
<tableRule name="sharding-by-murmur">
	<rule>
		<columns>id</columns>
		<algorithm>murmur</algorithm>
	</rule>
</tableRule>
<tableRule name="sharding-by-month">
	<rule>
		<columns>create_date</columns>
		<algorithm>partbymonth</algorithm>
	</rule>
</tableRule>
<tableRule name="latest-month-calldate">
	<rule>
		<columns>calldate</columns>
		<algorithm>latestMonth</algorithm>
	</rule>
</tableRule>

<tableRule name="auto-sharding-rang-mod">
	<rule>
		<columns>id</columns>
		<algorithm>rang-mod</algorithm>
	</rule>
</tableRule>

<tableRule name="jch">
	<rule>
		<columns>id</columns>
		<algorithm>jump-consistent-hash</algorithm>
	</rule>
</tableRule>

<function name="murmur"
	class="org.opencloudb.route.function.PartitionByMurmurHash">
	<property name="seed">0</property>
	<property name="count">2</property>
	<property name="virtualBucketTimes">160</property>
</function>
<function name="hash-int"
	class="org.opencloudb.route.function.PartitionByFileMap">
	<property name="mapFile">partition-hash-int.txt</property>
</function>
<function name="rang-long"
	class="org.opencloudb.route.function.AutoPartitionByLong">
	<property name="mapFile">autopartition-long.txt</property>
</function>
<function name="mod-long" class="org.opencloudb.route.function.PartitionByMod">
	<!-- how many data nodes -->
	<property name="count">3</property>
</function>

<function name="func1" class="org.opencloudb.route.function.PartitionByLong">
	<property name="partitionCount">8</property>
	<property name="partitionLength">128</property>
</function>
<function name="latestMonth"
	class="org.opencloudb.route.function.LatestMonthPartion">
	<property name="splitOneDay">24</property>
</function>
<function name="partbymonth"
	class="org.opencloudb.route.function.PartitionByMonth">
	<property name="dateFormat">yyyy-MM-dd</property>
	<property name="sBeginDate">2020-01-01</property>
</function>

<function name="rang-mod" class="org.opencloudb.route.function.PartitionByRangeMod">
    	<property name="mapFile">partition-range-mod.txt</property>
</function>

<function name="jump-consistent-hash" class="org.opencloudb.route.function.PartitionByJumpConsistentHash">
	<property name="totalBuckets">3</property>
</function>

</mycat:rule>
登录Mycat
登录Mycat
命令行输入以下命令登录Mycat

D:>mysql -ubinghe -pbinghe.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.6.1-RELEASE-20170807215126 MyCat Server (OpenCloundDB)

Copyright © 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>
创建表测试
输入以下命令查看创建表的路由

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表。

录入数据测试
录入到dn1节点

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

explain insert into travelrecord (id,user_id,traveldate,fee,days) values(100001,‘binghe’,‘2020-11-10’,510.5,3);
结果如下:

mysql> explain insert into travelrecord (id,user_id,traveldate,fee,days) values(100001,‘binghe’,‘2020-11-10’,510.5,3);
±----------±------------------------------------------------------------------------------------------------------------+
| DATA_NODE | SQL |
±----------±------------------------------------------------------------------------------------------------------------+
| dn1 | insert into travelrecord (id,user_id,traveldate,fee,days) values(100001,‘binghe’,‘2020-11-10’,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,‘binghe’,‘2020-11-10’,510.5,3);
Query OK, 1 row affected, 1 warning (0.01 sec)

mysql>
录入到dn2节点

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

explain insert into travelrecord (id,user_id,traveldate,fee,days) values(8000004,‘binghe’,‘2020-11-10’,510.5,3);
结果如下:

mysql> explain insert into travelrecord (id,user_id,traveldate,fee,days) values(8000004,‘binghe’,‘2020-11-10’,510.5,3);
±----------±-------------------------------------------------------------------------------------------------------------+
| DATA_NODE | SQL |
±----------±-------------------------------------------------------------------------------------------------------------+
| dn2 | insert into travelrecord (id,user_id,traveldate,fee,days) values(8000004,‘binghe’,‘2020-11-10’,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,‘binghe’,‘2020-11-10’,510.5,3);
Query OK, 1 row affected, 1 warning (0.06 sec)
路由到dn3节点

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

explain insert into travelrecord (id,user_id,traveldate,fee,days) values(10000004,‘binghe’,‘2020-11-10’,510.5,3);
结果为:

mysql> explain insert into travelrecord (id,user_id,traveldate,fee,days) values(10000004,‘binghe’,‘2020-11-10’,510.5,3);
±----------±--------------------------------------------------------------------------------------------------------------+
| DATA_NODE | SQL |
±----------±--------------------------------------------------------------------------------------------------------------+
| dn3 | insert into travelrecord (id,user_id,traveldate,fee,days) values(10000004,‘binghe’,‘2020-11-10’,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,‘binghe’,‘2020-11-10’,510.5,3);
Query OK, 1 row affected, 1 warning (0.01 sec)
查询测试
查询所有数据
在命令行执行如下语句:

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节点上。

根据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路由到指定的数据分片。

删表测试
在命令行输入如下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的路由结果可能会有不同。

好了,我们今天就到这儿吧,我是冰河,我们下期见~~

重磅福利
微信搜一搜【冰河技术】微信公众号,关注这个有深度的程序员,每天阅读超硬核技术干货,公众号内回复【PDF】有我准备的一线大厂面试资料和我原创的超硬核PDF技术文档,以及我为大家精心准备的多套简历模板(不断更新中),希望大家都能找到心仪的工作,学习是一条时而郁郁寡欢,时而开怀大笑的路,加油。如果你通过努力成功进入到了心仪的公司,一定不要懈怠放松,职场成长和新技术学习一样,不进则退。如果有幸我们江湖再见!

另外,我开源的各个PDF,后续我都会持续更新和维护,感谢大家长期以来对冰河的支持!!

分类: 中间件专题
好文要顶 关注我 收藏该文
冰河团队
关注 - 0
粉丝 - 100
+加关注
0
« 上一篇: 【Mycat】Mycat核心开发者带你看尽Mycat三大核心配置文件
» 下一篇: MySQL主从复制的原理和注意事项都在这儿了!!
posted @ 2020-11-14 19:35 冰河团队 阅读(107) 评论(0) 编辑 收藏
刷新评论刷新页面返回顶部
登录后才能发表评论,立即 登录 或 注册, 访问 网站首页
博客园派送云上免费午餐,AWS注册立享12个月免费套餐
【推荐】News: 大型组态、工控、仿真、CADGIS 50万行VC++源码免费下载
【推荐】博客园 & 陌上花开HIMMR 给单身的程序员小哥哥助力脱单啦~
【推荐】了不起的开发者,挡不住的华为,园子里的品牌专区
【推荐】未知数的距离,毫秒间的传递,声网与你实时互动
【福利】AWS携手博客园为开发者送免费套餐与抵扣券
【推荐】 阿里云折扣价格返场,错过再等一年

相关博文:
· MyCat
· MyCat(1.4)Mycat日志
· MyCat(1.2)Mycat的安装
· MyCat(1.3)Mycat配置文件
· MyCat(1.1)Mycat基本概念
» 更多推荐…
AWS免费套餐
最新 IT 新闻:
· 手残党福音:不会摘隐形眼镜?这个机器人可以帮你
· 我是如何被职场PUA毁掉的?
· 唯品会的去库存生意,还能玩多久?
· 美团“特价版”横空出世,王兴打响守城之战
· 马斯克终结美国载人航天的“寄俄篱下”
» 更多新闻…
公告
昵称: 冰河团队
园龄: 1年4个月
粉丝: 100
关注: 0
+加关注
< 2020年11月 >
日 一 二 三 四 五 六
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 1 2 3 4 5
6 7 8 9 10 11 12
搜索

常用链接
我的随笔
我的评论
我的参与
最新评论
我的标签
我的标签
Java(3)
高并发(3)
高并发,Java(3)
线程(3)
设计模式(1)
随笔分类
Canal(2)
Docker(10)
FastDFS(5)
Java(4)
Java8(16)
Jenkins(1)
JVM(2)
K8S(12)
MySQL(6)
Nginx(21)
Oracle(5)
Redis(2)
ShardingSphere(1)
Spring(35)
程序人生(1)
分布式事务(3)
高并发(41)
互联网工程专题(7)
面经(10)
设计模式(3)
微服务专题(3)
我的新书(2)
系统架构(2)
性能优化(5)
中间件专题(5)
随笔档案
2020年11月(11)
2020年10月(20)
2020年9月(24)
2020年8月(22)
2020年7月(28)
2020年6月(31)
2020年5月(29)
2020年4月(15)
2020年2月(6)
最新评论

  1. Re:【K8S】基于Docker+K8S+GitLab/SVN+Jenkins+Harbor搭建持续集成交付环境(环境搭建篇)
    冰河哥,我觉得我来晚了,是否可以加您微信呢

–monkey’s
2. Re:【性能优化】纳尼?内存又溢出了?!是时候总结一波了!!
好厉害!!!

–民工也Coding
3. Re:【面经】面试官:做过性能优化的工作吗?你会从哪些方面入手做性能优化呢?
@yangboom 你说的对,造火箭的…
–冰河团队
4. Re:【面经】面试官:做过性能优化的工作吗?你会从哪些方面入手做性能优化呢?
平时是造轮船的嘛

–yangboom
5. Re:系统从初期到支撑亿级流量,都经历了哪些架构的变迁?
@小彬 这是简化了的画法,实际上要考虑很多的技术方案,建议阅读:…
–冰河团队
阅读排行榜

  1. 【高并发】高并发秒杀系统架构解密,不是所有的秒杀都是秒杀!(6949)
  2. 【高并发】高并发分布式锁架构解密,不是所有的锁都是分布式锁!!(4304)
  3. 【高并发】为何高并发系统中都要使用消息队列?这次彻底懂了!(4042)
  4. 【K8S】K8S部署Metrics-Server服务(3025)
  5. 【Oracle】CentOS7/CentOS8命令行安装Oracle 11G R2(2751)
    评论排行榜
  6. 【高并发】高并发秒杀系统架构解密,不是所有的秒杀都是秒杀!(21)
  7. 【高并发】高并发分布式锁架构解密,不是所有的锁都是分布式锁!!(11)
  8. 【Java】面试官灵魂拷问:if语句执行完else语句真的不会再执行吗?(7)
  9. 系统从初期到支撑亿级流量,都经历了哪些架构的变迁?(5)
  10. 【高并发】面试官问我如何使用Nginx实现限流,我如此回答轻松拿到了Offer!(4)
    推荐排行榜
  11. 【高并发】高并发秒杀系统架构解密,不是所有的秒杀都是秒杀!(54)
  12. 【高并发】高并发分布式锁架构解密,不是所有的锁都是分布式锁!!(16)
  13. 小伙伴问我:如何搭建Maven私服?我连夜肝了这篇实战文章!!(6)
  14. 【Nginx】如何使用Nginx搭建流媒体服务器实现直播?看完这篇我会了!!(6)
  15. 【高并发】为何高并发系统中都要使用消息队列?这次彻底懂了!(6)
    Copyright © 2020 冰河团队
    Powered by .NET 5.0.0 on Kubernetes
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值