1. 程式人生 > >【Mycat】Mycat核心開發者帶你輕鬆掌握Mycat路由轉發!!

【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安裝到不同的主機上,測試效果是一樣的。 ### 建立物理庫 ```sql 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 ``` ### server.xml配置 ```xml ``` ### rule.xml配置 ```xml ``` ## 登入Mycat ### 登入Mycat 命令列輸入以下命令登入Mycat ```sql 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> ``` ## 建立表測試 輸入以下命令檢視建立表的路由 ```sql create table travelrecord (id bigint not null primary key,user_id varchar(100),traveldate DATE, fee decimal,days int); ``` 結果如下: ```sql 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。 我們輸入建表語句: ```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語句 ```sql explain insert into travelrecord (id,user_id,traveldate,fee,days) values(100001,'binghe','2020-11-10',510.5,3); ``` 結果如下: ```sql 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節點。 我們執行插入語句: ```sql 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節點** 我們在命令列輸入如下語句: ```sql explain insert into travelrecord (id,user_id,traveldate,fee,days) values(8000004,'binghe','2020-11-10',510.5,3); ``` 結果如下: ```sql 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節點,我們執行插入語句: ```sql 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節點** 我們在命令列輸入如下語句 ```sql explain insert into travelrecord (id,user_id,traveldate,fee,days) values(10000004,'binghe','2020-11-10',510.5,3); ``` 結果為: ```sql 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節點,我們同樣執行插入語句的操作 ```sql 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) ``` ## 查詢測試 ### 查詢所有資料 在命令列執行如下語句: ```sql explain select * from travelrecord; ``` 結果為: ```sql 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: ```sql explain select * from travelrecord where id = 1000004; explain select * from travelrecord where id = 8000004; explain select * from travelrecord where id = 10000004; ``` 得到的結果依次如下: ```sql 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: ```sql explain drop table travelrecord; ``` 結果如下 ```sql 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,後續我都會持續更新和維護,感謝大家長期以來對冰河的支