Mycat教程---數據庫的分庫分表


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中。這樣就根據實際的路由策略進行了分表。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM