熟悉Mycat的小夥伴都知道,Mycat一個很重要的功能就是路由轉發,那麼,這篇文章就帶着你們一塊兒來看看Mycat是如何進行路由轉發的,好了,很少說了,咱們直接進入主題。node
操做系統:CentOS-6.8mysql
JDK版本:jdk1.8程序員
Mycat版本:Mycat-server-1.6面試
MySQL:5.7sql
注意:這裏,我將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;
<?xml version="1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <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>
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mycat:server SYSTEM "server.dtd"> <mycat:server xmlns:mycat="http://org.opencloudb/"> <system> <property name="defaultSqlParser">druidparser</property> </system> <user name="binghe"> <property name="password">binghe.123</property> <property name="schemas">binghe</property> </user> <user name="test"> <property name="password">test</property> <property name="schemas">binghe</property> <property name="readOnly">true</property> </user> </mycat:server>
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mycat:rule SYSTEM "rule.dtd"> <mycat:rule xmlns:mycat="http://org.opencloudb/"> <tableRule name="rule1"> <rule> <columns>id</columns> <algorithm>func1</algorithm> </rule> </tableRule> <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學習
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 (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>
輸入如下命令查看建立表的路由測試
create table travelrecord (id bigint not null primary key,user_id varchar(100),traveldate DATE, fee decimal,days int);
結果以下:ui
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。url
咱們輸入建表語句:
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節點上。
咱們分別在命令行中執行以下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,後續我都會持續更新和維護,感謝你們長期以來對冰河的支持!!