MyCat配置详解
MyCAT 配置解析
server.xml Mycat的配置文件,設(shè)置賬號(hào)、參數(shù)等
schema.xml Mycat對(duì)應(yīng)的物理數(shù)據(jù)庫(kù)和數(shù)據(jù)庫(kù)表的配置
rule.xml Mycat分片(分庫(kù)分表)規(guī)則
一 :wrapper.conf
--配置jdk
wrapper.java.command=D:/Program Files/Java/jdk1.8.0_131/bin/java.exe
二:server.xml
1、user標(biāo)簽?
<user name="root">
<property name="password"></property>
<property name="schemas">TESTDB</property>
</user>
user 用戶配置節(jié)點(diǎn)
--name 登錄的用戶名,也就是連接Mycat的用戶名
--password 登錄的密碼,也就是連接Mycat的密碼
--schemas 數(shù)據(jù)庫(kù)名,這里會(huì)和schema.xml中的配置關(guān)聯(lián),多個(gè)用逗號(hào)分開,例如需要這個(gè)用戶需要管理兩個(gè)數(shù)據(jù)庫(kù)db1,db2,則配置db1,dbs
2、privileges標(biāo)簽?
對(duì)用戶的 schema以及表進(jìn)行精細(xì)化的DML權(quán)限控制
<privileges check="false">
</privileges>
--check 表示是否開啟DML權(quán)限檢查。默認(rèn)是關(guān)閉。server.dtd文件中 <!ELEMENT privileges (schema)*> 說(shuō)明可以有多個(gè)schema的配置。
--dml 順序說(shuō)明:insert,update,select,delete
<schema name="db1" dml="0110" >
<table name="tb01" dml="0000"></table>
<table name="tb02" dml="1111"></table>
</schema>
db1的權(quán)限是update,select。?
tb01的權(quán)限是啥都不能干。?
tb02的權(quán)限是insert,update,select,delete。?
其他表默認(rèn)是udpate,select。
2. system標(biāo)簽
這個(gè)標(biāo)簽內(nèi)嵌套的所有 property 標(biāo)簽都與系統(tǒng)配置有關(guān)。
<property name="charset">utf8</property>?
字符集
<property name="processors">1</property>?
處理線程數(shù)量,默認(rèn)是cpu數(shù)量。
<property name="processorBufferChunk">4096</property>?
每次讀取留的數(shù)量,默認(rèn)4096。
<property name="processorBufferPool">409600</property>
創(chuàng)建共享buffer需要占用的總空間大小。processorBufferChunk*processors*100。
<property name="processorBufferPoolType">0</property>
默認(rèn)為0。0表示DirectByteBufferPool,1表示ByteBufferArena。
<property name="processorBufferLocalPercent">100</property>
二級(jí)共享buffer是processorBufferPool的百分比,這里設(shè)置的是百分比。
<property name="sequnceHandlerType">100</property>
全局ID生成方式。(0:為本地文件方式,1:為數(shù)據(jù)庫(kù)方式;2:為時(shí)間戳序列方式;3:為ZK生成ID;4:為ZK遞增ID生成。
<property name="useCompression">1</property>
是否開啟mysql壓縮協(xié)議。1為開啟,0為關(guān)閉,默認(rèn)關(guān)閉。
<property name="packetHeaderSize">4</property>?
指定 Mysql 協(xié)議中的報(bào)文頭長(zhǎng)度。默認(rèn) 4。
<property name="maxPacketSize">16M</property>
指定 Mysql 協(xié)議可以攜帶的數(shù)據(jù)最大長(zhǎng)度。默認(rèn) 16M。
<property name="idleTimeout">1800000</property>
指定連接的空閑超時(shí)時(shí)間。某連接在發(fā)起空閑檢查下,發(fā)現(xiàn)距離上次使用超過(guò)了空閑時(shí)間,那么這個(gè)連接會(huì)被回收,就是被直接的關(guān)閉掉。默認(rèn) 30 分鐘,單位毫秒。
<property name="txIsolation">3</property>
前端連接的初始化事務(wù)隔離級(jí)別,只在初始化的時(shí)候使用,后續(xù)會(huì)根據(jù)客戶端傳遞過(guò)來(lái)的屬性對(duì)后端數(shù)據(jù)庫(kù)連接進(jìn)行同步。默認(rèn)為 REPEATED_READ,設(shè)置值為數(shù)字默認(rèn) 3。?
READ_UNCOMMITTED = 1;?
READ_COMMITTED = 2;?
REPEATED_READ = 3;?
SERIALIZABLE = 4;
<property name="sqlExecuteTimeout">300</property>
SQL 執(zhí)行超時(shí)的時(shí)間,Mycat 會(huì)檢查連接上最后一次執(zhí)行 SQL 的時(shí)間,若超過(guò)這個(gè)時(shí)間則會(huì)直接關(guān)閉這連接。默認(rèn)時(shí)間為 300 秒,單位秒。
<property name="processorCheckPeriod">1000</property>
清理 NIOProcessor 上前后端空閑、超時(shí)和關(guān)閉連接的間隔時(shí)間。默認(rèn)是 1 秒,單?
位毫秒。
<property name="dataNodeIdleCheckPeriod">300000</property>?
對(duì)后端連接進(jìn)行空閑、超時(shí)檢查的時(shí)間間隔,默認(rèn)是 300 秒,單位毫秒。
<property name="dataNodeHeartbeatPeriod">10000</property>
對(duì)后端所有讀、寫庫(kù)發(fā)起心跳的間隔時(shí)間,默認(rèn)是 10 秒,單位毫秒。
<property name="bindIp">0.0.0.0</property>
mycat 服務(wù)監(jiān)聽的 IP 地址,默認(rèn)值為 0.0.0.0。
<property name="serverPort">8066</property>
定義 mycat 的使用端口,默認(rèn)值為 8066。
<property name="managerPort">9066</property>
定義 mycat 的管理端口,默認(rèn)值為 9066。
<property name="fakeMySQLVersion">5.6</property>
mycat 模擬的 mysql 版本號(hào),默認(rèn)值為 5.6 版本,如非特需,不要修改這個(gè)值,目前支持設(shè)置 5.5,5.6,5.7 版本,其他版本可能會(huì)有問(wèn)題。
<property name="useSqlStat">0</property>?
是否開啟實(shí)時(shí)統(tǒng)計(jì)。1為開啟;0為關(guān)閉 。
<property name="useGlobleTableCheck">0</property>?
是否開啟全局表一致性檢測(cè)。1為開啟;0為關(guān)閉 。
<property name="handleDistributedTransactions">0</property>
分布式事務(wù)開關(guān)。0為不過(guò)濾分布式事務(wù);1為過(guò)濾分布式事務(wù);2 為不過(guò)濾分布式事務(wù),但是記錄分布式事務(wù)日志。
<property name="maxStringLiteralLength">65535</property>
默認(rèn)是65535。 64K 用于sql解析時(shí)最大文本長(zhǎng)度?
以上舉例的屬性僅僅是一部分,可以配置的變量很多,具體可以查看SystemConfig這個(gè)類的屬性內(nèi)容。?
System標(biāo)簽下的屬性,一般是上線后,需要根據(jù)實(shí)際運(yùn)行的情況,分析后調(diào)優(yōu)的時(shí)候進(jìn)行修改。
3. Firewall標(biāo)簽
顧名思義,這個(gè)就是關(guān)于防火墻的設(shè)置,也就是在網(wǎng)絡(luò)層對(duì)請(qǐng)求的地址進(jìn)行限制,主要是從安全角度來(lái)保證Mycat不被匿名IP進(jìn)行訪問(wèn)
<firewall>?
<whitehost>
<host host="127.0.0.1" user="mycat"/>
<host host="127.0.0.2" user="mycat"/>
</whitehost>
<blacklist check="false">
</blacklist>
</firewall>
設(shè)置很簡(jiǎn)單,很容易理解,只要設(shè)置了白名單,表示開啟了防火墻,只有白名單的連接才可以進(jìn)行連接。
?
三:schema.xml
--schema 數(shù)據(jù)庫(kù)設(shè)置,此數(shù)據(jù)庫(kù)為邏輯數(shù)據(jù)庫(kù),name與server.xml中schema對(duì)應(yīng)
--dataNode 分片信息,也就是分庫(kù)相關(guān)配置
--dataHost 物理數(shù)據(jù)庫(kù),真正存儲(chǔ)數(shù)據(jù)的數(shù)據(jù)庫(kù)
1、schema 標(biāo)簽
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="10">
</schema>
schema標(biāo)簽用來(lái)定義mycat實(shí)例中的邏輯庫(kù),mycat可以有多個(gè)邏輯庫(kù),每個(gè)邏輯庫(kù)都有自己的相關(guān)配置。可以使用schema標(biāo)簽來(lái)劃分這些不同的邏輯庫(kù)
如果不配置schema標(biāo)簽,所有表的配置會(huì)屬于同一個(gè)默認(rèn)的邏輯庫(kù)。邏輯庫(kù)的概念和MySql的database的概念一樣,我們?cè)诓樵儍蓚€(gè)不同邏輯庫(kù)中的表的時(shí)候,需要切換到該邏輯庫(kù)下進(jìn)行查詢。
--name 邏輯數(shù)據(jù)庫(kù)名,與server.xml中的schema對(duì)應(yīng)
--checkSQLschema 數(shù)據(jù)庫(kù)前綴相關(guān)設(shè)置,當(dāng)該值為true時(shí),例如我們執(zhí)行語(yǔ)句select * from TESTDB.company 。mycat會(huì)把語(yǔ)句修改為 select * from company 去掉TESTDB。
--sqlMaxLimit 當(dāng)該值設(shè)置為某個(gè)數(shù)值時(shí),每條執(zhí)行的sql語(yǔ)句,如果沒(méi)有加上limit語(yǔ)句,Mycat會(huì)自動(dòng)加上對(duì)應(yīng)的值。不寫的話,默認(rèn)返回所有的值。
需要注意的是,如果運(yùn)行的schema為非拆分庫(kù)的,那么該屬性不會(huì)生效。需要自己sql語(yǔ)句加limit。
2、table 標(biāo)簽
<table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
<table name="company" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" />
--name 表名,物理數(shù)據(jù)庫(kù)中表名
--dataNode 表存儲(chǔ)到哪些節(jié)點(diǎn),多個(gè)節(jié)點(diǎn)用逗號(hào)分隔。節(jié)點(diǎn)為下文dataNode設(shè)置的name
--primaryKey 主鍵字段名,自動(dòng)生成主鍵時(shí)需要設(shè)置
--autoIncrement 是否自增
--rule 分片規(guī)則名,具體規(guī)則下文rule詳細(xì)介紹
--type 該屬性定義了邏輯表的類型,目前邏輯表只有全局表和普通表。全局表: global 普通表:無(wú)?
注:全局表查詢?nèi)我夤?jié)點(diǎn),普通表查詢所有節(jié)點(diǎn)效率低
--autoIncrement mysql對(duì)非自增長(zhǎng)主鍵,使用last_insert_id() 是不會(huì)返回結(jié)果的,只會(huì)返回0.所以,只有定義了自增長(zhǎng)主鍵的表,才可以用last_insert_id()返回主鍵值。
mycat提供了自增長(zhǎng)主鍵功能,但是對(duì)應(yīng)的mysql節(jié)點(diǎn)上數(shù)據(jù)表,沒(méi)有auto_increment,那么在mycat層調(diào)用last_insert_id()也是不會(huì)返回結(jié)果的。
--needAddLimit 指定表是否需要自動(dòng)的在每個(gè)語(yǔ)句后面加上limit限制,由于使用了分庫(kù)分表,數(shù)據(jù)量有時(shí)候會(huì)特別龐大,這時(shí)候執(zhí)行查詢語(yǔ)句,
忘記加上limt就會(huì)等好久,所以mycat自動(dòng)為我們加上了limit 100,這個(gè)屬性默認(rèn)為true,可以自己設(shè)置為false禁用。如果使用這個(gè)功能,最好配合使用數(shù)據(jù)庫(kù)模式的全局序列。
--subTables 分表,分表目前不支持Join。
1) childTable標(biāo)簽
<table name="customer" primaryKey="ID" dataNode="dn1,dn2" rule="sharding-by-intfile">?
<childTable name="c_a" primaryKey="ID" joinKey="customer_id" parentKey="id" />
</table>
--childTable 標(biāo)簽用于定義 E-R 分片的子表。通過(guò)標(biāo)簽上的屬性與父表進(jìn)行關(guān)聯(lián)。?
--name 子表的名稱
--joinKey 子表中字段的名稱
--parentKey 父表中字段名稱
--primaryKey 同Table
--needAddLimit 同Table
3、dataNode標(biāo)簽
<dataNode name="dn1" dataHost="localhost1" database="db1" />
datanode標(biāo)簽定義了mycat中的數(shù)據(jù)節(jié)點(diǎn),也就是我們所說(shuō)的數(shù)據(jù)分片。一個(gè)datanode標(biāo)簽就是一個(gè)獨(dú)立的數(shù)據(jù)分片。
例子中的表述的意思為,使用名字為localhost1數(shù)據(jù)庫(kù)實(shí)例上的db1物理數(shù)據(jù)庫(kù),這就組成一個(gè)數(shù)據(jù)分片,最后我們用dn1來(lái)標(biāo)示這個(gè)分片。
--name 定義數(shù)據(jù)節(jié)點(diǎn)的名字,這個(gè)名字需要唯一。我們?cè)趖able標(biāo)簽上用這個(gè)名字來(lái)建立表與分片對(duì)應(yīng)的關(guān)系
--dataHost 用于定義該分片屬于哪個(gè)數(shù)據(jù)庫(kù)實(shí)例,屬性與datahost標(biāo)簽上定義的name對(duì)應(yīng)
--database 用于定義該分片屬于數(shù)據(jù)庫(kù)實(shí)例上 的具體庫(kù)。
4、dataHost標(biāo)簽
這個(gè)標(biāo)簽直接定義了具體數(shù)據(jù)庫(kù)實(shí)例,讀寫分離配置和心跳語(yǔ)句。
<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="192.168.1.100:3306" user="root" password="123456">
<readHost host="hostS1" url="192.168.1.101:3306" user="root" password="123456" />
</writeHost>
</dataHost>
--name 唯一標(biāo)示dataHost標(biāo)簽,供上層使用
--maxCon 指定每個(gè)讀寫實(shí)例連接池的最大連接。
--minCon 指定每個(gè)讀寫實(shí)例連接池的最小連接,初始化連接池的大小
--balance 負(fù)載均稱類型
balance="0":不開啟讀寫分離機(jī)制,所有讀操作都發(fā)送到當(dāng)前可用的writeHost上
balance="1":全部的readHost與stand by writeHost參與select語(yǔ)句的負(fù)載均衡,簡(jiǎn)單的說(shuō),當(dāng)雙主雙從模式(M1-S1,M2-S2 并且M1 M2互為主備),正常情況下,M2,S1,S2都參與select語(yǔ)句的負(fù)載均衡。
balance="2":所有讀操作都隨機(jī)的在writeHost、readHost上分發(fā)
balance="3":所有讀請(qǐng)求隨機(jī)的分發(fā)到writeHst對(duì)應(yīng)的readHost執(zhí)行,writeHost不負(fù)擔(dān)讀寫壓力。(1.4之后版本有)
--writeType 負(fù)載均衡類型。
writeType="0", 所有寫操作發(fā)送到配置的第一個(gè) writeHost,第一個(gè)掛了切到還生存的第二個(gè)writeHost,重新啟動(dòng)后已切換后的為準(zhǔn),切換記錄在配置文件中:dnindex.properties .
writeType="1",所有寫操作都隨機(jī)的發(fā)送到配置的 writeHost。1.5以后版本廢棄不推薦。
--switchType -1不自動(dòng)切換
1 默認(rèn)值 自動(dòng)切換
2 基于MySql主從同步的狀態(tài)決定是否切換心跳語(yǔ)句為 show slave status
3 基于mysql galary cluster 的切換機(jī)制(適合集群)1.4.1 心跳語(yǔ)句為 show status like 'wsrep%'
--dbType 指定后端鏈接的數(shù)據(jù)庫(kù)類型目前支持二進(jìn)制的mysql協(xié)議,還有其他使用jdbc鏈接的數(shù)據(jù)庫(kù),例如:mongodb,oracle,spark等
--dbDriver 指定連接后段數(shù)據(jù)庫(kù)使用的driver,目前可選的值有native和JDBC。使用native的話,因?yàn)檫@個(gè)值執(zhí)行的是二進(jìn)制的mysql協(xié)議,所以可以使用mysql和maridb,其他類型的則需要使用JDBC驅(qū)動(dòng)來(lái)支持。
如果使用JDBC的話需要符合JDBC4標(biāo)準(zhǔn)的驅(qū)動(dòng)jar 放到mycat\lib目錄下,并檢查驅(qū)動(dòng)jar包中包括如下目錄結(jié)構(gòu)文件 META-INF\services\java.sql.Driver。 在這個(gè)文件寫上具體的driver類名,例如com.mysql.jdbc.Driver
writeHost readHost指定后端數(shù)據(jù)庫(kù)的相關(guān)配置給mycat,用于實(shí)例化后端連接池。
--tempReadHostAvailable
如果配置了這個(gè)屬性 writeHost 下面的 readHost 仍舊可用,默認(rèn) 0 可配置(0、1)。
1)heartbeat標(biāo)簽?
這個(gè)標(biāo)簽內(nèi)指明用于和后端數(shù)據(jù)庫(kù)進(jìn)行心跳檢查的語(yǔ)句。?
例如:MYSQL 可以使用 select user(),Oracle 可以使用 select 1 from dual 等。
2) writeHost /readHost 標(biāo)簽?
這兩個(gè)標(biāo)簽都指定后端數(shù)據(jù)庫(kù)的相關(guān)配置,用于實(shí)例化后端連接池。唯一不同的是,writeHost 指定寫實(shí)例、readHost 指定讀實(shí)例。?
在一個(gè) dataHost 內(nèi)可以定義多個(gè) writeHost 和 readHost。但是,如果 writeHost 指定的后端數(shù)據(jù)庫(kù)宕機(jī),那么這個(gè) writeHost 綁定的所有 readHost 都將不可用。
另一方面,由于這個(gè) writeHost 宕機(jī),系統(tǒng)會(huì)自動(dòng)的檢測(cè)到,并切換到備用的 writeHost 上去。這兩個(gè)標(biāo)簽的屬性相同,這里就一起介紹。
--host 用于標(biāo)識(shí)不同實(shí)例,一般 writeHost 我們使用*M1,readHost 我們用*S1。
--url 后端實(shí)例連接地址。Native:地址:端口 JDBC:jdbc的url
--password 后端存儲(chǔ)實(shí)例需要的密碼
--user 后端存儲(chǔ)實(shí)例需要的用戶名字
--weight 權(quán)重 配置在 readhost 中作為讀節(jié)點(diǎn)的權(quán)重
--usingDecrypt 是否對(duì)密碼加密,默認(rèn)0。具體加密方法看官方文檔。
四: Rule.xml
ule.xml 里面就定義了我們對(duì)表進(jìn)行拆分所涉及到的規(guī)則定義。我們可以靈活的對(duì)表使用不同的分片算法,或者對(duì)表使用相同的算法但具體的參數(shù)不同。 包含的標(biāo)簽 tableRule 和 function。
1. tableRule 標(biāo)簽
這個(gè)標(biāo)簽定義表規(guī)則。?
定義的表規(guī)則,在 schema.xml:
<tableRule name="rule1">
<rule>
<columns>id</columns>
<algorithm>func1</algorithm>
</rule>
</tableRule>
--name 屬性指定唯一的名字,用于標(biāo)識(shí)不同的表規(guī)則。 內(nèi)嵌的 rule 標(biāo)簽則指定對(duì)物理表中的哪一列進(jìn)行拆分和使用什么路由算法。?
--columns 內(nèi)指定要拆分的列名字。?
--algorithm 使用 function 標(biāo)簽中的 name 屬性。連接表規(guī)則和具體路由算法。當(dāng)然,多個(gè)表規(guī)則可以連接到 同一個(gè)路由算法上。table 標(biāo)簽內(nèi)使用。讓邏輯表使用這個(gè)規(guī)則進(jìn)行分片。
2. function 標(biāo)簽
<function name="hash-int" class="org.opencloudb.route.function.PartitionByFileMap">
<property name="mapFile">partition-hash-int.txt</property>
</function>
--name 指定算法的名字。?
--class 制定路由算法具體的類名字。?
--property 為具體算法需要用到的一些屬性。
來(lái)源:https://www.cnblogs.com/fxwl/p/7990906.html
總結(jié)
- 上一篇: redis通过pipeline提升吞吐量
- 下一篇: redis 使用管道提升写入的性能[pi