20

news/2025/2/21 19:00:38/

博客园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

http://www.ppmy.cn/news/445387.html

相关文章

win10 bootloader 找不到设备

在win10 系统下&#xff0c;adb reboot fastboot 进入fastboot模式下&#xff0c;fastboot devices就可以识别到devices信息&#xff0c;但是通过命令adb reboot bootloader进入bootloader模式下&#xff0c;就无法识别。具体处理步骤如下&#xff1a;打开电脑端的设备管理器&a…

win10 使用网线 共享网络 给另一台设备

1&#xff0c;打开控制面板网络连接 2&#xff0c;右键WLAN>属性>共享&#xff0c; 按照下图勾选 3&#xff0c;点击设置后勾选 1703 常见问题&#xff1a;如果没有生效&#xff0c;将网线拔了重新插一下应该就可以了

Vue中的数据可视化词云展示与词云生成

Vue中的数据可视化词云展示与词云生成 数据可视化是现代Web应用程序中的一个重要组成部分&#xff0c;它使得数据更加易于理解和分析。词云是一种非常流行的数据可视化形式&#xff0c;它可以用来展示文本数据中的主题和关键字。在本文中&#xff0c;我们将介绍如何在Vue中使用…

银河麒麟V10服务器操作系统同一块网卡添加多个ip地址

操作系统&#xff1a;Linux version 3.10.0-862.9.1.ns7_4.37.mips64el&#xff0c;麒麟V10服务器操作系统 因为需要&#xff0c;现在要向enp5s0f3所在网卡添加多个ip地址。 vim /etc/sysconfig/network-scripts/ifcfg-enp5s0f3最后执行/etc/init.d/network restart即可。 ~…

idc服务器硬件,IDC基础:服务器机柜的设备介绍

机柜是综合布线里面的重要组成部分&#xff0c;它可用于放置和保护设备配件&#xff0c;那么一般在机柜中我们会放置哪些设备呢?今天正龙数据就为您介绍一下。 一、光纤配线架 光纤配线架是一个19英寸宽的带一些方孔的金属盒子&#xff0c;用于放置和保护已经剥去外壳、裸露在…

服务器柜安装位置,服务器机柜安装注意事项

《服务器机柜安装注意事项》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《服务器机柜安装注意事项(3页珍藏版)》请在人人文库网上搜索。 1、服务器机柜大家应该都知道是什么产品&#xff0c;那么在按装时需要注意的事项有哪些呢&#xff1f;以及机柜内设备在安装的时…

Win10 家庭版安装 Docker 桌面版

文章目录 1.主板BIOS中开启虚拟化2.开启Hyper-V&#xff08;1&#xff09;使用下列代码生成一个.cmd文件&#xff0c;并以管理员身份运行该文件。&#xff08;2&#xff09;看到运行成功即可关闭该文件。&#xff08;3&#xff09;勾选Hyper-V设置里的所有选项&#xff08;4&am…

数据中心机房供电需求有哪些?供配电系统如何布置??

前言&#xff1a; 数据中心机房供配电系统是一个交叉的系统&#xff0c;涉及到市电供电、防雷接地、防静电、UPS不间断供电、柴油发电机等&#xff0c;每个系统互相交叉&#xff0c;互有影响&#xff0c;这就使我们在布置时必须考虑多方面的因素&#xff0c;机房的供配电系统就…