Mycat 核心配置詳解

先上官方文檔:


常用配置文件間的關係

Mycat 核心配置詳解

由上圖可以看到 Mycat 的核心配置文件均採用xml格式,這幾個配置文件的用途如下:

  • server.xml:用於配置系統參數、用戶信息、訪問權限及SQL防火牆和SQL攔截功能等
  • schema.xml:用於配置邏輯庫、邏輯表相關信息
  • rule.xml:如果使用了水平切分,就需要使用該文件配置切分規則
  • log4j2.xml:Mycat日誌相關的配置,例如日誌輸出格式、日誌級別等

應用連接Mycat服務時,Mycat首先會通過server.xml中的配置信息進行用戶認證。用戶通過驗證後,所看到的邏輯庫、邏輯表都是schema.xml中所配置的。當使用了水平切分時,Mycat會通過rule.xml裏配置的規則來定位具體的物理數據庫位置,從而完成寫入/讀取數據。


server.xml 配置詳解

1、system 標籤

用於配置 Mycat 的系統參數,其格式如下:

<system>
    <!-- ${key}表示配置屬性的名稱,${value}表示該配置屬性的值 -->
    <property name="${key}">${value}</property>
</system>

配置 Mycat 服務端口示例:

<system>
    <property name="serverPort">3306</property>
</system>

常見的系統參數舉例:

<system>
    <!-- mycat 服務連接端口 -->
    <property name="serverPort">8066</property>
    <!-- mycat 服務管理端口 -->
    <property name="managerPort">9066</property>
    <!-- mycat 服務監聽的ip -->
    <property name="bindIp">0.0.0.0</property>
    <!-- 0爲需要密碼登陸、1爲不需要密碼登陸;默認爲0,設置爲1則需要指定默認賬戶-->
    <property name="nonePasswordLogin">0</property>
    <!-- 前端連接的寫隊列大小 -->
    <property name="frontWriteQueueSize">2048</property>
    <!-- 設置字符集編碼 -->
    <property name="charset">utf8</property>
    <!-- mycat 的進程數量 -->
    <property name="processors">8</property>
    <!-- 閒置連接超時時間,單位:毫秒 -->
    <property name="idleTimeout">1800000</property>
    <!-- 默認最大返回的數據集大小 -->
    <property name="defaultMaxLimit">100</property>
    <!-- 允許的最大包大小 -->
    <property name="maxPacketSize">104857600</property>
    <!-- 0遇上沒有實現的報文(Unknown command:),就會報錯、1爲忽略該報文,返回ok報文。
在某些mysql客戶端存在客戶端已經登錄的時候還會繼續發送登錄報文,mycat會報錯,該設置可以繞過這個錯誤-->
    <property name="ignoreUnknownCommand">0</property>
    <property name="useHandshakeV10">1</property>
    <property name="removeGraveAccent">1</property>
    <!-- 1爲開啓實時統計、0爲關閉 -->
    <property name="useSqlStat">0</property>
    <!-- 1爲開啓全加班一致性檢測、0爲關閉 -->
    <property name="useGlobleTableCheck">0</property>
    <!-- SQL 執行超時 單位:秒-->
    <property name="sqlExecuteTimeout">300</property>
    <property name="sequnceHandlerType">1</property>
    <!--必須帶有MYCATSEQ_或者 mycatseq_進入序列匹配流程 注意MYCATSEQ_有空格的情況-->
    <property name="sequnceHandlerPattern">(?:(\s*next\s+value\s+for\s*MYCATSEQ_(\w+))(,|\)|\s)*)+</property>
    <!-- 子查詢中存在關聯查詢的情況下,檢查關聯字段中是否有分片字段 .默認 false -->
    <property name="subqueryRelationshipCheck">false</property>
    <property name="sequenceHanlderClass">io.mycat.route.sequence.handler.HttpIncrSequenceHandler</property>
    <!--默認爲type 0: DirectByteBufferPool | type 1 ByteBufferArena | type 2 NettyBufferPool -->
    <property name="processorBufferPoolType">0</property>
    <!--分佈式事務開關,0爲不過濾分佈式事務,1爲過濾分佈式事務(如果分佈式事務內只涉及全局表,則不過濾),2爲不過濾分佈式事務,但是記錄分佈式事務日誌-->
    <property name="handleDistributedTransactions">0</property>
    <!-- off heap for merge/order/group/limit  1開啓;0關閉 -->
    <property name="useOffHeapForMerge">0</property>
    <!--是否採用zookeeper協調切換  -->
    <property name="useZKSwitch">false</property>
    <!--如果爲 true的話 嚴格遵守隔離級別,不會在僅僅只有select語句的時候在事務中切換連接-->
    <property name="strictTxIsolation">false</property>
    <!-- Mycat連接數據庫時使用的隔離級別
         1 - 讀未提交
         2 - 讀已提交
         3 - 可重複讀
         4 - 串行化
     -->
    <property name="txIsolation">2</property>
    <property name="useZKSwitch">true</property>
    <!--如果爲0的話,涉及多個DataNode的catlet任務不會跨線程執行-->
    <property name="parallExecute">0</property>
</system>

2、user 標籤

用於配置Mycat的訪問用戶及權限,其格式如下:

<user name=${username}>
    <property name="${key}">${value}</property>
    ...
</user>

配置示例:

<!-- 用戶名 -->
<user name="mall">
    <!-- 密碼 -->
    <property name="password">123456</property>
    <!-- 允許該用戶訪問的邏輯庫 -->
    <property name="schemas">mall_db</property>
    <!-- 可配置多個允許訪問的邏輯庫,使用逗號分隔 -->
    <!-- <property name="schemas">mall_db,db1,db2</property>  -->
    <!-- 是否只讀 -->
    <property name="readOnly">false</property>
</user>

除了配置對庫的權限可能還不夠,有時候我們需要配置用戶對某些表的訪問權限。如下示例:

<!-- 用戶名 -->
<user name="mall">
    <!-- 密碼 -->
    <property name="password">123456</property>
    <!-- 允許該用戶訪問的邏輯庫 -->
    <property name="schemas">mall_db,db1,db2</property>

    <!-- 表級 DML 權限配置,check屬性表示是否開啓該配置 -->
    <privileges check="true">
        <!-- 特別權限應用的邏輯庫 -->
        <schema name="mall_db" dml="0110">
            <!-- 
                配置用戶對該表的訪問權限,dml屬性用於指定權限位,
                如果table標籤沒有配置該屬性的話,默認取schema標籤的dml屬性值,
                剩餘沒有配置的其他表默認也是取schema標籤的dml屬性值
            -->
            <table name="user_table" dml="0000"></table>
            <table name="order_table" dml="1111"></table>
        </schema>
    </privileges>
</user>

dml屬性配置的數字是權限位,分別對應着insert,update,select,delete四種權限。例如,當dml的值爲0110時,表示擁有updateselect權限,不具有insertdelete權限。所以權限位爲1時代表擁有對應的操作權限,爲0時代表沒有該操作權限。

在該示例中,mall用戶對:

  • user_table表不具有任何操作權限
  • order_table表擁有所有操作權限
  • 其他表只擁有updateselect權限

加密明文密碼

以上配置用戶的示例中,密碼都是以明文的形式寫在配置文件中。但用戶的密碼是安全敏感的,一般不會直接在配置文件中寫明文密碼,而是寫一個加密過後的密碼。否則只要擁有查看server.xml文件的權限,就能輕易獲取到各個用戶的密碼,這是非常不安全的。

因此,Mycat 提供了一個工具用於加密明文密碼,該工具在一個jar包內,可使用如下命令對密碼進行加密:

[root@txy-server /usr/local/mycat]# java -cp lib/Mycat-server-1.6.7.4-release.jar io.mycat.util.DecryptUtil 0:root:123456

參數說明:

  • 0:代表的是mycat用戶登錄密碼加密(1 則是dataHost加密)
  • root:用戶名
  • 123456:明文密碼

執行成功後,會得到一個加密後的字符串:

GO0bnFVWrAuFgr1JMuMZkvfDNyTpoiGU7n/Wlsa151CirHQnANVk3NzE3FErx8v6pAcO0ctX3xFecmSr+976QA==

複製該字符串,替換配置文件中的明文密碼,如下示例:

<user name="root" defaultAccount="true">
        <!-- 需要聲明使用的是加密後的密碼 -->
        <property name="usingDecrypt">1</property>
        <property name="password">GO0bnFVWrAuFgr1JMuMZkvfDNyTpoiGU7n/Wlsa151CirHQnANVk3NzE3FErx8v6pAcO0ctX3xFecmSr+976QA==</property>
        ...
</user>

log4j2.xml 配置文件

我們都知道Mycat是使用Java進行開發的,所以其日誌框架也是使用Java生態圈內的log4j2。Mycat日誌相關的配置都在 log4j2.xml 文件中,本小節將介紹一些常用的配置項。

1、Pattern 標籤

用於配置 Mycat 日誌輸出格式,默認如下:

<PatternLayout>
    <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %5p [%t] (%l) - %m%n</Pattern>
</PatternLayout>
  • %d{yyyy-MM-dd HH:mm:ss.SSS}:日誌的時間格式
  • %5p:輸出的日誌的級別
  • %t:輸出日誌的線程名稱
  • %l:日誌輸出語句所在的代碼位置
  • %m:輸出代碼中指定的日誌內容
  • %n:輸出一個換行符

更多Pattern取值詳見官方文檔

這裏截取了一段 Mycat 的日誌內容,可以看到與Pattern是一一對應上的:

2020-01-09 15:22:57.960  INFO [Timer1] (io.mycat.backend.datasource.PhysicalDatasource.getConnection(PhysicalDatasource.java:564)) - no ilde connection in pool 1838161857 ,create new connection for hostM1 of schema db3 totalConnectionCount: 0 increamentCount: 1

2、level 屬性

用於配置 Mycat 的日誌輸出級別,默認爲info級別:

<asyncRoot level="info" includeLocation="true">

關於log4j2的內建日誌級別詳見官方文檔


rule.xml 文件詳解

當我們需要通過Mycat實現數據分片時就得用到rule.xml配置文件,該文件用於配置:

  • 水平分片的分片規則
  • 分片規則所對應的分片函數

這是一個分片規則的配置示例:

<!-- name屬性指定分片規則的名稱,必須在 rule.xml 文件中是唯一的 -->
<tableRule name="hash-mod-4_id">
    <rule>
        <!-- 指定使用表中的哪個列進行分片 -->
        <columns>id</columns>
        <!-- 指定表的分片算法,取值爲<function>標籤的name屬性 -->
        <algorithm>hash-mod-4</algorithm>
    </rule>
</tableRule>
  • Tips:分片規則的名稱儘量具有實際意義,命名格式可以參考:{分片算法名稱}-{分片數量}_{分片列};上面的示例就是採用的這種命名格式

上面示例中所提到的&lt;function&gt;標籤是用於配置表的分片算法或者說分片函數,如下示例:

<!-- name屬性指定分片算法的名稱,同樣需要是唯一的;class屬性指定該算法的具體實現類 -->
<function name="hash-mod-4"
          class="io.mycat.route.function.PartitionByHashMod">
    <!-- 要分片的數據庫節點數量,必須指定,否則沒法分片 -->
    <property name="count">4</property>
</function>

每個分片算法的所需參數可能不一樣,所以property標籤是可以有多個的,其屬性也因具體的分片算法而異。如下示例:

<function name="partbyday"
          class="io.mycat.route.function.PartitionByDate">
    <property name="dateFormat">yyyy-MM-dd</property>
    <property name="sNaturalDay">0</property>
    <property name="sBeginDate">2014-01-01</property>
    <property name="sEndDate">2014-01-31</property>
    <property name="sPartionDay">10</property>
</function>

常用的幾個分片算法

Mycat 內置了非常多的分片算法,並且我們也可以針對實際情況自行開發屬於自己的分片算法。我們來看看常用分片算法都有哪些:

  • PartitionByMod:簡單取模,直接通過列值進行取模得出分片位置
  • PartitionByHashMod:哈希取模,先將列值進行hash運算之後再取模得出分片位置
  • PartitionByFileMap:分片枚舉,根據枚舉值對數據進行分片,例如在異地多活的場景中通過地區id進行數據分片的場景
  • PartitionByPrefixPattern:字符串範圍取模,根據長字符串的前面幾位進行取模分片

PartitionByMod

簡單取模分片算法的工作原理:
Mycat 核心配置詳解

  • 在圖中有兩個數據庫,每個數據庫就是一個分片,所以使用分片列的值對2進行取模,就能得出分片位置

配置示例:

<tableRule name="mod-long-2_id">
    <rule>
        <columns>id</columns>
        <algorithm>mod-long</algorithm>
    </rule>
</tableRule>
<function name="mod-long" 
          class="io.mycat.route.function.PartitionByMod">
    <!-- 取模的基數,也就是分片數量 -->
    <property name="count">2</property>
</function>

總結:

  • 簡單,數據分佈均勻,適用於整數類型的列,不能用於非整型的列
  • 計算方式:分片列 % 分片基數
  • 實現類的全名:io.mycat.route.function.PartitionByMod

PartitionByHashMod

當需要取模的列爲非整型時,就可以使用哈希取模分片算法。其工作原理如下圖:
Mycat 核心配置詳解

  • 對分片列的值進行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>

總結:

  • 可以用於多種數據類型的分片列,如字符串、日期等
  • 分片沒有簡單取模算法均勻,因爲存在hash重複的情況。兩個相同的數據進行hash運算後的數值是一樣的,那麼取模後得出來的分片位置也就一樣
  • 計算方式:hash(分片列) % 分片基數
  • 實現類的全名:io.mycat.route.function.PartitionByHashMod

PartitionByFileMap

前兩種分片算法都是通過算法本身去計算出分片位置,是無法人工控制的。如果需要人工控制分片位置時,就可以使用到分片枚舉算法。該算法使得我們可以指定一些枚舉值來對分片位置進行控制,其實也就相當於是人工指定了某些數據應該到哪個分片。

例如,某張表中有個存儲用戶所在區域id的列,我們希望將區域id與數據庫所在的區域進行映射,以實現區域id爲1的數據被分片到區域1數據庫中,區域id爲2的數據被分片到區域2數據庫中,以此類推。在這種場景下就可以使用分片枚舉算法,其工作原理如下圖:
Mycat 核心配置詳解

  • 通過mapFile配置一個分片關係映射,其格式爲key-value,key爲枚舉,value爲數據節點的索引。圖中的枚舉就是area_id,一個area_id對應着一個數據節點。沒有配置映射關係的area_id則會被分片到DEFAULT_NODE所對應的數據節點。

配置示例:

<tableRule name="hash-int_area_id">
    <rule>
        <columns>area_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>
  • Tips:數據節點的索引是從0開始的,在編輯mapFile時需要注意這一點

總結:

  • 可以根據枚舉值指定數據存儲的位置
  • 需要在$MYCAT_HOME/conf目錄下增加mapFile來配置枚舉值同節點的映射關係
  • 計算方式:hash(分片列) % 分片基數
  • 實現類的全名:io.mycat.route.function.PartitionByFileMap

PartitionByPrefixPattern

以上所介紹到的分片算法都是根據列進行分片的,在實際工作中我們可能會遇到這樣一個需求:需要通過字符串的前幾位或後幾位進行分片。例如,通過訂單號的前五位進行分片計算,或按用戶的姓氏進行分片。在這種場景下,就可以使用字符串範圍取模分片算法。

例如,需要對ABCDEFGHI這個字符串的前三位進行分片計算,其計算過程如下圖:
Mycat 核心配置詳解

  • 對指定的字符串範圍分別進行ascii碼計算並求和,然後對配置的求模基數進行取模計算,最後根據mapFile裏配置的取值範圍與數據節點索引的映射關係得出分片的數據節點。因此,mapFile需要配置所有可能的取值範圍,否則找不到對應的數據節點就會報錯。

工作原理:
Mycat 核心配置詳解

配置示例:

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

總結:

  • 可以根據指定字符串的前N個字符確定存儲位置
  • 需要在$MYCAT_HOME/conf目錄下增加mapFile來配置取模範圍同節點的映射關係
  • 實現類的全名:io.mycat.route.function.PartitionByPrefixPattern

schema.xml 文件

用途:

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

schema 標籤

schema 標籤用於定義邏輯庫,示例:

<schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100" randomDataNode="dn1">
    ...
</schema>
  • checkSQLschema屬性判斷是否檢查發給Mycat的SQL是否含有庫名,爲true時會將SQL中的庫名刪除掉
  • name屬性定義邏輯庫的名字,必須唯一不能重複
  • sqlMaxLimit屬性用於限制返回結果集的行數,值爲-1時表示關閉該限制。如果沒有開啓限制則默認取server.xml裏配置的限制
  • randomDataNode屬性定義將一些隨機語句發送到該數據節點中

table 標籤

使用了schema 標籤定義邏輯庫之後,還需要使用table 標籤定義邏輯表。示例:

<schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100" randomDataNode="dn1">
    <!-- 多表定義 -->
    <table name="travelrecord,address" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" splitTableNames ="true"/>
    <!-- 單表定義 -->
    <table name="oc_call" primaryKey="id" dataNode="dn1$0-743" rule="latest-month-calldate"/>
</schema>
  • name 屬性定義邏輯表的名字,必須唯一不能重複且需要與數據庫中的物理表名一致。使用逗號分割配置多個表,即多個表使用這個配置
  • primaryKey 屬性指定邏輯表中的主鍵,也是需要與物理表的主鍵一致
  • dataNode 屬性指定物理表所在數據節點的名稱,配置多個數據節點時需按索引順序並使用逗號分隔,或指定一個索引範圍:dn1$0-743。注意數據節點定義之後,順序不能再發生改變,否則會導致數據混亂
  • rule 屬性用於指定分片規則名稱,對應rule.xml中的&lt;tableRule&gt;標籤的name屬性,如無需分片可以不指定
  • splitTableNames 屬性定義是否允許多個表的定義

dataNode 標籤

dataNode 標籤用於定義數據節點,數據節點指向的是存儲邏輯表的物理數據庫。示例:

<dataNode name="dn1" dataHost="localhost1" database="db1" />
<dataNode name="dn2" dataHost="localhost1" database="db2" />
<dataNode name="dn3" dataHost="localhost1" database="db3" />
<!-- 可以配置一個範圍 -->
<dataNode name="dn1$0-743" dataHost="localhost1" database="db$0-743"/>
  • name 屬性定義數據節點的名稱,必須唯一
  • dataHost 屬性指定分片所在的物理主機
  • database 屬性指定物理數據庫的名稱

dataHost 標籤

dataHost 標籤用於定義後端物理數據庫主機信息,該標籤內有兩個子標籤,可以定義一組數據庫主機信息。例如,定義一組主從集羣結構的數據庫主機信息:
Mycat 核心配置詳解

  • writeHost標籤配置寫實例,即主從中的master節點
  • readHost 標籤配置讀實例,即主從中的salve節點
  • readHostwriteHost的子標籤,與writeHost有綁定關係

在一個dataHost內可以定義多個writeHostreadHost。但是,如果writeHost指定的後端數據庫宕機,那麼這個writeHost綁定的所有readHost都將不可用。另一方面,由於這個writeHost宕機系統會自動的檢測到,並切換到備用的writeHost上去。

配置示例:

<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="localhost" url="localhost:3306" user="root"
               password="123456">
        <readHost host="localhost" url="localhost:3306" 
                  user="root" password="123456"></readHost>
    </writeHost>
</dataHost>

dataHost 標籤屬性

  • name 屬性用於定義主機名稱,必須唯一
  • maxCon 屬性指定每個讀/寫實例連接池的最大連接數。也就是說,標籤內嵌套的writeHostreadHost 標籤都會使用這個屬性的值來實例化出連接池的最大連接數
  • minCon 屬性指定每個讀寫實例連接池的最小連接數,即初始化連接池的大小
  • dbType 屬性指定後端連接的數據庫類型,目前支持二進制的mysql協議,還有其他使用JDBC連接的數據庫
  • dbDriver 屬性指定連接後端數據庫使用的驅動,目前可選的值有nativeJDBC
  • slaveThreshold 屬性用於定義主從複製延時閾值,當Seconds_Behind_Master &gt; slaveThreshold時,讀寫分離篩選器會過濾掉此Slave機器,防止讀到很久之前的舊數據
  • balance 屬性指定讀寫分離的負載均衡類型,目前的取值有4 種:
    • 0:不開啓讀寫分離機制,所有讀操作都發送到當前可用的 writeHost
    • 1:全部的readHost與stand by writeHost參與select語句的負載均衡
    • 2:所有讀操作都隨機在writeHostreadhost 上分發
    • 3:所有讀請求隨機分發到 wiriterHost 對應的readhost 執行。即 writerHost 不負擔讀壓力,全部讀請求由 readhost 執行。注意該取值只在1.4及其以後版本有,1.3沒有
  • writeType 屬性指定寫實例的負載均衡類型,目前的取值有4 種:
    • -1:表示不自動切換
    • 0:所有寫操作發送到配置的第一個writeHost,第一個掛了切到還生存的第二個writeHost。重新啓動後以切換後的爲準,切換記錄在配置文件中:dnindex.properties
    • 1:所有寫操作都隨機的發送到配置的writeHost,1.5 以後廢棄不推薦使用
    • 2:基於MySQL主從同步的狀態決定是否切換(1.4 新增)
  • switchType 屬性用於指定主從切換的方式:
    • -1:表示不自動切換
    • 1:默認值,自動切換
    • 2:基於MySQL主從同步的狀態決定是否切換,心跳檢測語句爲:show slave status
    • 3:基於MySQL galary cluster的切換機制(適合集羣,1.4.1新增),心跳檢測語句爲show status like 'wsrep%'

另外,slaveThreshold 屬性是用於配合writeType屬性實現根據主從延時來進行主從切換的,其官方文檔描述如下:

1.4 開始支持MySQL主從複製狀態綁定的讀寫分離機制,讓讀更加安全可靠,配置如下:MyCAT 心跳檢查語句配置爲show slave statusdataHost 上定義兩個新屬性:switchType="2"slaveThreshold="100",此時意味着開啓MySQL主從複製狀態綁定的讀寫分離與切換機制,Mycat心跳機制通過檢測show slave status 中的"Seconds_Behind_Master"、"Slave_IO_Running"、"Slave_SQL_Running" 三個字段來確定當前主從同步的狀態以及Seconds_Behind_Master 主從複製時延,當Seconds_Behind_Master &gt; slaveThreshold時,讀寫分離篩選器會過濾掉此Slave機器,防止讀到很久之前的舊數據,而當主節點宕機後,切換邏輯會檢查Slave上的Seconds_Behind_Master是否爲0,爲0時則表示主從同步,可以安全切換,否則不會切換。


heartbeat 標籤

heartbeat 標籤內指明用於和後端數據庫進行心跳檢查的語句。例如,MySQL可以使用select user(),Oracle可以使用select 1 from dual 等。

這個標籤還有一個connectionInitSql屬性,主要是當使用Oracla數據庫時,需要執行的初始化SQL語句就這個放到這裏面來。例如:alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss'

注:如果是配置主從切換的語句在1.4之後必須是:show slave status


writehost 標籤、readHost標籤

這兩個標籤都用於配置一組主從數據庫的相關信息,Mycat用這兩個標籤配置的連接信息實例化後端連接池。唯一不同的是,writeHost 配置寫實例(master)、readHost 配置讀實例(salve),並且readHostwriteHost 的子標籤。通過這兩個標籤可以組合讀/寫實例以滿足系統的要求。

在一個dataHost內可以定義多個writeHostreadHost。但是,如果writeHost指定的後端數據庫宕機,那麼這個writeHost綁定的所有readHost都將不可用。另一方面,當一個writeHost宕機時系統會自動檢測到,並切換到備用的writeHost 上去。


writehost 標籤及readHost標籤的屬性

這兩個標籤的屬性相同,這裏就一起介紹:

  • host 屬性用於標識不同實例名稱,一般writeHost名稱使用M1作爲後綴,readHost則使用S1作爲後綴
  • url 屬性用於配置數據庫的連接地址,如果是使用nativedbDriver,則一般爲address:port這種形式。用JDBC或其他的dbDriver,則需要特殊指定。例如,當使用JDBC 時則可以這麼寫:jdbc:mysql://localhost:3306/
  • user 屬性配置數據庫用戶名
  • password 屬性配置數據庫密碼
  • weight 屬性配置某個數據庫在 readhost 中作爲讀節點的權重
  • usingDecrypt 屬性指定是否對密碼加密,默認爲0, 若需要開啓則配置爲1

schema.xml 配置文件示例

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

    <schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100" randomDataNode="dn1">
        <table name="travelrecord,address" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" splitTableNames="true"/>
        <!-- <table name="order" primaryKey="id" dataNode="dn1$0-743" rule="auto-sharding-long" splitTableNames="true"/> -->
    </schema>

    <dataNode name="dn1" dataHost="localhost1" database="db1"/>
    <dataNode name="dn2" dataHost="localhost1" database="db2"/>
    <dataNode name="dn3" dataHost="localhost1" database="db3"/>
    <!-- <dataNode name="dn1$0-743" dataHost="localhost1" database="db$0-743"/> -->

    <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="hostS1" url="localhost:3306" user="root" password="123456"/>
        </writeHost>
        <writeHost host="hostM2" url="localhost:3306" user="root" password="123456"/>
    </dataHost>
</mycat:schema>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章