mycat配置文件的詳細(xì)介紹

這篇文章主要為大家分享mycat的配置文件。文中還介紹了mycat常用的幾個(gè)分片算法的計(jì)算過程和使用方法,希望大家通過這篇文章能有所收獲。

10年積累的網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站設(shè)計(jì)后付款的網(wǎng)站建設(shè)流程,更有平南免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。


常用配置文件間的關(guān)系

mycat配置文件的詳細(xì)介紹

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

  • server.xml:用于配置系統(tǒng)參數(shù)、用戶信息、訪問權(quán)限及SQL防火墻和SQL攔截功能等
  • schema.xml:用于配置邏輯庫、邏輯表相關(guān)信息
  • rule.xml:如果使用了水平切分,就需要使用該文件配置切分規(guī)則
  • log4j2.xml:Mycat日志相關(guān)的配置,例如日志輸出格式、日志級(jí)別等

應(yīng)用連接Mycat服務(wù)時(shí),Mycat首先會(huì)通過server.xml中的配置信息進(jìn)行用戶認(rèn)證。用戶通過驗(yàn)證后,所看到的邏輯庫、邏輯表都是schema.xml中所配置的。當(dāng)使用了水平切分時(shí),Mycat會(huì)通過rule.xml里配置的規(guī)則來定位具體的物理數(shù)據(jù)庫位置,從而完成寫入/讀取數(shù)據(jù)。


server.xml 配置詳解

1、system 標(biāo)簽

用于配置 Mycat 的系統(tǒng)參數(shù),其格式如下:

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

配置 Mycat 服務(wù)端口示例:

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

常見的系統(tǒng)參數(shù)舉例:

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

2、user 標(biāo)簽

用于配置Mycat的訪問用戶及權(quán)限,其格式如下:

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

配置示例:

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

除了配置對(duì)庫的權(quán)限可能還不夠,有時(shí)候我們需要配置用戶對(duì)某些表的訪問權(quán)限。如下示例:

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

    <!-- 表級(jí) DML 權(quán)限配置,check屬性表示是否開啟該配置 -->
    <privileges check="true">
        <!-- 特別權(quán)限應(yīng)用的邏輯庫 -->
        <schema name="mall_db" dml="0110">
            <!-- 
                配置用戶對(duì)該表的訪問權(quán)限,dml屬性用于指定權(quán)限位,
                如果table標(biāo)簽沒有配置該屬性的話,默認(rèn)取schema標(biāo)簽的dml屬性值,
                剩余沒有配置的其他表默認(rèn)也是取schema標(biāo)簽的dml屬性值
            -->
            <table name="user_table" dml="0000"></table>
            <table name="order_table" dml="1111"></table>
        </schema>
    </privileges>
</user>

dml屬性配置的數(shù)字是權(quán)限位,分別對(duì)應(yīng)著insert,update,select,delete四種權(quán)限。例如,當(dāng)dml的值為0110時(shí),表示擁有updateselect權(quán)限,不具有insertdelete權(quán)限。所以權(quán)限位為1時(shí)代表擁有對(duì)應(yīng)的操作權(quán)限,為0時(shí)代表沒有該操作權(quán)限。

在該示例中,mall用戶對(duì):

  • user_table表不具有任何操作權(quán)限
  • order_table表擁有所有操作權(quán)限
  • 其他表只擁有updateselect權(quán)限
加密明文密碼

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

因此,Mycat 提供了一個(gè)工具用于加密明文密碼,該工具在一個(gè)jar包內(nèi),可使用如下命令對(duì)密碼進(jìn)行加密:

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

參數(shù)說明:

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

執(zhí)行成功后,會(huì)得到一個(gè)加密后的字符串:

GO0bnFVWrAuFgr1JMuMZkvfDNyTpoiGU7n/Wlsa151CirHQnANVk3NzE3FErx8v6pAcO0ctX3xFecmSr+976QA==

復(fù)制該字符串,替換配置文件中的明文密碼,如下示例:

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

log4j2.xml 配置文件

我們都知道Mycat是使用Java進(jìn)行開發(fā)的,所以其日志框架也是使用Java生態(tài)圈內(nèi)的log4j2。Mycat日志相關(guān)的配置都在 log4j2.xml 文件中,本小節(jié)將介紹一些常用的配置項(xiàng)。

1、Pattern 標(biāo)簽

用于配置 Mycat 日志輸出格式,默認(rèn)如下:

<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}:日志的時(shí)間格式
  • %5p:輸出的日志的級(jí)別
  • %t:輸出日志的線程名稱
  • %l:日志輸出語句所在的代碼位置
  • %m:輸出代碼中指定的日志內(nèi)容
  • %n:輸出一個(gè)換行符

更多Pattern取值詳見官方文檔

這里截取了一段 Mycat 的日志內(nèi)容,可以看到與Pattern是一一對(duì)應(yīng)上的:

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 的日志輸出級(jí)別,默認(rèn)為info級(jí)別:

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

關(guān)于log4j2的內(nèi)建日志級(jí)別詳見官方文檔


rule.xml 文件詳解

當(dāng)我們需要通過Mycat實(shí)現(xiàn)數(shù)據(jù)分片時(shí)就得用到rule.xml配置文件,該文件用于配置:

  • 水平分片的分片規(guī)則
  • 分片規(guī)則所對(duì)應(yīng)的分片函數(shù)

這是一個(gè)分片規(guī)則的配置示例:

<!-- name屬性指定分片規(guī)則的名稱,必須在 rule.xml 文件中是唯一的 -->
<tableRule name="hash-mod-4_id">
    <rule>
        <!-- 指定使用表中的哪個(gè)列進(jìn)行分片 -->
        <columns>id</columns>
        <!-- 指定表的分片算法,取值為<function>標(biāo)簽的name屬性 -->
        <algorithm>hash-mod-4</algorithm>
    </rule>
</tableRule>
  • Tips:分片規(guī)則的名稱盡量具有實(shí)際意義,命名格式可以參考:{分片算法名稱}-{分片數(shù)量}_{分片列};上面的示例就是采用的這種命名格式

上面示例中所提到的&lt;function&gt;標(biāo)簽是用于配置表的分片算法或者說分片函數(shù),如下示例:

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

每個(gè)分片算法的所需參數(shù)可能不一樣,所以property標(biāo)簽是可以有多個(gè)的,其屬性也因具體的分片算法而異。如下示例:

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

常用的幾個(gè)分片算法

Mycat 內(nèi)置了非常多的分片算法,并且我們也可以針對(duì)實(shí)際情況自行開發(fā)屬于自己的分片算法。我們來看看常用分片算法都有哪些:

  • PartitionByMod:簡(jiǎn)單取模,直接通過列值進(jìn)行取模得出分片位置
  • PartitionByHashMod:哈希取模,先將列值進(jìn)行hash運(yùn)算之后再取模得出分片位置
  • PartitionByFileMap:分片枚舉,根據(jù)枚舉值對(duì)數(shù)據(jù)進(jìn)行分片,例如在異地多活的場(chǎng)景中通過地區(qū)id進(jìn)行數(shù)據(jù)分片的場(chǎng)景
  • PartitionByPrefixPattern:字符串范圍取模,根據(jù)長(zhǎng)字符串的前面幾位進(jìn)行取模分片

PartitionByMod

簡(jiǎn)單取模分片算法的工作原理:
mycat配置文件的詳細(xì)介紹

  • 在圖中有兩個(gè)數(shù)據(jù)庫,每個(gè)數(shù)據(jù)庫就是一個(gè)分片,所以使用分片列的值對(duì)2進(jìn)行取模,就能得出分片位置

配置示例:

<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">
    <!-- 取模的基數(shù),也就是分片數(shù)量 -->
    <property name="count">2</property>
</function>

總結(jié):

  • 簡(jiǎn)單,數(shù)據(jù)分布均勻,適用于整數(shù)類型的列,不能用于非整型的列
  • 計(jì)算方式:分片列 % 分片基數(shù)
  • 實(shí)現(xiàn)類的全名:io.mycat.route.function.PartitionByMod

PartitionByHashMod

當(dāng)需要取模的列為非整型時(shí),就可以使用哈希取模分片算法。其工作原理如下圖:
mycat配置文件的詳細(xì)介紹

  • 對(duì)分片列的值進(jìn)行hash運(yùn)算,得出一個(gè)整數(shù)型的數(shù)值,然后對(duì)分片數(shù)量“count”進(jìn)行取模,就可以得到分片位置

配置示例:

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

總結(jié):

  • 可以用于多種數(shù)據(jù)類型的分片列,如字符串、日期等
  • 分片沒有簡(jiǎn)單取模算法均勻,因?yàn)榇嬖趆ash重復(fù)的情況。兩個(gè)相同的數(shù)據(jù)進(jìn)行hash運(yùn)算后的數(shù)值是一樣的,那么取模后得出來的分片位置也就一樣
  • 計(jì)算方式:hash(分片列) % 分片基數(shù)
  • 實(shí)現(xiàn)類的全名:io.mycat.route.function.PartitionByHashMod

PartitionByFileMap

前兩種分片算法都是通過算法本身去計(jì)算出分片位置,是無法人工控制的。如果需要人工控制分片位置時(shí),就可以使用到分片枚舉算法。該算法使得我們可以指定一些枚舉值來對(duì)分片位置進(jìn)行控制,其實(shí)也就相當(dāng)于是人工指定了某些數(shù)據(jù)應(yīng)該到哪個(gè)分片。

例如,某張表中有個(gè)存儲(chǔ)用戶所在區(qū)域id的列,我們希望將區(qū)域id與數(shù)據(jù)庫所在的區(qū)域進(jìn)行映射,以實(shí)現(xiàn)區(qū)域id為1的數(shù)據(jù)被分片到區(qū)域1數(shù)據(jù)庫中,區(qū)域id為2的數(shù)據(jù)被分片到區(qū)域2數(shù)據(jù)庫中,以此類推。在這種場(chǎng)景下就可以使用分片枚舉算法,其工作原理如下圖:
mycat配置文件的詳細(xì)介紹

  • 通過mapFile配置一個(gè)分片關(guān)系映射,其格式為key-value,key為枚舉,value為數(shù)據(jù)節(jié)點(diǎn)的索引。圖中的枚舉就是area_id,一個(gè)area_id對(duì)應(yīng)著一個(gè)數(shù)據(jù)節(jié)點(diǎn)。沒有配置映射關(guān)系的area_id則會(huì)被分片到DEFAULT_NODE所對(duì)應(yīng)的數(shù)據(jù)節(jié)點(diǎn)。

配置示例:

<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中枚舉的數(shù)據(jù)類型,0為整型;非0則為字符串類型 -->
    <property name="type">0</property>
    <!-- 是否啟用默認(rèn)節(jié)點(diǎn),大于等于0為啟用;小于等于0為不啟用 -->
    <property name="defaultNode">0</property>
</function>
  • Tips:數(shù)據(jù)節(jié)點(diǎn)的索引是從0開始的,在編輯mapFile時(shí)需要注意這一點(diǎn)

總結(jié):

  • 可以根據(jù)枚舉值指定數(shù)據(jù)存儲(chǔ)的位置
  • 需要在$MYCAT_HOME/conf目錄下增加mapFile來配置枚舉值同節(jié)點(diǎn)的映射關(guān)系
  • 計(jì)算方式:hash(分片列) % 分片基數(shù)
  • 實(shí)現(xiàn)類的全名:io.mycat.route.function.PartitionByFileMap

PartitionByPrefixPattern

以上所介紹到的分片算法都是根據(jù)列進(jìn)行分片的,在實(shí)際工作中我們可能會(huì)遇到這樣一個(gè)需求:需要通過字符串的前幾位或后幾位進(jìn)行分片。例如,通過訂單號(hào)的前五位進(jìn)行分片計(jì)算,或按用戶的姓氏進(jìn)行分片。在這種場(chǎng)景下,就可以使用字符串范圍取模分片算法。

例如,需要對(duì)ABCDEFGHI這個(gè)字符串的前三位進(jìn)行分片計(jì)算,其計(jì)算過程如下圖:
mycat配置文件的詳細(xì)介紹

  • 對(duì)指定的字符串范圍分別進(jìn)行ascii碼計(jì)算并求和,然后對(duì)配置的求模基數(shù)進(jìn)行取模計(jì)算,最后根據(jù)mapFile里配置的取值范圍與數(shù)據(jù)節(jié)點(diǎn)索引的映射關(guān)系得出分片的數(shù)據(jù)節(jié)點(diǎn)。因此,mapFile需要配置所有可能的取值范圍,否則找不到對(duì)應(yīng)的數(shù)據(jù)節(jié)點(diǎn)就會(huì)報(bào)錯(cuò)。

工作原理:
mycat配置文件的詳細(xì)介紹

配置示例:

<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>
    <!-- 求模基數(shù) -->
    <property name="patternValue">128</property>
    <!-- 字符串范圍,這里為前兩位 -->
    <property name="prefixLength">2</property>
</function>

總結(jié):

  • 可以根據(jù)指定字符串的前N個(gè)字符確定存儲(chǔ)位置
  • 需要在$MYCAT_HOME/conf目錄下增加mapFile來配置取模范圍同節(jié)點(diǎn)的映射關(guān)系
  • 實(shí)現(xiàn)類的全名:io.mycat.route.function.PartitionByPrefixPattern

schema.xml 文件

用途:

  • 配置邏輯庫及邏輯表
  • 配置邏輯表所存儲(chǔ)的數(shù)據(jù)節(jié)點(diǎn)
  • 配置數(shù)據(jù)節(jié)點(diǎn)所對(duì)應(yīng)的物理數(shù)據(jù)庫服務(wù)器信息

schema 標(biāo)簽

schema 標(biāo)簽用于定義邏輯庫,示例:

<schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100" randomDataNode="dn1">
    ...
</schema>
  • checkSQLschema屬性判斷是否檢查發(fā)給Mycat的SQL是否含有庫名,為true時(shí)會(huì)將SQL中的庫名刪除掉
  • name屬性定義邏輯庫的名字,必須唯一不能重復(fù)
  • sqlMaxLimit屬性用于限制返回結(jié)果集的行數(shù),值為-1時(shí)表示關(guān)閉該限制。如果沒有開啟限制則默認(rèn)取server.xml里配置的限制
  • randomDataNode屬性定義將一些隨機(jī)語句發(fā)送到該數(shù)據(jù)節(jié)點(diǎn)中

table 標(biāo)簽

使用了schema 標(biāo)簽定義邏輯庫之后,還需要使用table 標(biāo)簽定義邏輯表。示例:

<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 屬性定義邏輯表的名字,必須唯一不能重復(fù)且需要與數(shù)據(jù)庫中的物理表名一致。使用逗號(hào)分割配置多個(gè)表,即多個(gè)表使用這個(gè)配置
  • primaryKey 屬性指定邏輯表中的主鍵,也是需要與物理表的主鍵一致
  • dataNode 屬性指定物理表所在數(shù)據(jù)節(jié)點(diǎn)的名稱,配置多個(gè)數(shù)據(jù)節(jié)點(diǎn)時(shí)需按索引順序并使用逗號(hào)分隔,或指定一個(gè)索引范圍:dn1$0-743。注意數(shù)據(jù)節(jié)點(diǎn)定義之后,順序不能再發(fā)生改變,否則會(huì)導(dǎo)致數(shù)據(jù)混亂
  • rule 屬性用于指定分片規(guī)則名稱,對(duì)應(yīng)rule.xml中的&lt;tableRule&gt;標(biāo)簽的name屬性,如無需分片可以不指定
  • splitTableNames 屬性定義是否允許多個(gè)表的定義

dataNode 標(biāo)簽

dataNode 標(biāo)簽用于定義數(shù)據(jù)節(jié)點(diǎn),數(shù)據(jù)節(jié)點(diǎn)指向的是存儲(chǔ)邏輯表的物理數(shù)據(jù)庫。示例:

<dataNode name="dn1" dataHost="localhost1" database="db1" />
<dataNode name="dn2" dataHost="localhost1" database="db2" />
<dataNode name="dn3" dataHost="localhost1" database="db3" />
<!-- 可以配置一個(gè)范圍 -->
<dataNode name="dn1$0-743" dataHost="localhost1" database="db$0-743"/>
  • name 屬性定義數(shù)據(jù)節(jié)點(diǎn)的名稱,必須唯一
  • dataHost 屬性指定分片所在的物理主機(jī)
  • database 屬性指定物理數(shù)據(jù)庫的名稱

dataHost 標(biāo)簽

dataHost 標(biāo)簽用于定義后端物理數(shù)據(jù)庫主機(jī)信息,該標(biāo)簽內(nèi)有兩個(gè)子標(biāo)簽,可以定義一組數(shù)據(jù)庫主機(jī)信息。例如,定義一組主從集群結(jié)構(gòu)的數(shù)據(jù)庫主機(jī)信息:
mycat配置文件的詳細(xì)介紹

  • writeHost標(biāo)簽配置寫實(shí)例,即主從中的master節(jié)點(diǎn)
  • readHost 標(biāo)簽配置讀實(shí)例,即主從中的salve節(jié)點(diǎn)
  • readHostwriteHost的子標(biāo)簽,與writeHost有綁定關(guān)系

在一個(gè)dataHost內(nèi)可以定義多個(gè)writeHostreadHost。但是,如果writeHost指定的后端數(shù)據(jù)庫宕機(jī),那么這個(gè)writeHost綁定的所有readHost都將不可用。另一方面,由于這個(gè)writeHost宕機(jī)系統(tǒng)會(huì)自動(dòng)的檢測(cè)到,并切換到備用的writeHost上去。

配置示例:

<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
    <heartbeat>select user()</heartbeat>
    <!-- 可以配置多個(gè)寫實(shí)例 -->
    <writeHost host="localhost" url="localhost:3306" user="root"
               password="123456">
        <readHost host="localhost" url="localhost:3306" 
                  user="root" password="123456"></readHost>
    </writeHost>
</dataHost>

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

另外,slaveThreshold 屬性是用于配合writeType屬性實(shí)現(xiàn)根據(jù)主從延時(shí)來進(jìn)行主從切換的,其官方文檔描述如下:

1.4 開始支持MySQL主從復(fù)制狀態(tài)綁定的讀寫分離機(jī)制,讓讀更加安全可靠,配置如下:MyCAT 心跳檢查語句配置為show slave statusdataHost 上定義兩個(gè)新屬性:switchType="2"slaveThreshold="100",此時(shí)意味著開啟MySQL主從復(fù)制狀態(tài)綁定的讀寫分離與切換機(jī)制,Mycat心跳機(jī)制通過檢測(cè)show slave status 中的"Seconds_Behind_Master"、"Slave_IO_Running"、"Slave_SQL_Running" 三個(gè)字段來確定當(dāng)前主從同步的狀態(tài)以及Seconds_Behind_Master 主從復(fù)制時(shí)延,當(dāng)Seconds_Behind_Master &gt; slaveThreshold時(shí),讀寫分離篩選器會(huì)過濾掉此Slave機(jī)器,防止讀到很久之前的舊數(shù)據(jù),而當(dāng)主節(jié)點(diǎn)宕機(jī)后,切換邏輯會(huì)檢查Slave上的Seconds_Behind_Master是否為0,為0時(shí)則表示主從同步,可以安全切換,否則不會(huì)切換。


heartbeat 標(biāo)簽

heartbeat 標(biāo)簽內(nèi)指明用于和后端數(shù)據(jù)庫進(jìn)行心跳檢查的語句。例如,MySQL可以使用select user(),Oracle可以使用select 1 from dual 等。

這個(gè)標(biāo)簽還有一個(gè)connectionInitSql屬性,主要是當(dāng)使用Oracla數(shù)據(jù)庫時(shí),需要執(zhí)行的初始化SQL語句就這個(gè)放到這里面來。例如:alter session set nls_date_format='yyyy-mm-dd hh34:mi:ss'

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


writehost 標(biāo)簽、readHost標(biāo)簽

這兩個(gè)標(biāo)簽都用于配置一組主從數(shù)據(jù)庫的相關(guān)信息,Mycat用這兩個(gè)標(biāo)簽配置的連接信息實(shí)例化后端連接池。唯一不同的是,writeHost 配置寫實(shí)例(master)、readHost 配置讀實(shí)例(salve),并且readHostwriteHost 的子標(biāo)簽。通過這兩個(gè)標(biāo)簽可以組合讀/寫實(shí)例以滿足系統(tǒng)的要求。

在一個(gè)dataHost內(nèi)可以定義多個(gè)writeHostreadHost。但是,如果writeHost指定的后端數(shù)據(jù)庫宕機(jī),那么這個(gè)writeHost綁定的所有readHost都將不可用。另一方面,當(dāng)一個(gè)writeHost宕機(jī)時(shí)系統(tǒng)會(huì)自動(dòng)檢測(cè)到,并切換到備用的writeHost 上去。


writehost 標(biāo)簽及readHost標(biāo)簽的屬性

這兩個(gè)標(biāo)簽的屬性相同,這里就一起介紹:

  • host 屬性用于標(biāo)識(shí)不同實(shí)例名稱,一般writeHost名稱使用M1作為后綴,readHost則使用S1作為后綴
  • url 屬性用于配置數(shù)據(jù)庫的連接地址,如果是使用nativedbDriver,則一般為address:port這種形式。用JDBC或其他的dbDriver,則需要特殊指定。例如,當(dāng)使用JDBC 時(shí)則可以這么寫:jdbc:mysql://localhost:3306/
  • user 屬性配置數(shù)據(jù)庫用戶名
  • password 屬性配置數(shù)據(jù)庫密碼
  • weight 屬性配置某個(gè)數(shù)據(jù)庫在 readhost 中作為讀節(jié)點(diǎn)的權(quán)重
  • usingDecrypt 屬性指定是否對(duì)密碼加密,默認(rèn)為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>

看完上述內(nèi)容,你們對(duì)mycat的配置文件有進(jìn)一步的了解嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀。

文章題目:mycat配置文件的詳細(xì)介紹
URL網(wǎng)址:http://www.muchs.cn/article12/pgdjdc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營(yíng)銷、App設(shè)計(jì)App開發(fā)、小程序開發(fā)、做網(wǎng)站定制網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司