mycat配置檔案的詳細介紹
mycat配置檔案的詳細介紹
其中三大配置檔案為:
常用配置檔案間的關係
由上圖可以看到 Mycat 的核心配置檔案均採用xml格式,這幾個配置檔案的用途如下:
server.xml
:用於配置系統引數、使用者資訊、訪問許可權及SQL防火牆和SQL攔截功能等schema.xml
:用於配置邏輯庫、邏輯表相關資訊rule.xml
:如果使用了水平切分,就需要使用該檔案配置切分規則log4j2.xml
:Mycat日誌相關的配置,例如日誌輸出格式、日誌級別等
應用連線Mycat服務時,Mycat首先會通過server.xml
中的配置資訊進行使用者認證。使用者通過驗證後,所看到的邏輯庫、邏輯表都是schema.xml
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
時,表示擁有update
和select
許可權,不具有insert
和delete
許可權。所以許可權位為1
時代表擁有對應的操作許可權,為0
時代表沒有該操作許可權。
在該示例中,mall
使用者對:
user_table
表不具有任何操作許可權order_table
表擁有所有操作許可權- 其他表只擁有
update
和select
許可權
加密明文密碼
以上配置使用者的示例中,密碼都是以明文的形式寫在配置檔案中。但使用者的密碼是安全敏感的,一般不會直接在配置檔案中寫明文密碼,而是寫一個加密過後的密碼。否則只要擁有檢視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:分片規則的名稱儘量具有實際意義,命名格式可以參考:
{分片演算法名稱}-{分片數量}_{分片列}
;上面的示例就是採用的這種命名格式
上面示例中所提到的<function>
標籤是用於配置表的分片演算法或者說分片函式,如下示例:
<!-- 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
簡單取模分片演算法的工作原理:
- 在圖中有兩個資料庫,每個資料庫就是一個分片,所以使用分片列的值對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
當需要取模的列為非整型時,就可以使用雜湊取模分片演算法。其工作原理如下圖:
- 對分片列的值進行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資料庫中,以此類推。在這種場景下就可以使用分片列舉演算法,其工作原理如下圖:
- 通過
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
這個字串的前三位進行分片計算,其計算過程如下圖:
- 對指定的字串範圍分別進行ascii碼計算並求和,然後對配置的求模基數進行取模計算,最後根據
mapFile
裡配置的取值範圍與資料節點索引的對映關係得出分片的資料節點。因此,mapFile
需要配置所有可能的取值範圍,否則找不到對應的資料節點就會報錯。
工作原理:
配置示例:
<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
中的<tableRule>
標籤的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
標籤用於定義後端物理資料庫主機資訊,該標籤內有兩個子標籤,可以定義一組資料庫主機資訊。例如,定義一組主從叢集結構的資料庫主機資訊:
writeHost
標籤配置寫例項,即主從中的master節點readHost
標籤配置讀例項,即主從中的salve節點readHost
是writeHost
的子標籤,與writeHost
有繫結關係
在一個dataHost
內可以定義多個writeHost
和readHost
。但是,如果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
屬性指定每個讀/寫例項連線池的最大連線數。也就是說,標籤內巢狀的writeHost
、readHost
標籤都會使用這個屬性的值來例項化出連線池的最大連線數 -
minCon
屬性指定每個讀寫例項連線池的最小連線數,即初始化連線池的大小 -
dbType
屬性指定後端連線的資料庫型別,目前支援二進位制的MYSQL協議,還有其他使用JDBC
連線的資料庫 -
dbDriver
屬性指定連線後端資料庫使用的驅動,目前可選的值有native
和JDBC
-
slaveThreshold
屬性用於定義主從複製延時閾值,當Seconds_Behind_Master > slaveThreshold
時,讀寫分離篩選器會過濾掉此Slave機器,防止讀到很久之前的舊資料 -
balance
屬性指定讀寫分離的
負載均衡
型別,目前的取值有4 種:
0
:不開啟讀寫分離機制,所有讀操作都發送到當前可用的writeHost
上1
:全部的readHost
與stand bywriteHost
參與select
語句的負載均衡2
:所有讀操作都隨機在writeHost
、readhost
上分發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 status
,dataHost
上定義兩個新屬性:switchType="2"
與slaveThreshold="100"
,此時意味著開啟MySQL主從複製狀態繫結的讀寫分離與切換機制,Mycat心跳機制通過檢測show slave status
中的"Seconds_Behind_Master
"、"Slave_IO_Running
"、"Slave_SQL_Running
" 三個欄位來確定當前主從同步的狀態以及Seconds_Behind_Master
主從複製時延,當Seconds_Behind_Master > 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 hh34:mi:ss'
注:如果是配置主從切換的語句在1.4之後必須是:show slave status
writehost 標籤、readHost標籤
這兩個標籤都用於配置一組主從資料庫的相關資訊,Mycat用這兩個標籤配置的連線資訊例項化後端連線池。唯一不同的是,writeHost
配置寫例項(master)、readHost
配置讀例項(salve),並且readHost
為writeHost
的子標籤。通過這兩個標籤可以組合讀/寫例項以滿足系統的要求。
在一個dataHost
內可以定義多個writeHost
和readHost
。但是,如果writeHost
指定的後端資料庫宕機,那麼這個writeHost
繫結的所有readHost
都將不可用。另一方面,當一個writeHost
宕機時系統會自動檢測到,並切換到備用的writeHost
上去。
writehost 標籤及readHost標籤的屬性
這兩個標籤的屬性相同,這裡就一起介紹:
host
屬性用於標識不同例項名稱,一般writeHost
名稱使用M1
作為字尾,readHost
則使用S1
作為字尾url
屬性用於配置資料庫的連線地址,如果是使用native
的dbDriver
,則一般為address:port
這種形式。用JDBC
或其他的dbDriver
,則需要特殊指定。例如,當使用JDBC
時則可以這麼寫:jdbc:mysql://localhost:3306/
user
屬性配置資料庫使用者名稱password
屬性配置資料庫密碼weight
屬性配置某個資料庫在readhost
中作為讀節點的權重usingDecrypt
屬性指定是否對密碼加密,預設為0
, 若需要開啟則配置為1
schema.xml 配置檔案示例
<!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>
看完上述內容,你們對mycat的配置檔案有進一步的瞭解嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速雲行業資訊頻道,感謝各位的閱讀