https://www.365yg.com/a6564230987025220110#mid=6796898310
mycat介紹
- 介紹在官方網站上有比較詳細的介紹,在這里復制粘貼沒什么意思,大家到官網上看
- 官網鏈接
前置條件
本教程是在window環境下運行的,實際生產推薦在Linux上運行。
必備條件(自行安裝,如果不會裝請先打好基礎在來學習):
- JDK:建議是1.7及其以上。
- MySQL:必須是5.5及其以上。
拓撲結構
- 兩張表users和item,三個數據庫db01,db02,db03(三個庫在一個數據庫實例上)
- users只在db01中存儲。
- item表被分割到db02和db03中存儲。
create database db01; CREATE TABLE users ( id INT NOT NULL AUTO_INCREMENT, name varchar(50) NOT NULL default '', indate DATETIME NOT NULL default '0000-00-00 00:00:00', PRIMARY KEY (id) )AUTO_INCREMENT= 1 ENGINE=InnoDB DEFAULT CHARSET=utf8;
在db02和db03中分別創建item表,SQL腳本如下
create database db02; CREATE TABLE item ( id INT NOT NULL AUTO_INCREMENT, value INT NOT NULL default 0, indate DATETIME NOT NULL default '0000-00-00 00:00:00', PRIMARY KEY (id) )AUTO_INCREMENT= 1 ENGINE=InnoDB DEFAULT CHARSET=utf8; create database db03; CREATE TABLE item ( id INT NOT NULL AUTO_INCREMENT, value INT NOT NULL default 0, indate DATETIME NOT NULL default '0000-00-00 00:00:00', PRIMARY KEY (id) )AUTO_INCREMENT= 1 ENGINE=InnoDB DEFAULT CHARSET=utf8;
開始使用
- 先打mycat官方網站上下載安裝包,網址為mycat 下載圖如下所示:
- 然后在conf目錄下編輯service.xml,rule.xml,schema.xml三個文件。
- service.xml主要配置mycat服務的參數,比如端口號,myact用戶名和密碼使用的邏輯數據庫等
- role.xml主要配置路由策略,主要有分片的片鍵,拆分的策略(取模還是按區間划分等)
- schema.xml文件主要配置數據庫的信息,例如邏輯數據庫名稱,物理上真實的數據源以及表和數據源之間的對應關系和路由策略等。
-
配置如下所示:
-
server.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mycat:server SYSTEM "server.dtd"> <mycat:server xmlns:mycat="http://io.mycat/"> <system> <!-- <property name="processors">32</property> <property name="processorExecutor">32</property> <property name="bindIp">0.0.0.0</property> <property name="frontWriteQueueSize">4096</property> <property name="idleTimeout">300000</property> <property name="mutiNodePatchSize">100</property> --> <property name="defaultSqlParser">druidparser</property> <property name="mutiNodeLimitType">1</property> <property name="serverPort">8066</property> <property name="managerPort">9066</property> </system> <!-- 任意設置登陸 mycat 的用戶名,密碼,數據庫 --> <user name="test"> <property name="password">test</property> <property name="schemas">TESTDB</property> </user> <user name="user"> <property name="password">user</property> <property name="schemas">TESTDB</property> <property name="readOnly">true</property> </user> <!-- <quarantine> <whitehost> <host host="127.0.0.1" user="mycat"/> <host host="127.0.0.2" user="mycat"/> </whitehost> <blacklist check="false"></blacklist> </quarantine> --> </mycat:server>
- role.xml
該路由表表明采用mod2的方式進行路由。通過下面可知是對item表的id鍵進行取模分表的,取模分到db02和db03,而users表直接路由到db01中。
<?xml version="1.0" encoding="UTF-8"?> <!-- - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. --> <!DOCTYPE mycat:rule SYSTEM "rule.dtd"> <mycat:rule xmlns:mycat="http://io.mycat/"> <tableRule name="role1"> <rule> <columns>id</columns> <algorithm>mod-long</algorithm> </rule> </tableRule> <function name="mod-long" class="io.mycat.route.function.PartitionByMod"> <!-- how many data nodes --> <property name="count">2</property> </function> </mycat:rule>
- schema.xml 數據庫的url,usename,password按實際情況填寫。
<?xml version="1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://io.mycat/"> <!-- 設置表的存儲方式.schema name="TESTDB" 與 server.xml中的 TESTDB 設置一致 --> <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100"> <table name="users" primaryKey="id" dataNode="node_db01" /> <table name="item" primaryKey="id" dataNode="node_db02,node_db03" rule="role1" /> </schema> <!-- 設置dataNode 對應的數據庫,及 mycat 連接的地址dataHost --> <dataNode name="node_db01" dataHost="dataHost01" database="db01" /> <dataNode name="node_db02" dataHost="dataHost01" database="db02" /> <dataNode name="node_db03" dataHost="dataHost01" database="db03" /> <!-- mycat 邏輯主機dataHost對應的物理主機.其中也設置對應的mysql登陸信息 --> <dataHost name="dataHost01" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native"> <heartbeat>select user()</heartbeat> <writeHost host="server1" url="127.0.0.1:3306" user="root" password="123456"/> </dataHost> </mycat:schema>
啟動測試
- 在命令行切換到bin目錄下,然后執行如下命令:
正確啟動后會顯示如下命令:
然后表示我們啟動服務成功。
驗證結果
- 在命令行訪問mycat邏輯數據庫,采用如下的命令:
mysql -utest -ptest -h127.0.0.1 -P8066 -DTESTDB
-
現在通過數據庫查詢數據庫和表,發現只有邏輯數據庫TESTDB而不是db01, db02, db03;而且表也是統一顯示的,而不是分布在不同的實際數據庫中。參考圖片如下:
- 現在在訪問Mycat在數據庫中插入數據,看數據能否按照前面配置的路由規則進行分表。
- 現在執行如下的SQL語句進行數據的插入。
insert into users(name,indate) values('kk',now()); insert into users(name,indate) values('ss',now()); insert into item(id,value,indate) values(1,100,now()); insert into item(id,value,indate) values(2,100,now());
- 然后在mycat上查看是否插入成功,下圖顯示插入成功。
- 然后登錄實際的數據庫,看分表是否成功。下圖顯示分表成功。
圖上顯示,插入的users表中的數據全部在db01中,而item表中的數據通過Id取模后均勻的分布在db02和db03中。這樣就根據實際的路由策略進行了分表。 - 測試完成!!~數據進行了分庫分表!