mycat介紹
- 介紹在官方網站上有比較詳細的介紹,在這里復制粘貼沒什么意思,大家到官網上看
- 官網鏈接
前置條件
本教程是在window環境下運行的,實際生產推薦在Linux上運行。
必備條件(自行安裝,如果不會裝請先打好基礎在來學習):
- JDK:建議是1.7及其以上。
- MySQL:必須是5.5及其以上。
拓撲結構

網頁在線制作各式拓撲結構:ProcessOn
- 兩張表users和item,三個數據庫db01,db02,db03(三個庫在一個數據庫實例上)
- users只在db01中存儲。
- item表被分割到db02和db03中存儲。
create database db01 if not exists db01;
use 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 if not exists db02;
use 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 if not exists db03;
use 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 下載圖如下所示: http://dl.mycat.io/1.6-RELEASE/

- 然后在conf目錄下編輯service.xml,rule.xml,schema.xml三個文件。
- service.xml主要配置mycat服務的參數,比如端口號,myact用戶名和密碼使用的邏輯數據庫等
- role.xml主要配置路由策略,主要有分片的片鍵,拆分的策略(取模還是按區間划分等)
- schema.xml文件主要配置數據庫的信息,例如邏輯數據庫名稱,物理上真實的數據源以及表和數據源之間的對應關系和路由策略等。
-
配置如下所示:
Service.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中。這樣就根據實際的路由策略進行了分表。
