mycat入門—配置

mycat主要配置文件有3個,他們各司其職前端

一、server.xml配置

server.xml配置文件主要做用是:
  • 配置系統相關參數java

  • 配置用戶訪問權限mysql

  • 配置SQL防火牆及SQL攔截功能算法

    server.xml中分爲兩個節點,一個是system 節點,另外一個是user節點sql

    system節點主要配置mycat運行相關的屬性,經常使用的屬性以下:數據庫

<!--mycat對外提供服務的端口-->
                <property name="serverPort">3306</property>
                <!--mycat管理端口-->
                <property name="managerPort">9066</property>
                <!--
                    登陸mycat時是否須要密碼驗證登陸 0爲須要密碼登錄、1爲不須要密碼登錄,默認爲0,設置爲1則須要指定默認帳戶
                -->
                <property name="nonePasswordLogin">0</property> 
                <!--須要監聽那些IP地址 0.0.0.0表示所有-->
                <property name="bindIp">0.0.0.0</bindIp>
                <!--前端寫隊列的大小-->
                <property name="frontWriteQueueSize">2048</property>

                <!--數據庫的字符集-->
                <property name="charset">utf8</property>
                <!--數據庫隔離級別 2讀已提交 3可重複讀-->
                <property name="txIsolation">2</property>
                <!--等於cpu核心數-->
                <property name="processors">1</property>
                <!--前端與mycat鏈接超時 時間(毫秒)-->
                <property name="idleTimeout">1800000</property>
                <!--當一條sql執行超過多長時間後mycat與mysql斷開鏈接 秒-->
                <property name="sqlExecuteTimeout">300</property>
                <!-- 1爲開啓實時統計、0爲關閉 -->
                <property name="useSqlStat">0</property> 
                <!-- 1爲開啓全加班一致性檢測、0爲關閉 --> 
                <property name="useGlobleTableCheck">0</property>
                <property name="sequnceHandlerType">2</property>
                <!--每次查詢最多返回的數據-->
                <property name="defaultMaxLimit">100</property>
                <property name="maxPacketSize">104857600</property>

user標籤配置了能夠訪問mycat的用戶屬性以及權限安全

<user name="root" defaultAccount="true">
                <property name="password">123456</property>
                <!--訪問那個數據庫   多個數據庫能夠用逗號隔開  user,system-->
                <property name="schemas">TESTDB</property>
                <property name="readOnly">false</property>
                <!-- 表級 DML 權限設置 -->
                <privileges check="false">
                        <!--
                            dml 數字分別表明 insert update select delete 0表明無權限 1表明有權限 schema標籤中的 dml爲默認權限
                        -->
                        <schema name="TESTDB" dml="0110" >
                                <table name="tb01" dml="0000"></table>
                                <table name="tb02" dml="1111"></table>
                        </schema>
                </privileges>           
        </user>

這樣配置文件中密碼爲明文,存在安全隱患,mycat提供了加密方法,進入mycat安裝目錄下的lib目錄中執行如下命令:bash

java -cp Mycat-server-1.6.5-release.jar io.mycat.util.DecryptUtil 0:root:123456

執行完成後會返回加密後的密碼服務器

GO0bnFVWrAuFgr1JMuMZkvfDNyTpoiGU7n/Wlsa151CirHQnANVk3NzE3FErx8v6pAcO0ctX3xFecmSr+976QA==

將原來的明文密碼改爲加密後的密碼,並告訴mycat所用的密碼爲加密後的密碼便可,因此加密後的user節點爲:oracle

<user name="root" defaultAccount="true">
                <!--是否使用加密後的密碼-->
                <property name="usingDecrypt">1</property>
                <property name="password">
GO0bnFVWrAuFgr1JMuMZkvfDNyTpoiGU7n/Wlsa151CirHQnANVk3NzE3FErx8v6pAcO0ctX3xFecmSr+976QA==
                </property>
                <!--訪問那個數據庫   多個數據庫能夠用逗號隔開  user,system-->
                <property name="schemas">TESTDB</property>
                <property name="readOnly">false</property>
                <!-- 表級 DML 權限設置 -->
                <privileges check="false">
                        <!--
                            dml 數字分別表明 insert update select delete 0表明無權限 1表明有權限 schema標籤中的 dml爲默認權限
                        -->
                        <schema name="TESTDB" dml="0110" >
                                <table name="tb01" dml="0000"></table>
                                <table name="tb02" dml="1111"></table>
                        </schema>
                </privileges>           
        </user>

二、rule.xml配置文件

  • 配置水平分片表的分片規則

  • 配置分片規則對應的分片函數

    rule.xml中分爲兩部分,一個爲tableRule,主要做用是指定分片列和分片函數,一個爲function(分片函數),用於指定分片算法
<!--name屬性指定分片表規則的名字,這個名字要惟一-->
<tableRule name="rule1">
        <rule>
            <!--分片列:mycat會對指定的分片列進行計算,最終肯定數據存放在哪一個分片上,通常選擇表的主鍵-->
            <columns>id</columns>
            <!--分片函數  取<function>的name屬性-->
            <algorithm>func1</algorithm>
        </rule>
</tableRule>
<!--name表明函數名 class表明該算法所在的類 property表明函數所需的參數-->
    <function name="crc32slot"
              class="io.mycat.route.function.PartitionByCRC32PreSlot">
        <property name="count">2</property><!-- 要分片的數據庫節點數量,必須指定,不然無法分片 -->
    </function>
**經常使用的數據分片算法:**
  • 簡單取模分片算法

    簡單取模分片算法是經過對分片列進行取模,取模後將不一樣的結果存入對應的數據庫節點中:

    例如:對下表經過簡單取模算法分片,分片列爲id,分爲2個節點,則對id進行取模,結果爲1的存入DB01,結果爲0的存入DB02

**簡單取模算法配置以下:**
<tableRule name="customer_login">
        <rule>
            <columns>id</columns><!--指定分片列-->
            <algorithm>mod-long</algorithm><!--簡單取模分片函數name-->
        </rule>
</tableRule>

<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
        <!--節點數量 -->
        <property name="count">2</property>
</function>
  • 哈希取模分片算法

    哈希取模算法是經過對分片列進行哈希計算獲得一個整數值,而後進行取模運算

** 哈希取模算法配置以下:**

<tableRule name="customer_login">
        <rule>
            <columns>login_name</columns><!--指定分片列-->
            <algorithm>mod-long</algorithm><!--哈希取模分片函數name-->
        </rule>
</tableRule>

<function name="mod-long" class="io.mycat.route.function.PartitionByHashMod">
        <!--節點數量 -->
        <property name="count">2</property>
</function>
  • 枚舉分片算法

枚舉分片算法是經過指定特定的枚舉值將數據存入特色的節點

例如:以area\_id做爲分片列,經過枚舉算法將不一樣的數據存入不一樣的節點,在mapFile中指定area\_id爲1000的存入DB01,將area_id爲10001的數據存入DB02,而後設置默認其他值存入DB01

** 枚舉分片算法配置以下:**

<tableRule name="jch">
        <rule>
            <columns>area_id</columns>
            <algorithm>hash-int</algorithm>
        </rule>
</tableRule>
<function name="hash-int"
        class="io.mycat.route.function.PartitionByFileMap">
        <property name="mapFile">partition-hash-int.txt</property><!--mapFile配置文件-->
        <property name="type">0</property><!--枚舉值類型 0表明整數類型 1表明字符串類型  默認爲0-->
        <property name="defaultNode">0</property><!-- >=0:啓用默認節點  <0:不啓用默認節點 -->
</function>
  • 字符串範圍取模分片算法

    字符串取模分片算法是經過取一個字符串前n個字符,經過計算其ASCII碼的和,取模後存入對應的節點:
    
    ![](https://oscimg.oschina.net/oscnet/edafa96727cfebe902208c60f47ad346449.jpg)

** 字符串範圍取模分片算法配置以下:**

<function name="sharding-by-prefix-pattern" class="io.mycat.route.function.PartitionByPrefixPattern">
        <property name="patternValue">128</property><!--取模基數-->
        <property name="prefixLength">2</property><!--前綴長度-->
        <property name="mapFile">prefix-partition-pattern.txt</property><!--mapFile配置文件-->
</function>

三、schema.xml配置文件

  • 邏輯庫邏輯表的配置

  • 邏輯表所存儲的數據節點的配置

  • 數據節點所對應的物理數據庫服務器信息的配置

    schema.xml分爲三個節點,schema節點用於定義邏輯庫,dataNode,dataHost

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
    <!--name:表示邏輯庫庫名 sqlMaxLimit:表示每次查詢返回的最大行數,若取消限制 設置值爲-1  
        serverx.xml中配置的defaultMaxLimit是mycat系統默認的返回行數,
        checkSQLschema:是否檢查sql中含有數據庫名稱,便是否是經過庫名.代表的方式查詢
    -->
    <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
        <!--
            邏輯表配置 
            name:邏輯表名稱,必須與物理表名稱一致
            primaryKey:物理表中的主鍵
            dataNode:表數據存在物理節點的名稱,用逗號分開
            rule:分片規則
        -->
        <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="dual" primaryKey="ID" dataNode="dnx,dnoracle2" type="global"
            needAddLimit="false"/> <table name="worker" primaryKey="ID" dataNode="jdbc_dn1,jdbc_dn2,jdbc_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>
    <!--
        定義邏輯表存儲的物理數據庫
        name:定義數據節點名稱,必須惟一
        dataHost:定義分片所在的物理主機 這裏是主機名稱  這個名稱下可能包含多個物理主機
        database:定義屋裏數據庫的名稱
    -->
    <dataNode name="dn1" dataHost="localhost1" database="db1" />
    <dataNode name="dn2" dataHost="localhost1" database="db2" />
    <dataNode name="dn3" dataHost="localhost1" database="db3" />

    <!--
        定義了一組主從複製的集羣
        writeHost:處理寫請求的數據庫 
        readHost:處理讀請求的數據庫 通常爲從服務器

        name:數據庫集羣的名稱 惟一
        maxCon:最大鏈接數
        minCon:初始化最小鏈接數
        balance:讀寫分離和讀的負載均衡 
                0表明不開啓不寫分離 讀寫所有在主服務器處理 
                1所有的readHost與stand by writeHost參與select語句的負載均衡
                2所有的readHost與writeHost參與select語句的負載均衡
                3所有的readHost參與select語句的負載均衡
        writeType:寫操做類型 
                  0表明所有的寫操做在第一個writeHost數據庫進行 當第一個宕機後 寫操做在第二個writeHost執行
                  1表明寫請求隨機發送到writeHost執行
        dbType:數據庫類型
        dbDriver:數據庫驅動 native mysql原生驅動  其餘數據庫用jdbc
        switchType:
        slaveThreshold:
    -->
    <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">
            <!-- can have multi read hosts -->
            <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>
相關文章
相關標籤/搜索