天天看點

MyCat教程【安裝及配置介紹】

本文我們來介紹下MyCat的安裝和相關的配置檔案的介紹

一、安裝MyCat

1.安裝準備環境

1.1 安裝JDK

 因為mycat是java開發的,是以需要java虛拟機環境,在Linux節點中安裝JDK是必須的。

MyCat教程【安裝及配置介紹】

1.2 放開相關端口

 在主從節點上都放開對端口3306的通路,或者直接關閉防火牆。

# 臨時關閉
service iptables stop
service iptables start
# 永久關閉
chkconfig iptables on
chkconfig iptables off

# 檢視防火牆狀态
service iptables status      

1.3 root賬号

 mycat是我們的資料庫中間件,那麼mycat必然要能夠通路對應的主從資料庫,是以在主從資料庫中我們需要分别建立通路的賬号。

grant all privileges on *.* to 'root'@'%' identified by '123456' with grant option;
flush privileges;      

2.安裝mycat

2.1 下載下傳安裝軟體

官網位址:

http://www.mycat.io/
MyCat教程【安裝及配置介紹】

2.2 上傳解壓安裝

 将下載下傳的檔案上傳到/usr/local目錄下,并解壓

MyCat教程【安裝及配置介紹】

2.3 目錄介紹

 解壓後的目錄結構如下:

MyCat教程【安裝及配置介紹】
目錄 描述
bin 目錄裡是啟動腳本
conf 目錄裡是配置檔案
catlet 為 Mycat 的一個擴充功能
lib 目錄裡是 Mycat 和它的依賴 jar
logs 目錄裡是 console.log 用來儲存控制台日志,和 mycat.log 用來儲存 mycat 的 log4j日志

二、相關配置檔案介紹

 Mycat的架構其實很好了解,Mycat是代理,Mycat後面就是實體資料庫。和Web伺服器的 Nginx類似。對于使用者來說,通路的都是 Mycat,不會接觸到後端的資料庫。

MyCat教程【安裝及配置介紹】

注意:MyCat的主要配置檔案都在conf目錄下。我們給大家來介紹下介個核心的配置檔案

配置檔案 說明
server.xml MyCat 的配置檔案,設定賬号、參數等
schema.xml MyCat 對應的實體資料庫和資料庫表的配置
rule.xml MyCat 分片(分庫分表)規則

2.1 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="useSqlStat">0</property> 
        <property name="useGlobleTableCheck">0</property>  
        <property name="sequnceHandlerType">2</property>
        <property name="processorBufferPoolType">0</property>
        <property name="handleDistributedTransactions">0</property>
        <property name="useOffHeapForMerge">1</property>
        <property name="memoryPageSize">1m</property>
        <property name="spillsFileBufferSize">1k</property>
        <property name="useStreamOutput">0</property>
        <property name="systemReserveMemorySize">384m</property>
        <property name="useZKSwitch">true</property>
    </system>
    
    <!-- 全局SQL防火牆設定 -->
    <!-- 
    <firewall> 
       <whitehost>
          <host host="127.0.0.1" user="mycat"/>
          <host host="127.0.0.2" user="mycat"/>
       </whitehost>
       <blacklist check="false">
       </blacklist>
    </firewall>
    --> 
    <user name="root">
        <property name="password">123456</property>
        <property name="schemas">TESTDB</property>
        
        <!-- 表級 DML 權限設定 -->
        <!--        
        <privileges check="false">
            <schema name="TESTDB" dml="0110" >
                <table name="tb01" dml="0000"></table>
                <table name="tb02" dml="1111"></table>
            </schema>
        </privileges>       
         -->
    </user>

    <user name="user">
        <property name="password">user</property>
        <property name="schemas">TESTDB</property>
        <property name="readOnly">true</property>
    </user>
</mycat:server>      

system标簽中設定的是系統級别的相關參數,參考源檔案中的注釋即可能看懂,初始預設即可

user标簽是我們要注意的地方。 Mycat 中的使用者,使用者可以通路的邏輯庫,可以通路的邏輯表,服務的端口号等

說明:上面的預設的配置表示 建立的有兩個使用者root和user賬号

 root 賬号,密碼是123456,對應的邏輯庫是 TESTDB

 user 賬号,密碼是user,對應的邏輯庫是 TESTDB,權限是隻讀

注釋掉的privileges 表示root使用者的操作權限

參數 事例
dml insert,update,select,delete 0000

2.2 schema.xml

schema.xml 是最主要的配置檔案,首先看預設的配置檔案

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
    <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
        <table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
        <table name="company" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" />
        <table name="goods" primaryKey="ID" type="global" dataNode="dn1,dn2" />
        <table name="hotnews" primaryKey="ID" autoIncrement="true" dataNode="dn1,dn2,dn3" rule="mod-long" />
        <table name="employee" primaryKey="ID" dataNode="dn1,dn2" rule="sharding-by-intfile" />
        <table name="customer" primaryKey="ID" dataNode="dn1,dn2" rule="sharding-by-intfile">
            <childTable name="orders" primaryKey="ID" joinKey="customer_id" parentKey="id">
                <childTable name="order_items" joinKey="order_id" parentKey="id" />
            </childTable>
            <childTable name="customer_addr" primaryKey="ID" joinKey="customer_id" parentKey="id" />
        </table>
    </schema>

    <dataNode name="dn1" dataHost="localhost1" database="db1" />
    <dataNode name="dn2" dataHost="localhost1" database="db2" />
    <dataNode name="dn3" dataHost="localhost1" database="db3" />
    <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
              writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
        <heartbeat>select user()</heartbeat>
        <writeHost host="hostM1" url="localhost:3306" user="root"
                   password="123456">
            <readHost host="hostS2" url="192.168.1.200:3306" user="root" password="xxx" />
        </writeHost>
        <writeHost host="hostS1" url="localhost:3316" user="root"
                   password="123456" />
    </dataHost>

</mycat:schema>      

2.2.1 主要節點介紹

 在配置檔案中可以定義讀寫分離,邏輯庫,邏輯表,dataHost,dataNode 等資訊.

節點
schema 配置邏輯庫,name 與 server.xml 中 schema 對應
dataNode 定義資料節點的标簽,也就是分庫相關配置
dataHost 實體資料庫,真正存儲資料的資料庫

2.2.2.1 schema

屬性name

邏輯庫名稱      

屬性checkSQLschema

是否檢測 SQL 文法中的 schema 資訊. 如: Mycat 邏輯庫名稱 A, dataNode 名稱 B
SQL : select * from A.table;
checkSQLschema 值是 true, Mycat 發送到資料庫的 SQL 是 select * from table;
checkSQLschema 隻是 false,Mycat 發送的資料庫的 SQL 是 select * from A.table;      

屬性sqlMaxLimit

Mycat 在執行 SQL 的時候,如果 SQL 語句中沒有 limit 子句.自動增加 limit 子句. 避免一次
性得到過多的資料,影響效率. limit子句的限制數量預設配置為100.如果 SQL中有具體的 limit
子句,目前屬性失效.
SQL : select * from table . mycat 解析後: select * from table limit 100
SQL : select * from table limit 10 . mycat 不做任何操作修改.      

标簽 table

定義邏輯表的标簽      

屬性 name

邏輯表名      

屬性 dataNode

資料節點名稱. 即實體資料庫中的 database 名稱.多個名稱使用逗号分隔.      

屬性 rule

分片規則名稱.具體的規則名稱參考 rule.xml 配置檔案.      

2.2.2.2 dataNode

資料節點名稱, 是定義的邏輯名稱,對應具體的實體資料庫 database      

屬性 dataHost

引用 dataHost 标簽的 name 值,代表使用的實體資料庫所在位置和配置資訊.      

屬性 database

在 dataHost 實體機中,具體的實體資料庫 database 名稱.      

2.2.2.3 dataHost

定義邏輯上的資料主機名稱      

屬性 maxCon/minCon

最大連接配接數, max connections
最小連接配接數, min connections      

屬性 dbType

資料庫類型 : mysql 資料庫      

屬性 dbDriver

資料庫驅動類型, native,使用 mycat 提供的本地驅動.      

dataHost 子标簽 writeHost

寫資料的資料庫定義标簽. 實作讀寫分離操作.      

屬性 host

資料庫命名      

屬性 url

資料庫通路路徑      

屬性 user

資料庫通路使用者名      

屬性 password

通路使用者密碼      

writeHost 子标簽 readHost

資料庫命名      
資料庫通路路徑      
資料庫通路使用者名      

2.3 rule.xml

 用于定義分片規則的配置檔案。mycat 預設的分片規則: 以 500 萬為機關,實作分片規則.邏輯庫 A 對應 dataNode - db1 和 db2. 1-500 萬儲存在 db1 中, 500 萬零 1 到 1000 萬儲存在 db2 中,1000 萬零 1 到 1500 萬儲存在 db1 中.依次類推.

<?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="rule1">
        <rule>
            <columns>id</columns>
            <algorithm>func1</algorithm>
        </rule>
    </tableRule>

    <tableRule name="rule2">
        <rule>
            <columns>user_id</columns>
            <algorithm>func1</algorithm>
        </rule>
    </tableRule>

    <tableRule name="sharding-by-intfile">
        <rule>
            <columns>sharding_id</columns>
            <algorithm>hash-int</algorithm>
        </rule>
    </tableRule>
    <tableRule name="auto-sharding-long">
        <rule>
            <columns>id</columns>
            <algorithm>rang-long</algorithm>
        </rule>
    </tableRule>
    <tableRule name="mod-long">
        <rule>
            <columns>id</columns>
            <algorithm>mod-long</algorithm>
        </rule>
    </tableRule>
    <tableRule name="sharding-by-murmur">
        <rule>
            <columns>id</columns>
            <algorithm>murmur</algorithm>
        </rule>
    </tableRule>
    <tableRule name="crc32slot">
        <rule>
            <columns>id</columns>
            <algorithm>crc32slot</algorithm>
        </rule>
    </tableRule>
    <tableRule name="sharding-by-month">
        <rule>
            <columns>create_time</columns>
            <algorithm>partbymonth</algorithm>
        </rule>
    </tableRule>
    <tableRule name="latest-month-calldate">
        <rule>
            <columns>calldate</columns>
            <algorithm>latestMonth</algorithm>
        </rule>
    </tableRule>
    
    <tableRule name="auto-sharding-rang-mod">
        <rule>
            <columns>id</columns>
            <algorithm>rang-mod</algorithm>
        </rule>
    </tableRule>
    
    <tableRule name="jch">
        <rule>
            <columns>id</columns>
            <algorithm>jump-consistent-hash</algorithm>
        </rule>
    </tableRule>

    <function name="murmur"
        class="io.mycat.route.function.PartitionByMurmurHash">
        <property name="seed">0</property><!-- 預設是0 -->
        <property name="count">2</property><!-- 要分片的資料庫節點數量,必須指定,否則沒法分片 -->
        <property name="virtualBucketTimes">160</property><!-- 一個實際的資料庫節點被映射為這麼多虛拟節點,預設是160倍,也就是虛拟節點數是實體節點數的160倍 -->
        <!-- <property name="weightMapFile">weightMapFile</property> 節點的權重,沒有指定權重的節點預設是1。以properties檔案的格式填寫,以從0開始到count-1的整數值也就是節點索引為key,以節點權重值為值。所有權重值必須是正整數,否則以1代替 -->
        <!-- <property name="bucketMapPath">/etc/mycat/bucketMapPath</property> 
            用于測試時觀察各實體節點與虛拟節點的分布情況,如果指定了這個屬性,會把虛拟節點的murmur hash值與實體節點的映射按行輸出到這個檔案,沒有預設值,如果不指定,就不會輸出任何東西 -->
    </function>

    <function name="crc32slot"
              class="io.mycat.route.function.PartitionByCRC32PreSlot">
        <property name="count">2</property><!-- 要分片的資料庫節點數量,必須指定,否則沒法分片 -->
    </function>
    <function name="hash-int"
        class="io.mycat.route.function.PartitionByFileMap">
        <property name="mapFile">partition-hash-int.txt</property>
    </function>
    <function name="rang-long"
        class="io.mycat.route.function.AutoPartitionByLong">
        <property name="mapFile">autopartition-long.txt</property>
    </function>
    <function name="mod-long" class="io.mycat.route.function.PartitionByMod">
        <!-- how many data nodes -->
        <property name="count">3</property>
    </function>

    <function name="func1" class="io.mycat.route.function.PartitionByLong">
        <property name="partitionCount">8</property>
        <property name="partitionLength">128</property>
    </function>
    <function name="latestMonth"
        class="io.mycat.route.function.LatestMonthPartion">
        <property name="splitOneDay">24</property>
    </function>
    <function name="partbymonth"
        class="io.mycat.route.function.PartitionByMonth">
        <property name="dateFormat">yyyy-MM-dd</property>
        <property name="sBeginDate">2015-01-01</property>
    </function>
    
    <function name="rang-mod" class="io.mycat.route.function.PartitionByRangeMod">
            <property name="mapFile">partition-range-mod.txt</property>
    </function>
    
    <function name="jump-consistent-hash" class="io.mycat.route.function.PartitionByJumpConsistentHash">
        <property name="totalBuckets">3</property>
    </function>
</mycat:rule>      

簡化版

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://io.mycat/">

    <tableRule name="mod-long">
        <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">3</property>
    </function>

</mycat:rule>      

由上我們可以發現在rule.xml檔案中,核心的标簽就兩個tableRule 和function,我們分别來介紹下

2.3.1 tableRule

 是用來聲明table的分片規則的,相關屬性及标簽的含義如下

MyCat教程【安裝及配置介紹】

algorithm 使用 function 标簽中的 name 屬性。連接配接表規則和具體分片算法。 table 标簽内使用。讓邏輯表使用這個規則進行分片

2.3.2 function

 指定分片規則的算法的具體實作

name 指定算法的名字
class 制定分片算法具體的類名字
property 為具體算法需要用到的一些屬性