在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 屬性配置數據庫密碼