Mycat 配置文件解析

mycat安裝完成後,目錄以下:html

  • bin mycat命令,啓動、重啓、中止等
  • catlet catlet爲Mycat的一個擴展功能
  • conf Mycat 配置信息,重點關注
  • lib Mycat引用的jar包,Mycat是java開發的
  • logs 日誌文件,包括Mycat啓動的日誌和運行的日誌

Mycat的配置文件都在conf目錄裏面,介紹幾個經常使用的文件:java

文件 說明
server.xml Mycat的配置文件,設置帳號、參數等
schema.xml Mycat對應的物理數據庫和數據庫表的配置
rule.xml Mycat分片(分庫分表)規則
1、server.xml

server.xml文件其實跟讀寫分離策略關係不大,可是須要用此文件來配置鏈接MyCat的用戶及權限等。node

.......
        <user name="bobo">
                <property name="password">bo@123</property>
                <property name="schemas">mycat/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>
 
        <!-- #注意,因爲這裏只定義了一個標籤,因此把多餘的都註釋了。若是這個打開,也須要將TESTDB庫改成和上面同樣的mycat庫名。 <user name="user"> <property name="password">user</property> <property name="schemas">TESTDB</property> <property name="readOnly">true</property> </user> -->
</mycat:server>
.......
參數 說明
user 用戶配置節點
name 登陸的用戶名,也就是鏈接Mycat的用戶名。
password 登陸的密碼,也就是鏈接Mycat的密碼
schemas 數據庫名,這裏會和schema.xml中的配置關聯,多個用逗號分開,例如須要這個用戶須要管理兩個數據庫db1,db2,則配置db1,db2
privileges 配置用戶針對表的增刪改查的權限
readOnly mycat邏輯庫所具備的權限。true爲只讀,false爲讀寫都有,默認爲false。

注意:mysql

  • server.xml文件裏登陸mycat的用戶名和密碼能夠任意定義,這個帳號和密碼是爲客戶機登陸mycat時使用的帳號信息。
  • 邏輯庫名(如上面的mycat,也就是登陸mycat後顯示的庫名,切換這個庫以後,顯示的就是代理的真實mysql數據庫的表)要在schema.xml裏面也定義,不然會致使mycat服務啓動失敗!
  • 這裏只定義了一個標籤,因此把多餘的都註釋了。若是定義多個標籤,即設置多個鏈接mycat的用戶名和密碼,那麼就須要在schema.xml文件中定義多個對應的庫!
2、schema.xml

schema.xml是最主要的配置項,此文件關聯mysql讀寫分離策略!讀寫分離、分庫分表策略、分片節點都是在此文件中配置的!算法

MyCat做爲中間件,它只是一個代理,自己並不進行數據存儲,須要鏈接後端的MySQL物理服務器,此文件就是用來鏈接MySQL服務器的!
在這裏插入圖片描述
schema.xml 文件定義了 MyCat 到底鏈接那個數據庫實例,鏈接這個數據庫實例的哪一個數據庫。MyCat 一共有幾個邏輯數據庫,MyCat 一共有幾個邏輯表。sql

schema.xml 文件一共有四個配置節點:DataHost、DataNode、Schema、Table。mongodb

  • schema 標籤用於定義MyCat 實例中的邏輯庫,MyCat 能夠有多個邏輯庫,每一個邏輯庫都有本身的相關配置。可使用schema 標籤來劃分這些不一樣的邏輯庫。
  • dataNode 標籤訂義了MyCat 中的數據節點,也就是咱們一般說所的數據分片。一個dataNode 標籤就是一個獨立的數據分片。
  • dataHost標籤直接定義了具體的數據庫實例、讀寫分離配置和心跳語句。其中有幾個重要的屬性:

– balance屬性數據庫

負載均衡類型,目前的取值有3 種:
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 沒有。後端

– writeType 屬性服務器

負載均衡類型,目前的取值有3 種: writeType=「0」,
全部寫操做發送到配置的第一個writeHost,第一個掛了切到還生存的第二個
writeHost,從新啓動後已切換後的爲準,切換記錄在配置文件中:dnindex.properties .
writeType=「1」,全部寫操做都隨機的發送到配置的writeHost,1.5 之後廢棄不推薦。

2.1 schema.xml文件中配置的參數解釋

參數 說明
schema 數據庫設置,此數據庫爲邏輯數據庫,name與server.xml中schema對應
dataNode 分片信息,也就是分庫相關配置
dataHost 物理數據庫,真正存儲數據的數據庫

配置說明:

  • name屬性惟一標識dataHost標籤,供上層的標籤使用。
  • maxCon屬性指定每一個讀寫實例鏈接池的最大鏈接。也就是說,標籤內嵌套的.
  • writeHost、readHost標籤都會使用這個屬性的值來實例化出鏈接池的最大鏈接數。
  • minCon屬性指定每一個讀寫實例鏈接池的最小鏈接,初始化鏈接池的大小。

每一個節點的屬性逐一說明:

  • schema:
    • name:邏輯數據庫名,與server.xml中的schema對應
    • checkSQLschema:數據庫前綴相關設置,建議看文檔,這裏暫時設爲false
    • sqlMaxLimit:select 時默認的limit,避免查詢全表

table:

屬性 說明
name 表名,物理數據庫中表名
dataNode 表存儲到哪些節點,多個節點用逗號分隔。節點爲下文dataNode設置的name
primaryKey 主鍵字段名,自動生成主鍵時須要設置
autoIncrement 是否自增
rule 分片規則名

dataNode:

屬性 說明
name 節點名,與table中dataNode對應
datahost 物理數據庫名,與datahost中name對應
database 物理數據庫中數據庫名

dataHost:

屬性 說明
name 物理數據庫名,與dataNode中dataHost對應
balance 均衡負載的方式
writeType 寫入方式
dbType 數據庫類型
heartbeat 心跳檢測語句,注意語句結尾的分號要加

schema.xml文件中有三點須要注意:balance=「1」,writeType=「0」 ,switchType=「1」 。

schema.xml中的balance的取值決定了負載均衡對非事務內的讀操做的處理。balance 屬性負載均衡類型,目前的取值有 4 種:

  • balance=「0」: 不開啓讀寫分離機制,全部讀操做都發送到當前可用的writeHost 上,即讀請求僅發送到writeHost上。
  • balance=「1」: 讀請求隨機分發到當前writeHost對應的readHost和standby的writeHost上。即所有的readHost與stand by writeHost 參與select 語句的負載均衡,簡單的說,當雙主雙從模式(M1 ->S1 , M2->S2,而且 M1 與 M2 互爲主備),正常狀況下, M2,S1,S2 都參與 select 語句的負載均衡。
  • balance=「2」: 讀請求隨機分發到當前dataHost內全部的writeHost和readHost上。即全部讀操做都隨機的在writeHost、 readhost 上分發。
  • balance=「3」: 讀請求隨機分發到當前writeHost對應的readHost上。即全部讀請求隨機的分發到 wiriterHost 對應的 readhost 執行,writerHost 不負擔讀壓力,注意 balance=3 只在 1.4 及其之後版本有,1.3 沒有。

writeType 屬性,負載均衡類型,目前的取值有 3 種:

  • writeType=「0」 全部寫操做發送到配置的第一個 writeHost,第一個掛了切到還生存的第二個writeHost,從新啓動後已切換後的爲- 準,切換記錄在配置文件中:dnindex.properties .
  • writeType=「1」 全部寫操做都隨機的發送到配置的 writeHost。
  • writeType=「2」 沒實現。

對於事務內的SQL默認走寫節點:

以 /balance/ 開頭,能夠指定SQL使用特定負載均衡方案。例如在大環境開啓讀寫分離的狀況下,特定強一致性的SQL查詢需求;
slaveThreshold:近似的主從延遲時間(秒)Seconds_Behind_Master < slaveThreshold ,讀請求才會分發到該Slave,確保讀到的數據相對較新。

schema.xml中的writeType的取值決定了負載均衡對寫操做的處理:
writeType=「0」:全部的寫操做都發送到配置文件中的第一個write host。(第一個write
host故障切換到第二個後,即便以後修復了仍然維持第二個爲寫庫)。推薦取0值,不建議修改.

主從切換(雙主failover):switchType 屬性:

若是細心觀察schem.xml文件的話,會發現有一個參數:switchType,以下配置:
 <dataHost name="237_15" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native"switchType="1"  slaveThreshold="100">
 
參數解讀
switchType="-1":  不自動切換
switchType="1":   默認值,自動切換
switchType="2":   基於MySQL主從同步的狀態來決定是否切換。需修改heartbeat語句(即心跳語句):show slave status
switchType="3":   基於Mysql Galera Cluster(集羣多節點複製)的切換機制。需修改heartbeat語句(即心跳語句):show status like 'wsrep%'

dbType屬性:

  • 指定後端鏈接的數據庫類型,目前支持二進制的mysql協議,還有其餘使用JDBC鏈接的數據庫。例如:mongodb、oracle、spark等。

dbDriver屬性指定鏈接後端數據庫使用的:

Driver,目前可選的值有native和JDBC。

使用native的話,由於這個值執行的是二進制的mysql協議,因此可使用mysql和maridb。

其餘類型的數據庫則須要使用JDBC驅動來支持。從1.6版本開始支持postgresql的native原始協議。

若是使用JDBC的話須要將符合JDBC 4標準的驅動JAR包放到MYCAT\lib目錄下,並檢查驅動JAR包中包括以下目錄結構的文件:
META-INF\services\java.sql.Driver。在這個文件內寫上具體的Driver類名,例如:com.mysql.jdbc.Driver。

heartbeat標籤:

這個標籤內指明用於和後端數據庫進行心跳檢查的語句。例如,MYSQL可使用select user(),Oracle可使用select 1 from dual等。
這個標籤還有一個connectionInitSql屬性,主要是當使用Oracla數據庫時,須要執行的初始化SQL

語句就這個放到這裏面來。例如:altersession set nls_date_format=‘yyyy-mm-dd hh24:mi:ss’

1.4主從切換的語句必須是:showslave status

writeHost標籤、readHost標籤:

  • 這兩個標籤都指定後端數據庫的相關配置給mycat,用於實例化後端鏈接池。
  • 惟一不一樣的是:writeHost指定寫實例、readHost指定讀實例,組着這些讀寫實例來知足系統的要求。
  • 在一個dataHost內能夠定義多個writeHost和readHost。可是,若是writeHost指定的後端數據庫宕機,那麼這個writeHost綁定的全部readHost都將不可用。
  • 另外一方面,因爲這個writeHost宕機系統會自動的檢測到,並切換到備用的writeHost上去。

2.1.1 DataHost

DataHost 節點定義了 MyCat 要鏈接哪一個 MySQL 實例,鏈接的帳號密碼是多少。默認的 MyCat 爲咱們定義了一個名爲 localhost1 的數據服務器(DataHost),它指向了本地(localhost)3306 端口的 MySQL 服務器,對應 MySQL 服務器的帳號是 root,密碼是 123456。

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

2.1.2 DataNode

DataNode 節點指定了須要鏈接的具體數據庫名稱,其使用一個 dataHost 屬性指定該數據庫位於哪一個數據庫實例上。默認的 MyCat 爲咱們建立了三個數據節點(DataNode),dn1 數據節點對應 localhost1 數據服務器上的 db1 數據庫,dn2 數據節點對應 localhost1 數據服務器上的 db2 數據庫,dn1 數據節點對應 localhost1 數據服務器上的 db3 數據庫。

<dataNode name="dn1" dataHost="localhost1" database="db1" />
<dataNode name="dn2" dataHost="localhost1" database="db2" />
<dataNode name="dn3" dataHost="localhost1" database="db3" />

2.1.3 Schema

Schema 節點定義了 MyCat 的全部邏輯數據庫,Table 節點定義了 MyCat 的全部邏輯表。默認的 MyCat 爲咱們定義了一個名爲 TESTDB 的邏輯數據庫,在這個邏輯數據庫下又定義了名爲 travaelrecord、company 等 6 個邏輯表。

<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" />
    ……
</schema>
3、rule.xml

rule.xml 定義了邏輯表使用哪一個字段進行拆分,使用什麼拆分算法進行拆分。rule.xml 中有兩個配置節點,分別是:TableRule 和 Function 配置節點。

TableRule 配置節點定義了邏輯表的拆分信息,例如使用哪一個字段進行拆分,使用什麼拆分算法。默認的 MyCat 爲咱們配置了一個名爲 rule2 的表拆分規則,表示根據 user_id 字段進行拆分,拆分算法是 func1。

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

Function 配置節點則定義了具體的拆分算法。例如使用對 1000 取餘的拆分算法,對 100 取餘的拆分算分等等。默認的 MyCat 爲咱們定義了一個名爲 func1 的拆分算法,這個拆分算法定義在 o.mycat.route.function.PartitionByLong 類中,而且還傳入了兩個參數值。

<function name="func1" class="io.mycat.route.function.PartitionByLong">
    <property name="partitionCount">8</property>
    <property name="partitionLength">128</property>
</function>
應用場景

Mycat讀寫分離(負載均衡)、主從自動切換

Mycat讀寫分離(負載均衡)、主從自動切換
主要使用mycay的特性:

  • 讀寫分離支持
  • 高可用

大多數讀寫分離的案例是同時支持高可用性的,即Mycat+MySQL主從複製的集羣,並開啓Mycat的讀寫分離功能,這種場景需求下,Mycat是最爲簡單而且功能最爲豐富的一類Proxy,正常狀況下,配置文件也最爲簡單,不用每一個表配置,只須要在schema.xml中的元素上增長dataNode=「defaultDN」屬性,並配置此dataNode對應的真實物理數據庫的database,而後dataHost開啓讀寫分離功能便可。

修改mycat的schema.xml:

  • balance爲1:讓所有的readHost及備用的writeHost參與select的負載均衡。
  • switchType爲2:基於MySQL主從同步的狀態決定是否切換。
  • heartbeat:主從切換的心跳語句必須爲show slave status。

僅僅進行讀寫分離的schema.xml配置(備份原來的schema.xml文件,清空,直接複製下面內容):不想要自動切換功能,即MySQL寫節點宕機後不自動切換到備用節點:

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
 
        <schema name="mycat" checkSQLschema="false" sqlMaxLimit="100" dataNode="haha">
        </schema>
         
<dataNode name="haha" dataHost="Mycat-node" database="kevin" />
 
    <dataHost name="Mycat-node" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
        <heartbeat>show slave status</heartbeat>
        <writeHost host="Mysql-node1" url="192.168.10.205:3306" user="root" password="123456">
             <readHost host="Mysql-node2" url="192.168.10.206:3306" user="root" password="123456">
             </readHost>
        </writeHost>
    </dataHost>
 
</mycat:schema>

實現主從自動切換的schema.xml配置:即MySQL寫節點宕機後自動切換到備用節點(也就是把從機也配置成writeHosts):

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
 
        <schema name="mycat" checkSQLschema="false" sqlMaxLimit="100" dataNode="haha">
        </schema>
         
<dataNode name="haha" dataHost="Mycat-node" database="kevin" />
 
    <dataHost name="Mycat-node" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
        <heartbeat>show slave status</heartbeat>
        <writeHost host="Mysql-node1" url="192.168.10.205:3306" user="root" password="123456">
             <readHost host="Mysql-node2" url="192.168.10.206:3306" user="root" password="123456">
             </readHost>
        </writeHost>
        <writeHost host="Mysql-node2" url="192.168.10.206:3306" user="root" password="123456">
        </writeHost>
    </dataHost>
 
</mycat:schema>

上面配置中,balance改成1,表示讀寫分離。
以上配置達到的效果就是192.168.10.205爲主庫,192.168.10.206爲從庫。
注意:要保證192.168.10.205和192.168.10.206機器能使用root/123456權限成功登陸mysql數據庫。同時,也必定要受權mycat機器能使用root/123456權限成功登陸這兩臺機器的mysql數據庫!!這很重要,不然會致使登陸mycat後,對庫和表操做失敗!

一主一從結構是最簡單的配置。
MyCat支持雙主多從,若是有N個主,那麼就配置N個writeHost兄弟節點;若是有M個從節點,那麼就配置M個readHost節點便可。
也能夠有多臺MySQL服務器,或者SQL Server、Oracle等,配置多個dataHost節點就能夠。

須要注意的是:
Mycat主從分離只是在讀的時候作了處理,寫入數據的時候,只會寫入到writehost,須要經過mycat的主從複製將數據複製到readhost!這個問題須要弄明白!!
若是沒有提早作mysql主從複製,會發現Mycat讀寫分離配置後,數據寫入writehost後,readhost一直沒有數據!由於Mycat就沒有實現主從複製的功能,畢竟數據庫自己自帶的這個功能纔是最高效穩定的。

特別注意:

1)本案例採用的一主一從模式的兩個mysql實例,而且針對單一的數據庫名進行測試;大多數mycat使用場景都是在多主多從模式並針對多個庫進行的。
2)要想登陸Mycat後看到mysql的真實數據庫的表內容,須要在schema.xml文件中指明database,其中dataNote和dataHost名稱能夠自定義,database名稱要是mysql上的庫名。
3)若是針對的是mysql的多個庫,好比mysql的真實庫名是kevin、grace、shanshan,那麼schema.xml文件裏應該指明多個庫名,如:
       <schema name="mycat" checkSQLschema="false" sqlMaxLimit="100" dataNode="haha,heihei,hengheng">
       </schema>
   <dataNode name="haha" dataHost="Mycat-node" database="kevin" />
   <dataNode name="heihei" dataHost="Mycat-node" database="grace" />
   <dataNode name="hengheng" dataHost="Mycat-node" database="shanshan" />
   ........
4)主從自動切換配置後,第一個writeHost故障後,會自動切換到第二個,第二個故障後自動切換到第三個;
   若是當是13從模式,能夠把第1個從節點配置爲writeHost 2,第2個和第3個從節點則配置爲writeHost 1的readHost;
相關文章
相關標籤/搜索