這篇文章主要為大家分享mycat的配置文件。文中還介紹了mycat常用的幾個分片算法的計算過程和使用方法,希望大家通過這篇文章能有所收獲。
10年積累的網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計經(jīng)驗,可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識你,你也不認(rèn)識我。但先網(wǎng)站設(shè)計后付款的網(wǎng)站建設(shè)流程,更有平南免費網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
由上圖可以看到 Mycat 的核心配置文件均采用xml格式,這幾個配置文件的用途如下:
server.xml
:用于配置系統(tǒng)參數(shù)、用戶信息、訪問權(quán)限及SQL防火墻和SQL攔截功能等schema.xml
:用于配置邏輯庫、邏輯表相關(guān)信息rule.xml
:如果使用了水平切分,就需要使用該文件配置切分規(guī)則log4j2.xml
:Mycat日志相關(guān)的配置,例如日志輸出格式、日志級別等應(yīng)用連接Mycat服務(wù)時,Mycat首先會通過server.xml
中的配置信息進(jìn)行用戶認(rèn)證。用戶通過驗證后,所看到的邏輯庫、邏輯表都是schema.xml
中所配置的。當(dāng)使用了水平切分時,Mycat會通過rule.xml
里配置的規(guī)則來定位具體的物理數(shù)據(jù)庫位置,從而完成寫入/讀取數(shù)據(jù)。
system
標(biāo)簽用于配置 Mycat 的系統(tǒng)參數(shù),其格式如下:
${value}
配置 Mycat 服務(wù)端口示例:
3306
常見的系統(tǒng)參數(shù)舉例:
8066
9066
0.0.0.0
0
2048
utf8
8
1800000
100
104857600
0
1
1
0
0
300
1
(?:(\s*next\s+value\s+for\s*MYCATSEQ_(\w+))(,|\)|\s)*)+
false
io.mycat.route.sequence.handler.HttpIncrSequenceHandler
0
0
0
false
false
2
true
0
user
標(biāo)簽用于配置Mycat的訪問用戶及權(quán)限,其格式如下:
${value}
...
配置示例:
123456
mall_db
false
除了配置對庫的權(quán)限可能還不夠,有時候我們需要配置用戶對某些表的訪問權(quán)限。如下示例:
123456
mall_db,db1,db2
dml
屬性配置的數(shù)字是權(quán)限位,分別對應(yīng)著insert,update,select,delete
四種權(quán)限。例如,當(dāng)dml
的值為0110
時,表示擁有update
和select
權(quán)限,不具有insert
和delete
權(quán)限。所以權(quán)限位為1
時代表擁有對應(yīng)的操作權(quán)限,為0
時代表沒有該操作權(quán)限。
在該示例中,mall
用戶對:
user_table
表不具有任何操作權(quán)限order_table
表擁有所有操作權(quán)限update
和select
權(quán)限以上配置用戶的示例中,密碼都是以明文的形式寫在配置文件中。但用戶的密碼是安全敏感的,一般不會直接在配置文件中寫明文密碼,而是寫一個加密過后的密碼。否則只要擁有查看server.xml
文件的權(quán)限,就能輕易獲取到各個用戶的密碼,這是非常不安全的。
因此,Mycat 提供了一個工具用于加密明文密碼,該工具在一個jar包內(nèi),可使用如下命令對密碼進(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í)行成功后,會得到一個加密后的字符串:
GO0bnFVWrAuFgr1JMuMZkvfDNyTpoiGU7n/Wlsa151CirHQnANVk3NzE3FErx8v6pAcO0ctX3xFecmSr+976QA==
復(fù)制該字符串,替換配置文件中的明文密碼,如下示例:
1
GO0bnFVWrAuFgr1JMuMZkvfDNyTpoiGU7n/Wlsa151CirHQnANVk3NzE3FErx8v6pAcO0ctX3xFecmSr+976QA==
...
我們都知道Mycat是使用Java進(jìn)行開發(fā)的,所以其日志框架也是使用Java生態(tài)圈內(nèi)的log4j2
。Mycat日志相關(guān)的配置都在 log4j2.xml
文件中,本小節(jié)將介紹一些常用的配置項。
Pattern
標(biāo)簽用于配置 Mycat 日志輸出格式,默認(rèn)如下:
%d{yyyy-MM-dd HH:mm:ss.SSS} %5p [%t] (%l) - %m%n
%d{yyyy-MM-dd HH:mm:ss.SSS}
:日志的時間格式%5p
:輸出的日志的級別%t
:輸出日志的線程名稱%l
:日志輸出語句所在的代碼位置%m
:輸出代碼中指定的日志內(nèi)容%n
:輸出一個換行符更多Pattern取值詳見官方文檔
這里截取了一段 Mycat 的日志內(nèi)容,可以看到與Pattern是一一對應(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
level
屬性用于配置 Mycat 的日志輸出級別,默認(rèn)為info
級別:
關(guān)于log4j2的內(nèi)建日志級別詳見官方文檔
當(dāng)我們需要通過Mycat實現(xiàn)數(shù)據(jù)分片時就得用到rule.xml
配置文件,該文件用于配置:
這是一個分片規(guī)則的配置示例:
id
hash-mod-4
{分片算法名稱}-{分片數(shù)量}_{分片列}
;上面的示例就是采用的這種命名格式上面示例中所提到的<function>
標(biāo)簽是用于配置表的分片算法或者說分片函數(shù),如下示例:
4
每個分片算法的所需參數(shù)可能不一樣,所以property
標(biāo)簽是可以有多個的,其屬性也因具體的分片算法而異。如下示例:
yyyy-MM-dd
0
2014-01-01
2014-01-31
10
Mycat 內(nèi)置了非常多的分片算法,并且我們也可以針對實際情況自行開發(fā)屬于自己的分片算法。我們來看看常用分片算法都有哪些:
PartitionByMod
:簡單取模,直接通過列值進(jìn)行取模得出分片位置PartitionByHashMod
:哈希取模,先將列值進(jìn)行hash運算之后再取模得出分片位置PartitionByFileMap
:分片枚舉,根據(jù)枚舉值對數(shù)據(jù)進(jìn)行分片,例如在異地多活的場景中通過地區(qū)id進(jìn)行數(shù)據(jù)分片的場景PartitionByPrefixPattern
:字符串范圍取模,根據(jù)長字符串的前面幾位進(jìn)行取模分片簡單取模分片算法的工作原理:
配置示例:
id
mod-long
2
總結(jié):
分片列 % 分片基數(shù)
io.mycat.route.function.PartitionByMod
當(dāng)需要取模的列為非整型時,就可以使用哈希取模分片算法。其工作原理如下圖:
配置示例:
login_name
hash-mod
2
總結(jié):
hash(分片列) % 分片基數(shù)
io.mycat.route.function.PartitionByHashMod
前兩種分片算法都是通過算法本身去計算出分片位置,是無法人工控制的。如果需要人工控制分片位置時,就可以使用到分片枚舉算法。該算法使得我們可以指定一些枚舉值來對分片位置進(jìn)行控制,其實也就相當(dāng)于是人工指定了某些數(shù)據(jù)應(yīng)該到哪個分片。
例如,某張表中有個存儲用戶所在區(qū)域id的列,我們希望將區(qū)域id與數(shù)據(jù)庫所在的區(qū)域進(jìn)行映射,以實現(xiàn)區(qū)域id為1的數(shù)據(jù)被分片到區(qū)域1數(shù)據(jù)庫中,區(qū)域id為2的數(shù)據(jù)被分片到區(qū)域2數(shù)據(jù)庫中,以此類推。在這種場景下就可以使用分片枚舉算法,其工作原理如下圖:
mapFile
配置一個分片關(guān)系映射,其格式為key-value,key為枚舉,value為數(shù)據(jù)節(jié)點的索引。圖中的枚舉就是area_id
,一個area_id
對應(yīng)著一個數(shù)據(jù)節(jié)點。沒有配置映射關(guān)系的area_id
則會被分片到DEFAULT_NODE
所對應(yīng)的數(shù)據(jù)節(jié)點。配置示例:
area_id
hash-int
partition-hash-int.txt
0
0
mapFile
時需要注意這一點總結(jié):
$MYCAT_HOME/conf
目錄下增加mapFile
來配置枚舉值同節(jié)點的映射關(guān)系hash(分片列) % 分片基數(shù)
io.mycat.route.function.PartitionByFileMap
以上所介紹到的分片算法都是根據(jù)列進(jìn)行分片的,在實際工作中我們可能會遇到這樣一個需求:需要通過字符串的前幾位或后幾位進(jìn)行分片。例如,通過訂單號的前五位進(jìn)行分片計算,或按用戶的姓氏進(jìn)行分片。在這種場景下,就可以使用字符串范圍取模分片算法。
例如,需要對ABCDEFGHI
這個字符串的前三位進(jìn)行分片計算,其計算過程如下圖:
mapFile
里配置的取值范圍與數(shù)據(jù)節(jié)點索引的映射關(guān)系得出分片的數(shù)據(jù)節(jié)點。因此,mapFile
需要配置所有可能的取值范圍,否則找不到對應(yīng)的數(shù)據(jù)節(jié)點就會報錯。工作原理:
配置示例:
login_name
sharding-by-prefix-pattern
prefix-partition-pattern.txt
128
2
總結(jié):
$MYCAT_HOME/conf
目錄下增加mapFile
來配置取模范圍同節(jié)點的映射關(guān)系io.mycat.route.function.PartitionByPrefixPattern
用途:
schema
標(biāo)簽用于定義邏輯庫,示例:
...
checkSQLschema
屬性判斷是否檢查發(fā)給Mycat的SQL是否含有庫名,為true
時會將SQL中的庫名刪除掉name
屬性定義邏輯庫的名字,必須唯一不能重復(fù)sqlMaxLimit
屬性用于限制返回結(jié)果集的行數(shù),值為-1
時表示關(guān)閉該限制。如果沒有開啟限制則默認(rèn)取server.xml
里配置的限制randomDataNode
屬性定義將一些隨機語句發(fā)送到該數(shù)據(jù)節(jié)點中使用了schema
標(biāo)簽定義邏輯庫之后,還需要使用table
標(biāo)簽定義邏輯表。示例:
name
屬性定義邏輯表的名字,必須唯一不能重復(fù)且需要與數(shù)據(jù)庫中的物理表名一致。使用逗號分割配置多個表,即多個表使用這個配置primaryKey
屬性指定邏輯表中的主鍵,也是需要與物理表的主鍵一致dataNode
屬性指定物理表所在數(shù)據(jù)節(jié)點的名稱,配置多個數(shù)據(jù)節(jié)點時需按索引順序并使用逗號分隔,或指定一個索引范圍:dn1$0-743
。注意數(shù)據(jù)節(jié)點定義之后,順序不能再發(fā)生改變,否則會導(dǎo)致數(shù)據(jù)混亂rule
屬性用于指定分片規(guī)則名稱,對應(yīng)rule.xml
中的<tableRule>
標(biāo)簽的name
屬性,如無需分片可以不指定splitTableNames
屬性定義是否允許多個表的定義dataNode
標(biāo)簽用于定義數(shù)據(jù)節(jié)點,數(shù)據(jù)節(jié)點指向的是存儲邏輯表的物理數(shù)據(jù)庫。示例:
name
屬性定義數(shù)據(jù)節(jié)點的名稱,必須唯一dataHost
屬性指定分片所在的物理主機database
屬性指定物理數(shù)據(jù)庫的名稱dataHost
標(biāo)簽用于定義后端物理數(shù)據(jù)庫主機信息,該標(biāo)簽內(nèi)有兩個子標(biāo)簽,可以定義一組數(shù)據(jù)庫主機信息。例如,定義一組主從集群結(jié)構(gòu)的數(shù)據(jù)庫主機信息:
writeHost
標(biāo)簽配置寫實例,即主從中的master節(jié)點readHost
標(biāo)簽配置讀實例,即主從中的salve節(jié)點readHost
是writeHost
的子標(biāo)簽,與writeHost
有綁定關(guān)系在一個dataHost
內(nèi)可以定義多個writeHost
和readHost
。但是,如果writeHost
指定的后端數(shù)據(jù)庫宕機,那么這個writeHost
綁定的所有readHost
都將不可用。另一方面,由于這個writeHost
宕機系統(tǒng)會自動的檢測到,并切換到備用的writeHost
上去。
配置示例:
select user()
name
屬性用于定義主機名稱,必須唯一maxCon
屬性指定每個讀/寫實例連接池的最大連接數(shù)。也就是說,標(biāo)簽內(nèi)嵌套的writeHost
、readHost
標(biāo)簽都會使用這個屬性的值來實例化出連接池的最大連接數(shù)minCon
屬性指定每個讀寫實例連接池的最小連接數(shù),即初始化連接池的大小dbType
屬性指定后端連接的數(shù)據(jù)庫類型,目前支持二進(jìn)制的mysql協(xié)議,還有其他使用JDBC
連接的數(shù)據(jù)庫dbDriver
屬性指定連接后端數(shù)據(jù)庫使用的驅(qū)動,目前可選的值有native
和JDBC
slaveThreshold
屬性用于定義主從復(fù)制延時閾值,當(dāng)Seconds_Behind_Master > slaveThreshold
時,讀寫分離篩選器會過濾掉此Slave機器,防止讀到很久之前的舊數(shù)據(jù)balance
屬性指定讀寫分離的負(fù)載均衡類型,目前的取值有4 種:0
:不開啟讀寫分離機制,所有讀操作都發(fā)送到當(dāng)前可用的 writeHost
上1
:全部的readHost
與stand by writeHost
參與select
語句的負(fù)載均衡2
:所有讀操作都隨機在writeHost
、readhost
上分發(fā)3
:所有讀請求隨機分發(fā)到 wiriterHost
對應(yīng)的readhost
執(zhí)行。即 writerHost
不負(fù)擔(dān)讀壓力,全部讀請求由 readhost
執(zhí)行。注意該取值只在1.4及其以后版本有,1.3沒有writeType
屬性指定寫實例的負(fù)載均衡類型,目前的取值有4 種:-1
:表示不自動切換0
:所有寫操作發(fā)送到配置的第一個writeHost
,第一個掛了切到還生存的第二個writeHost
。重新啟動后以切換后的為準(zhǔn),切換記錄在配置文件中:dnindex.properties
1
:所有寫操作都隨機的發(fā)送到配置的writeHost
,1.5 以后廢棄不推薦使用2
:基于MySQL主從同步的狀態(tài)決定是否切換(1.4 新增)switchType
屬性用于指定主從切換的方式:-1
:表示不自動切換1
:默認(rèn)值,自動切換2
:基于MySQL主從同步的狀態(tài)決定是否切換,心跳檢測語句為:show slave status
3
:基于MySQL galary cluster的切換機制(適合集群,1.4.1新增),心跳檢測語句為show status like 'wsrep%'
另外,slaveThreshold
屬性是用于配合writeType
屬性實現(xiàn)根據(jù)主從延時來進(jìn)行主從切換的,其官方文檔描述如下:
1.4 開始支持MySQL主從復(fù)制狀態(tài)綁定的讀寫分離機制,讓讀更加安全可靠,配置如下:MyCAT 心跳檢查語句配置為
show slave status
,dataHost
上定義兩個新屬性:switchType="2"
與slaveThreshold="100"
,此時意味著開啟MySQL主從復(fù)制狀態(tài)綁定的讀寫分離與切換機制,Mycat心跳機制通過檢測show slave status
中的"Seconds_Behind_Master
"、"Slave_IO_Running
"、"Slave_SQL_Running
" 三個字段來確定當(dāng)前主從同步的狀態(tài)以及Seconds_Behind_Master
主從復(fù)制時延,當(dāng)Seconds_Behind_Master > slaveThreshold
時,讀寫分離篩選器會過濾掉此Slave機器,防止讀到很久之前的舊數(shù)據(jù),而當(dāng)主節(jié)點宕機后,切換邏輯會檢查Slave上的Seconds_Behind_Master
是否為0
,為0
時則表示主從同步,可以安全切換,否則不會切換。
heartbeat
標(biāo)簽內(nèi)指明用于和后端數(shù)據(jù)庫進(jìn)行心跳檢查的語句。例如,MySQL可以使用select user()
,Oracle可以使用select 1 from dual
等。
這個標(biāo)簽還有一個connectionInitSql
屬性,主要是當(dāng)使用Oracla數(shù)據(jù)庫時,需要執(zhí)行的初始化SQL語句就這個放到這里面來。例如:alter session set nls_date_format='yyyy-mm-dd hh34:mi:ss'
注:如果是配置主從切換的語句在1.4之后必須是:show slave status
這兩個標(biāo)簽都用于配置一組主從數(shù)據(jù)庫的相關(guān)信息,Mycat用這兩個標(biāo)簽配置的連接信息實例化后端連接池。唯一不同的是,writeHost
配置寫實例(master)、readHost
配置讀實例(salve),并且readHost
為writeHost
的子標(biāo)簽。通過這兩個標(biāo)簽可以組合讀/寫實例以滿足系統(tǒng)的要求。
在一個dataHost
內(nèi)可以定義多個writeHost
和readHost
。但是,如果writeHost
指定的后端數(shù)據(jù)庫宕機,那么這個writeHost
綁定的所有readHost
都將不可用。另一方面,當(dāng)一個writeHost
宕機時系統(tǒng)會自動檢測到,并切換到備用的writeHost
上去。
這兩個標(biāo)簽的屬性相同,這里就一起介紹:
host
屬性用于標(biāo)識不同實例名稱,一般writeHost
名稱使用M1
作為后綴,readHost
則使用S1
作為后綴url
屬性用于配置數(shù)據(jù)庫的連接地址,如果是使用native
的dbDriver
,則一般為address:port
這種形式。用JDBC
或其他的dbDriver
,則需要特殊指定。例如,當(dāng)使用JDBC
時則可以這么寫:jdbc:mysql://localhost:3306/
user
屬性配置數(shù)據(jù)庫用戶名password
屬性配置數(shù)據(jù)庫密碼weight
屬性配置某個數(shù)據(jù)庫在 readhost
中作為讀節(jié)點的權(quán)重usingDecrypt
屬性指定是否對密碼加密,默認(rèn)為0
, 若需要開啟則配置為1
select user()
看完上述內(nèi)容,你們對mycat的配置文件有進(jìn)一步的了解嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀。