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.xml1、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,dbs2.
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。
-
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標簽下的屬性,一般是上線后,需要根據實際運行的情況,分析后調優的時候進行修改。
-
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。
- 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 同Table3、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 status3 基於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.DriverwriteHost 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.xmlule.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 標簽內使用。讓邏輯表使用這個規則進行分片。
- function 標簽
<function name="hash-int" class="org.opencloudb.route.function.PartitionByFileMap">
<property name="mapFile">partition-hash-int.txt</property>
</function>
--name 指定算法的名字。
--class 制定路由算法具體的類名字。
--property 為具體算法需要用到的一些屬性。