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中。這樣就根據實際的路由策略進行了分表。
測試完成。。~資料進行了分庫分表。 參考文章
1. MySQL 高可用:mysql+mycat實現資料庫分區(分庫分表)