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