Mycat安裝和配置檔案
Mycat安裝需要JDK;
官網下載然後解壓:http://www.mycat.io/ (備註Mycat庫:http://dl.mycat.io/)
啟動和關閉Mycat命令:
在bin目錄下輸入命令: ./mycat start 和 ./mycat stop
配置:(個人理解一些重要的配置檔案)
Mycat目錄格式參照常見格式(bin/conf/logs/lib)
server.xml: Mycat伺服器引數調整和使用者授權
schema.xml:邏輯庫定義和表以及分片定義的配置檔案(設定邏輯庫,表,資料節點資訊)
rule.xml:分片規則的配置檔案,分片規則的具體一些引數資訊單獨存放為檔案
日誌檔案:日誌存放在logs/log,每天一個檔案,日子的配置是在conf/log4j.xml中,可以根據需要調整輸出級別(建議debug,可以輸出更多資訊)
三.Mycat使用:(配置檔案解析)
3.1 server.xml:
3.1.1 <system>標籤:
配置所有mycat引數設定(解析器,埠(預設8066)等),使用<property>標籤配置
注意:q開頭被劃掉的為個人解讀版,待驗證
<system> <property name="nonePasswordLogin">0</property> <!-- 0為需要密碼登陸、1為不需要密碼登陸 ,預設為0--> <property name="useHandshakeV10">1</property><!-- q:傳送握手資料包 --> <property name="useSqlStat">0</property> <!-- 1為開啟實時統計、0為關閉 --> <property name="useGlobleTableCheck">0</property> <!-- 1為開啟全加班一致性檢測、0為關閉 --> <property name="sequnceHandlerType">2</property><!--q:"0"表示使用本地檔案的方式配置mycat全域性序列號,對應sequence_conf.properties檔案;"1"表示使用資料庫表的方式配置mycat全域性序列號--> <!-- <property name="useCompression">1</property>--> <!--1為開啟mysql壓縮協議--> <!-- <property name="fakeMySQLVersion">5.6.20</property>--> <!--設定模擬的MySQL版本號--> <!-- <property name="processorBufferChunk">40960</property> --> <!-- <property name="processors">1</property> <property name="processorExecutor">32</property> --> <property name="processorBufferPoolType">0</property> <!--預設為type 0: DirectByteBufferPool | type 1 ByteBufferArena | type 2 NettyBufferPool--> <!--預設是65535 64K 用於sql解析時最大文字長度 --> <!--<property name="maxStringLiteralLength">65535</property>--> <!--<property name="sequnceHandlerType">0</property>--> <!--<property name="backSocketNoDelay">1</property>--> <!--<property name="frontSocketNoDelay">1</property>--> <!--<property name="processorExecutor">16</property>--> <!-- <property name="serverPort">8066</property> <property name="managerPort">9066</property> <property name="idleTimeout">300000</property> <!-- 指定連線的空閒超時時間預設30分鐘,配置時,資料來源超時時間要小於 mycat的空閒超時時間--> <property name="processors">32</property> --> <!--分散式事務開關,0為不過濾分散式事務,1為過濾分散式事務(如果分散式事務內只涉及全域性表,則不過濾),2為不過濾分散式事務,但是記錄分散式事務日誌--> <property name="handleDistributedTransactions">0</property> <!-- off heap for merge/order/group/limit 1開啟 0關閉 --> <property name="useOffHeapForMerge">1</property> <!--單位為m--> <property name="memoryPageSize">64k</property> <!--單位為k--> <property name="spillsFileBufferSize">1k</property> <property name="useStreamOutput">0</property> <!--單位為m--> <property name="systemReserveMemorySize">384m</property> <!--是否採用zookeeper協調切換 --> <property name="useZKSwitch">true</property> <!-- XA Recovery Log日誌路徑 --> <!--<property name="XARecoveryLogBaseDir">./</property>--> <!-- XA Recovery Log日誌名稱 --> <!--<property name="XARecoveryLogBaseName">tmlog</property>--> <!-- 其他屬性: charset :連線的初始化字符集,預設utf8 txlsolation:前端連線的初始化事務隔離級別,預設是和mysql的repeated_read可重複讀隔離級別一致 sqlExecuteTimeout:sql執行超時時間,預設是300秒 --> </system>
3.1.2<user>
配置使用者引數
<user name="root"> <property name="password">123456</property> <property name="schemas">TESTDB</property> <!-- 表級 DML 許可權設定 --> <!-- <privileges check="false"> <schema name="TESTDB" dml="0110" > <table name="tb01" dml="0000"></table> <table name="tb02" dml="1111"></table> </schema> </privileges> --> </user>
3.1.3其他標籤
防火牆:
<!-- 全域性SQL防火牆設定 -->
<!--白名單可以使用萬用字元%或著*-->
<!--
<firewall>
<whitehost>
<host host="1*7.0.0.*" user="root"/>
</whitehost>
<blacklist check="false">
</blacklist>
</firewall>
-->
3.2 schema.xml
3.2.1 <schema>標籤
邏輯庫配置,可以有多個;如果不配置該標籤,所有表的配置都會屬於一個預設的邏輯庫.
<shceme>屬性:
name屬性:定義邏輯庫名,需要跟server.xml中的引用對應
checkSQLschema屬性:當該值設定為true時,執行SQL語句時,Mycat會去掉schema的字元(eg:"select * from TTESTDB.travelrecord"會被Mycat修改成"select * from travelrecord"),當SQL語句沒有schema指定的名字,則不會更改SQL語句, 如果將存在schema字元的sql語句發往資料庫會報"(ERROR 1146 (42S02): Table 'testdb.travelrecord' doesn’t exist)."錯誤
sqlMaxLimit屬性:設定每天sql語句自動加上limit屬性
dataNode屬性:繫結邏輯庫到某個具體的dataNode上,如果定義了這個屬性,這個邏輯庫就不能工作在分庫分表模式下,這個邏輯庫的所有操作都會直接作用到繫結的dataNode上,這個schema就可以用作讀寫分離和主從切換,可以直接方法,注意該屬性只能配置一個databas
子標籤<table>標籤:定義邏輯表,所有需要拆分的表都必須在這個標籤下定義.
<table>屬性:
name屬性:邏輯表表名,同一個schema標籤中table標籤name屬性唯一;
dataNode屬性:定義這個邏輯表所屬的dataNode,跟後面dataNode標籤name屬性對應(多個對應時可以使用如下方式);
<table name="testdb" dataNode="dn$0-2,multipleDn2$100-199" rule="auto-sharding- long"></table>
<dataNode name="dn" dataHost="localhost1" database="db$0-99"></dataNode>
<dataNode name="dn2" dataHost="localhost1" database=" db$0-99"></dataNode>
rule屬性:指定邏輯表使用的規則名,需要在rule.xml中有對應<tableRule>標籤.
ruleRequired屬性:指定是否繫結分片規則,為true時必須配置具體rule.
primaryKey屬性: 標記了邏輯表對應真實表的主鍵(例如:分片的規則是使用非主鍵進行分片的,那麼在使用主鍵查詢的時候,就會發送查詢語句到所有配置的DN上,如果使用該屬性配置真實表的主鍵,那麼mycat會快取主鍵與具體DN的資訊,那麼再次使用非主鍵進行查詢的時候就不會進行廣播式的查詢,就會直接傳送語句給具體的DN,但是儘管配置該屬性,如果快取並沒有命中的話,還是會發送語句給具體的DN 來獲取資料。)
type屬性: 定義邏輯表型別,global(全域性表)&無(普通表)
autoIncrement屬性: mysql對非自增長主鍵,使用last_insert_id() 是不會返回結果的,只會返回0.所以,只有定義了自增長主鍵的表,才可以用last_insert_id()返回主鍵值。 mycat提供了自增長主鍵功能,但是對應的mysql節點上資料表,沒有auto_increment,那麼在mycat層呼叫last_insert_id()也是不會返回結果的。如果使用這個功能,最好配合使用資料庫模式的全域性序列。
needAddLimit屬性:指定表是否需要自動給sql語句加上limit,這個屬性預設為true,預設100條,可以設定false關閉這個功能
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100"> <!-- auto sharding by id (long) --> <table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" /> <!-- global table is auto cloned to all defined data nodes ,so can join with any table whose sharding node is in the same data node --> <table name="company" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" /> <table name="goods" primaryKey="ID" type="global" dataNode="dn1,dn2" /> <!-- random sharding using mod sharind rule --> <table name="hotnews" primaryKey="ID" autoIncrement="true" dataNode="dn1,dn2,dn3" rule="mod-long" /> <!-- <table name="dual" primaryKey="ID" dataNode="dnx,dnoracle2" type="global" needAddLimit="false"/> <table name="worker" primaryKey="ID" dataNode="jdbc_dn1,jdbc_dn2,jdbc_dn3" rule="mod-long" /> --> <table name="employee" primaryKey="ID" dataNode="dn1,dn2" rule="sharding-by-intfile" /> <table name="customer" primaryKey="ID" dataNode="dn1,dn2" rule="sharding-by-intfile"> <childTable name="orders" primaryKey="ID" joinKey="customer_id" parentKey="id"> <childTable name="order_items" joinKey="order_id" parentKey="id" /> </childTable> <childTable name="customer_addr" primaryKey="ID" joinKey="customer_id" parentKey="id" /> </table> <!-- <table name="oc_call" primaryKey="ID" dataNode="dn1$0-743" rule="latest-month-calldate" /> --> </schema>
<ChildTable>標籤: childTable標籤用於定義E-R分片的子表。通過標籤上的屬性與父表進行關聯。
joinKey屬性: 插入子表的時候會使用這個列的值查詢父表儲存的資料節點。
parentKey屬性:屬性指定的值一般為與父表建立關聯關係的列名。程式首先獲取joinkey的值,再通過**parentKey**屬性指定的列名產生查詢語句,通過執行該語句得到父表儲存在哪個分片上。從而確定子表儲存的位置。
<table name="customer" primaryKey="ID" dataNode="dn1,dn2"
rule="sharding-by-intfile">
<childTable name="orders" primaryKey="ID" joinKey="customer_id"
parentKey="id">
<childTable name="order_items" joinKey="order_id"
parentKey="id" />
</childTable>
<childTable name="customer_addr" primaryKey="ID" joinKey="customer_id"
parentKey="id" />
</table>
3.2.2 <dataNode>標籤
配置分片,表切分後需要配置對映到哪幾個資料庫,mycat的分片其實是庫的別名.
name屬性:定義資料節點名,唯一.
dataHost屬性: 定義該分片屬於哪個物理庫,與<datahost>標籤上的name屬性對應
dataBase屬性:定義該分片屬於資料庫例項上的物理庫
<dataNode name="dn1" dataHost="localhost1" database="db1" />
<dataNode name="dn2" dataHost="localhost1" database="db2" />
<dataNode name="dn3" dataHost="localhost1" database="db3" />
3.2.3 <dataHost>標籤
定義了物理庫分片對映,可配置讀寫分離,單庫和心跳語句
name屬性:標識dataHost標籤,唯一.
maxCon屬性:指定每個讀寫例項連線池最大連線.
minCon屬性:指定每個讀寫例項連線池最小連結,初始化連線池大小.
balance屬性:指定負載均衡型別
{"0" : 不開啟讀寫分離,所有操作由發往writeHost--"1" : 所有readHost和stand by writeHost參與select語句的負載均衡,即所有寫操作由第一個writeHost執行,讀操作由其他所有可用host參與-- "2" : 所有select操作隨機分發所有host--"3" : 1.4版本後新加入,所有select操作由writeHost對應的readHost執行,}
writeType屬性: 配置主從相關屬性
{"-1" : 不自動切換--"1" 預設值,自動切換--"2": 基於MySql主從同步狀態決定是否切換,心跳語句為show slace status -- "3" : 1.4.1,基於mysql galary cluster 的切換機制(叢集狀態下) ,心跳語句為show status like 'wsrep%'}.
dbType屬性:指定後端連線的資料庫目前支援二進位制的mysql協議,還有其他使用jdbc連結的資料庫.
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
connectionInitSql屬性:主要是當使用Oracla資料庫時,需要執行的初始化SQL語句就這個放到這裡面來
<heartbeat>: 指定用於物理庫進行心跳檢測的語句
<writeHost> <readHost>
指定後端資料庫的相關配置給mycat,用於例項化後端連線池。
host屬性:用於標識不同例項,一般writeHost我們使用*M1,readHost我們用*S1。
url屬性:後端例項連線地址,如果是使用native的dbDriver,則一般為address:port這種形式。用JDBC或其他的dbDriver,則需要特殊指定。當使用JDBC時則可以這麼寫:jdbc:mysql://localhost:3306/。
user屬性:後端儲存例項需要的使用者名稱字
password屬性:後端儲存例項需要的密碼
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM1" url="localhost:3306" user="root"
password="123456">
<!-- can have multi read hosts -->
<readHost host="hostS2" url="192.168.1.200:3306" user="root" password="xxx" />
</writeHost>
<writeHost host="hostS1" url="localhost:3316" user="root"
password="123456" />
<!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> -->
</dataHost>
3.3 rule.xml
配置具體的表分片規則