1. 程式人生 > 實用技巧 >Mycat 配置概述

Mycat 配置概述

核心配置檔案

1.server.xml

作用:

  • 配置mycat系統性引數 ( 標籤)
  • 配置使用者以及訪問許可權 ( 標籤)
  • 配置sql防火牆以及sql攔截功能

常用完整屬性配,常用的mysql系統的完整配置

    <system> 
        <property name="serverPort">8066</property>
         <!-- mycat 管理埠 -->
        <property name="managerPort">9066</property> 
        <!-- 0為需要密碼登陸、1為不需要密碼登陸 ,預設為0,設定為1則需要指定預設賬戶-->
        <property name="nonePasswordLogin">0</property>
        <property name="bindIp">0.0.0.0</property> 
        <!--寫佇列大小-->
        <property name="frontWriteQueueSize">4096</property>
        <property name="charset">utf8</property>
    
        <!--事務隔離級別  3-可重複讀-->
        <property name="txIsolation">3</property>
    
        <!--mycat執行緒數量-->
        <property name="processors">8</property>
        <!--執行緒空閒多長時間斷開 毫秒-->
        <property name="idleTimeout">1800000</property>
        <!--秒-->
        <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>
        <!--mysql中包的大小-->
        <property name="maxPacketSize">104857600</property>
    </system>

    <user name="root" defaultAccount="true">
                    <property name="password">123456</property>
                    <property name="schemas">TESTDB,TESTDB2,TESTDB3</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="password">user</property>
        <!--是否對明文進行加密-->
 		<property name="usingDecrypt">0</property>
        <property name="schemas">TESTDB,TESTDB1,TESTDB2</property>
        <!--是否是預設賬號-->
        <property name="readOnly">false</property> 
            <privileges check="false">
            <schema name="TESTDB" dml="0110" >
                <table name="tb01" dml="0000"></table>
                <table name="tb02" dml="1111"></table>
            </schema>
        </privileges>        
</user>
  • dml 總的數字代表: 0110 -> insert,update,select,detele 0代表不具有此許可權,1代表有次許可權
  • 使用者密碼加密配置
    java -cp Mycat-server-1.6.5-release.jar 0:root:123456 (0:前端加密標誌 root:使用者名稱 123456:密碼)
    配置:對應的user標籤 1

2.rule.xml

作用
配置分片規則

分片表的配置規則

<tableRule name="hash-mod-2_id">
  <rule>
    <columns>id</columns>
    <algorithm>hash–mode–2</algorithm>
  <rule>
<tableRule>
  • columns 分片列
  • algorithm 分片演算法

配置表的分片演算法

    <function name="hash-mode-2" class="io.mycat.route.function.PartitionByHashMod">
        <property name="count">2</property>
    </function>
常用分片演算法
  • 簡單取模分片演算法 PartitionByMod

    場景:分片列是整型,使用這種取模演算法



    例子
<tableRule name="partition-mod-2-stuent_id">
    <rule>
        <columns>student_id</columns>
        <algorithm>partition-mod-2</algorithm>
    </rule>
</tableRule>
<function name="partition-mod-2" class="io.mycat.route.function.PartitionByMod">
    <property name="count">2</property>
</function>
  • 雜湊取模 PartitionByHashMod
    場景:分片列適合所有型別

    注意:如果hash一致的過多,可能會使某個分片資料庫資料過多。

    例子
<tableRule name="partition-hash-mod-2-stuent_id">
    <rule>
        <columns>student_id</columns>
        <algorithm>partition-hash-mod-2</algorithm>
    </rule>
</tableRule>
<function name="partition-hash-mod-2" class="io.mycat.route.function.PartitionByHashMod">
    <property name="count">2</property>
</function>
  • 分片列舉演算法 PartitionByFileMap
    場景: 根據有限個列舉型別進行分片
    <tableRule name="partition-enums-file-mod-2-school_id">
        <rule>
            <columns>school_id</columns>
            <algorithm>hash-int</algorithm>
        </rule>
    </tableRule>
    <function name="partition-enums-file-mod-2" class="io.mycat.route.functioin.PartitionByFileMap">
        <property name="mapFile">partition-hash-int.txt</property>
        <property name="type">0</property>
        <property name="defaultNode">0</property>
    </function>
  1. property name="type" 定義列舉值型別,0代表整數型別,非0表示字串
  2. name="defaultNode" 是否使用預設節點,<0 : 不起用預設節點, >=0 表示啟用預設節點
  3. 相應的配置檔案,需要放在$MYCAT_HOME/conf 目錄下
  4. 列舉值可以指定資料的儲存位置
  • 字串範圍取模分片演算法

    擷取某個字串的一部分,作為分片的依據

    演算法:擷取字串的某一段,然後assic碼相加,然後和取模基數進行取模計算。
    <function name="sharding-by-prefix-patter" class="io.mycat.route.function.PartitionByPrefixPattern">
        <property name="patternValue">128</property> <!--配置的取模基數-->
        <property name="prefixLength">2</property>  <!--取前2兩位-->
        <property name="mapFile">prefix-partition-pattern.txt</property>
    </function>
  1. prefix-partition-pattern.txt 記錄了 對應的取模範圍和後端節點的對應關係
  2. 可以根據指定字串的前N個字元確定儲存位置

3.schema.xml

用途
配置邏輯庫和邏輯表
配置邏輯表所儲存的資料節點
配置資料節點所對應的資料庫伺服器資訊

  • 邏輯庫的定義
    <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="1000"></schema>
  1. sqlMaxLimit 當前邏輯庫預設返回的最大行數 , -1 時表示不限制
  2. checkSQLschema 是否檢查sql中含有庫名稱 ,true :檢查並刪除庫名 , false :不檢查
  • 邏輯表定義
    <table name="travelrecord" primeryKey="id"  dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
  1. name 邏輯表名 (邏輯表必須對應著物理表)
  2. primeryKey 主鍵
  3. dataNode : 儲存的實際的物理節點
  4. rule 引用分片規則
  • dataNode 標籤
   	<dataNode name="dn1" dataHost="localhost1" database="db1" />
  1. name : 定義dataNode 的值
  2. dataHost mysql 叢集的地址
  3. database 物理資料庫的名稱
  • dataHost 標籤
  	<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
			  writeType="0" dbType="mysql" dbDriver="native" switchType="1">
		<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>

dataHost屬性

  1. name 組伺服器名稱,dataNode 標籤引用的依據,mycat中唯一
  2. maxCon , minCon 定義 最大連線數 ,最小連線數
  3. banlance 工作方式,取值
    • balance="0", 不開啟讀寫分離機制,所有讀操作都發送到當前可用的 writeHost 上。
    • balance="1",全部的 readHost 與 stand by writeHost 參與 select 語句的負載均衡,簡單的說,當雙
      主雙從模式(M1->S1,M2->S2,並且 M1 與 M2 互為主備),正常情況下,M2,S1,S2 都參與 select 語句的負載
      均衡。
    • balance="2",所有讀操作都隨機的在 writeHost、readhost 上分發。
    • balance="3",所有讀請求隨機的分發到 wiriterHost 對應的 readhost 執行,writerHost 不負擔讀壓力,
      注意 balance=3 只在 1.4 及其以後版本有,1.3 沒有。
  4. writeType 負載均衡型別
    • writeType="0", 所有寫操作傳送到配置的第一個 writeHost,第一個掛了切到還生存的第二個 writeHost,
      重新啟動後已切換後的為準,切換記錄在配置檔案中:dnindex.properties .
    • writeType="1",所有寫操作都隨機的傳送到配置的 writeHost,1.5 以後廢棄不推薦。
  5. switchType 是否自動切換寫資料庫
    • -1 表示不自動切換。
    • 1 預設值,自動切換。
    • 2 基於 MySQL 主從同步的狀態決定是否切換。
  6. heartbeat 標籤,檢測心跳
  7. writeHost 標籤,指定寫例項
  8. readHost 標籤,指定讀例項
  • 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">
		<!-- auto sharding by id (long) -->
		<table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
	</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">
		<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>