MyCat 之 【server.xml】【log4j2.xml】【rule.xml】【schema.xml】四種配置文件的簡述

在mycat中,我們基本使用的有四種配置文件,分別是【server.xml】【log4j2.xml】【rule.xml】【schema.xml】

下面分別簡述四種配置文件中的配置,掌握mycat最基本的使用

一)server.xml:

作用:配置系統參數;配置用戶訪問權限;配置SQL防火牆以及SQL攔截功能

下面是詳細的配置,主要針對標籤【system】和【user】進行簡單的配置講解

1)首先是我們的系統參數配置,主要查看我們的【system】標籤,下面是詳細的配置(只展示了常用的部分而配置),註釋都有詳細說明

<system>
	<property name="nonePasswordLogin">0</property> <!-- 0爲需要密碼登陸、1爲不需要密碼登陸 ,默認爲0,設置爲1則需要指定默認賬戶-->
	<property name="serverPort">3306</property><!-- 設置的默認端口號-->
	<property name="managerPort">9066</property> <!-- 設置的管理端口號-->
	<property name="idleTimeout">300000</property> <!-- 前端應用多長時間沒有對mycat進行訪問的話,就會斷開 ,單位毫秒---->
	<property name="bindIp">0.0.0.0</property>  <!-- 監控的網卡地址,設置0.0.0.0就是監聽所有IP-->
	<property name="frontWriteQueueSize">2048</property>   <!-- 前端寫隊列的大小-->
	<property name="processors">4</property> <!-- mycat進程的數量,一般等於我們服務器CPU的核數-->
	<property name="txIsolation">2</property> <!-- mysql的隔離級別設置,2代表讀已提交-->
	<property name="sqlExecuteTimeout">300</property> <!-- sql執行的時間,超過此設置時間斷開 單位秒-->
	<property name="charset">utf-8</property> <!-- 設置的編碼格式,一定要與mysql創建的數據庫編碼格式保持一致-->
	<property name="useSqlStat">0</property>  <!-- 1爲開啓實時統計、0爲關閉 -->
	<property name="useGlobleTableCheck">0</property>  <!-- 1爲開啓全加班一致性檢測、0爲關閉 -->
	<property name="defaultMaxLimit">100</property><!-- 對mysqL查詢返回的數據集做一個限制 -->
	<property name="maxPacketSize">104857600</property><!-- 默認mysqL 返回包的大小-->
    <property name="memoryPageSize">64k</property><!-- 單位爲m-->
</system>

2)就是我們用戶訪問權限的設置了,主要配置在【user】標籤中

2.1)若是我們現在需要對某一個用戶配置只讀權限,如何配置?

<user name="user">
		<property name="password">user</property> <!--用戶的密碼-->
		<property name="schemas">TESTDB</property><!--允許訪問的邏輯庫-->
		<!--
			對於一個用戶授權於放翁多個數據庫的配置
			<property name="schemas">TESTDB,test1,test2</property>
		-->
		<property name="readOnly">true</property><!--是否是隻讀用戶-->
		
</user>

上面的配置意思是對【user】用戶授權只讀權限,允許訪問邏輯庫TESTDB

2.2)若是對某個用戶授權可以訪問某個庫的某些表的某些權限如何設置?

<user name="root" defaultAccount="true">
		<property name="password">123456</property>
		<property name="schemas">TESTDB</property>
		
		<!-- 
        表級 DML 權限設置 
        說明:dml代表權限:insert,update,select,delete
        0代表沒有此權限;1代表有此權限
        -->	
		<privileges check="false">
			<schema name="TESTDB" dml="0110" >
				<table name="tb01" dml="0000"></table>
				<table name="tb02" dml="1111"></table>
			</schema>
		</privileges>		
		 
</user>

上面配置代表root用戶可以訪問邏輯庫【TESTDB】下的tb02表,並且擁有增,刪,改,查的所有權限

2.3)一般我們不會將用戶的密碼以明文的形式配置在文件中,我們回使用加密方式對我們的密碼做一個簡單的加密,然後配置

進入我們的執行加密的jar包目錄下:

/usr/local/mycat/lib

然後執行

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

可以看到加密的密碼已經輸出

然後找到我們的配置文件進行修改

<user name="root" defaultAccount="true">
                <property name="usingDecrypt">1</property>
                <property name="password">CrjpLhvVJkHk0EPW35Y07dUeTimf52zMqClYQkIAN3/dqiG1DVUe9Zr4JLh8Kl+1KH1zd7YTKu5w04QgdyQeDw==</property>
                <property name="schemas">miaosha</property>
</user

記得一定要加上【 <property name="usingDecrypt">1</property>】我們的密文纔可以生效

 

二)log4j2.xml

作用:配置日誌展示的格式、日誌級別等

 <RollingFile name="RollingFile" fileName="${sys:MYCAT_HOME}/logs/mycat.log"
                     filePattern="${sys:MYCAT_HOME}/logs/$${date:yyyy-MM}/mycat-%d{MM-dd}-%i.log.gz">
        <PatternLayout>
                <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %5p [%t] (%l) - %m%n</Pattern>
            </PatternLayout>
            <Policies>
                <OnStartupTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="250 MB"/>
                <TimeBasedTriggeringPolicy/>
            </Policies>
 </RollingFile>
 <asyncRoot level="info" includeLocation="true">
            <AppenderRef ref="RollingFile"/>
 </asyncRoot>

 

簡述:

  • 【%d{yyyy-MM-dd HH:mm:ss.SSS}】表示日誌的時間格式
  • 【%5p】表示日誌的輸出級別
  • 【%t】表示日誌中記錄線程的名稱
  • 【%m】表示輸出代碼中指定的消息
  • 【%n】表示輸出一個換行符
  • 【level="info"】:表示輸出info級別的日誌,共八種日誌級別如下:

   All<Trace<Debug<Info<Warn<Error<Fatal<OFF

三)rule.xml

作用:配置水平分片的分片規則;配置分片規則對應的分片函數

例如我們需要對我們的數據庫表進行水品切分的時候需要用到算法,我們這時候就可以在這裏定義好分片函數,然後在我們的【schema.xml】文件中指定邏輯庫配置的時候指定我們的分片函數

下面以常用的四種分片算法爲例進行簡單的講解:

3.1)簡單取模-PartitionByMod

<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>

3.2)哈希取模-PartitionByHashMod

簡單概述:對分片列的值進行hash運算,得出一個整數型的數值,然後對分片數量“count”進行取模,就可以得到分片位置

<tableRule name="hash-mod-2_login_name">
    <rule>
        <columns>login_name</columns>
        <algorithm>hash-mod</algorithm>
    </rule>
</tableRule>
<function name="hash-mod"
          class="io.mycat.route.function.PartitionByHashMod">
    <property name="count">2</property>
</function>

3.3)分片枚舉-PartitionByFileMap

<tableRule name="hash-int_qy_id">
    <rule>
        <columns>qy_id</columns>
        <algorithm>hash-int</algorithm>
    </rule>
</tableRule>
<function name="hash-int"
          class="io.mycat.route.function.PartitionByFileMap">
    <!-- mapFile 文件名,位於config目錄下 -->
    <property name="mapFile">partition-hash-int.txt</property>
    <!-- 指定mapFile中枚舉的數據類型,0爲整型;非0則爲字符串類型 -->
    <property name="type">0</property>
    <!-- 是否啓用默認節點,大於等於0爲啓用;小於等於0爲不啓用 -->
    <property name="defaultNode">0</property>
</function>

簡單講述場景:拿區域來劃分數據,例如我們有三個地方的數據,北京--001,上海--002,深圳--003。

那麼我們三個地區要存儲在三個數據庫表中。這時候我們會在【name="mapFile"】指定的txt文件中配置我們的規則:

001=0;002=1;003=2;而0,1,2分表代表我們的三個數據節點,這樣就可以根據我們指定的規則對數據做一個分片處理

【注:枚舉分片的規則文件要放在mycat的conf文件下面】

3.4)字符串範圍取模-PartitionByPrefixPattern

如下圖:

原理解釋:例如我們對默認字符串截取前三個字母,然後分別獲取三個字母的ascii碼值進行相加的計算;

配置文件中我們會指定求模基數的ascii碼值,對應上圖的128,然後我們用計算得來的和和基數進行取模計算;

在我們的【prefix-partition-pattern.txt】文件中會指明計算結果的落庫規則,例如上圖:0-63之間的數據會存儲在0數據節點,64-127的會存儲在1數據節點

下面是詳細的配置

<tableRule name="sharding-by-prefix-pattern_login_name">
    <rule>
        <columns>login_name</columns>
        <algorithm>sharding-by-prefix-pattern</algorithm>
    </rule>
</tableRule>
<function name="sharding-by-prefix-pattern"
          class="io.mycat.route.function.PartitionByPrefixPattern">
    <!-- mapFile 文件名,位於config目錄下 -->
    <property name="mapFile">prefix-partition-pattern.txt</property>
    <!-- 求模基數 -->
    <property name="patternValue">128</property>
    <!-- 字符串範圍,這裏爲前兩位 -->
    <property name="prefixLength">2</property>
</function>

 四)schema.xml

作用:配置邏輯庫及邏輯表;配置邏輯表所存儲的數據節點;配置數據節點所對應的物理數據庫服務器的信息

這個配置文件可以說是我們獲取數據的核心,非常關鍵,下面先看一個簡單版的完整配置:

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

    <schema name="MIAOSHA" checkSQLschema="false" sqlMaxLimit="100" >
        <table name="order" primaryKey="orderId" dataNode="mycat1,mycat2" rule="auto-sharding-long" splitTableNames="true"/>
    </schema>

    <dataNode name="mycat1" dataHost="myserver1" database="db1"/>
    <dataNode name="mycat2" dataHost="myserver1" database="db2"/>
    
    <dataHost name="myserver1" maxCon="1000" minCon="10" balance="0"
              writeType="0" dbType="mysql" dbDriver="native" switchType="1" >
        <heartbeat>select user()</heartbeat>
        <writeHost host="192.168.124.34" url="192.168.124.34:3306" user="root" password="123456">
            <readHost host="192.168.124.35" url="192.168.124.35:3306" user="root" password="123456"/>
        </writeHost>
        <writeHost host="192.168.124.35" url="192.168.124.35:3306" user="root" password="123456"/>
    </dataHost>
</mycat:schema>

 

下面是簡單的講述:

4.1)【table】

  • name 屬性定義邏輯表的名字,必須唯一不能重複且需要與數據庫中的物理表名一致
  • primaryKey 屬性指定邏輯表中的主鍵,也是需要與物理表的主鍵一致
  • dataNode 屬性指定物理表所在數據節點的名稱,配置多個數據節點時需按索引順序並使用逗號分隔
  • rule 屬性用於指定分片規則名稱,對應rule.xml中的<tableRule>標籤的name屬性,如無需分片可以不指定
  • splitTableNames 屬性定義是否允許多個表的定義

4.2)【dataNode】

  • name 屬性定義數據節點的名稱,必須唯一
  • dataHost 屬性指定分片所在的物理主機
  • database 屬性指定物理數據庫的名稱,就是我們真實存在的mysql數據庫名稱

4.3)【dataHost】

  • name 屬性用於定義主機名稱,必須唯一
  • maxCon 屬性指定每個讀/寫實例連接池的最大連接數
  • minCon 屬性指定每個讀寫實例連接池的最小連接數,即初始化連接池的大小
  • dbType 屬性指定後端連接的數據庫類型,還有其他使用JDBC連接的數據庫
  • dbDriver 屬性指定連接後端數據庫使用的驅動,目前可選的值有native和JDBC
  • balance 屬性指定讀寫分離的負載均衡類型,目前的取值有4 種:
  •     0:不開啓讀寫分離機制,所有讀操作都發送到當前可用的 writeHost 上
  •     1:全部的readHost與stand by writeHost參與select語句的負載均衡
  •     2:所有讀操作都隨機在writeHost、readhost 上分發
  •     3:所有readHost參與select語句的而負載均衡
  • writeType  也是設計負載均衡的標籤,配置爲0,指定是所有writeHost下只允許第一個寫主機執行,只有當第一個寫主機掛掉,
  • 才允許第二個寫主機來執行;若是配置爲1,那麼要是有兩個寫主機,那麼會隨機將寫請求發佈到兩個主機來去執行
  • switchType  開啓自動切換的功能,兩個寫主機,當地一個寫主機掛掉,可以自動切換到第二個;若是配置爲-1,則代表關閉了自動這種切換

4.4)【heartbeat】

  • 表示如何檢查後端數據庫是否可用

4.5)【writeHost】【readHost】

  • writeHost標籤配置寫實例,即主從中的master節點;readHost 標籤配置讀實例,即主從中的salve節點
  • host 屬性用於標識不同實例名稱,一般writeHost名稱使用M1作爲後綴,readHost則使用S1作爲後綴
  • url 屬性用於配置數據庫的連接地址,如果是使用native的dbDriver,則一般爲address:port這種形式。用JDBC或其他的dbDriver,則需要特殊指定。例如,當使用JDBC 時則可以這麼寫:jdbc:mysql://localhost:3306/
  • user 屬性配置數據庫用戶名
  • password 屬性配置數據庫密碼

 

 

 


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章