版權聲明:本文爲博主原創文章,未經博主容許不得轉載。 https://blog.csdn.net/linlinv3/article/details/51777324
schema.xml 是mycat重要的配置文件之一,管理者mycat的邏輯庫、表、分片規則、DataNode以及DataSource。想要了解使用mycat就要弄清楚schema裏面的標籤含義,下面將介紹一下schema裏面的詳細內容。
首先 mycat自帶的schema.xml 以下所示:
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/" >
<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" dataNode="dn3,dn2,dn1" rule="mod-long"/>
<table name="goods" primaryKey="ID" type="global" dataNode="dn1,dn2" />
<!-- random sharding using mod sharind rule -->
<table name="hotnews" primaryKey="ID" 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>
<!-- <dataNode name="dn1$0-743" dataHost="localhost1" database="db$0-743"
/> -->
<dataNode name="dn1" dataHost="localhost1" database="db1" />
<dataNode name="dn2" dataHost="localhost1" database="db2" />
<dataNode name="dn3" dataHost="localhost1" database="db3" />
<!--<dataNode name="dn4" dataHost="sequoiadb1" database="SAMPLE" />
<dataNode name="jdbc_dn1" dataHost="jdbchost" database="db1" />
<dataNode name="jdbc_dn2" dataHost="jdbchost" database="db2" />
<dataNode name="jdbc_dn3" dataHost="jdbchost" database="db3" /> -->
<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="10.202.4.39:3306" user="root"
password="sf123456">
<!-- 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>
<!--
<dataHost name="sequoiadb1" maxCon="1000" minCon="1" balance="0" dbType="sequoiadb" dbDriver="jdbc">
<heartbeat> </heartbeat>
<writeHost host="hostM1" url="sequoiadb://1426587161.dbaas.sequoialab.net:11920/SAMPLE" user="jifeng" password="jifeng"></writeHost>
</dataHost>
<dataHost name="oracle1" maxCon="1000" minCon="1" balance="0" writeType="0" dbType="oracle" dbDriver="jdbc"> <heartbeat>select 1 from dual</heartbeat>
<connectionInitSql>alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss'</connectionInitSql>
<writeHost host="hostM1" url="jdbc:oracle:thin:@127.0.0.1:1521:nange" user="base" password="123456" > </writeHost> </dataHost>
<dataHost name="jdbchost" maxCon="1000" minCon="1" balance="0" writeType="0" dbType="mongodb" dbDriver="jdbc">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM" url="mongodb://192.168.0.99/test" user="admin" password="123456" ></writeHost> </dataHost>
<dataHost name="sparksql" maxCon="1000" minCon="1" balance="0" dbType="spark" dbDriver="jdbc">
<heartbeat> </heartbeat>
<writeHost host="hostM1" url="jdbc:hive2://feng01:10000" user="jifeng" password="jifeng"></writeHost> </dataHost> -->
<!-- <dataHost name="jdbchost" maxCon="1000" minCon="10" balance="0" dbType="mysql"
dbDriver="jdbc"> <heartbeat>select user()</heartbeat> <writeHost host="hostM1"
url="jdbc:mysql://localhost:3306" user="root" password="123456"> </writeHost>
</dataHost> -->
</mycat:schema>
一、schema 標籤
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1,dn2,dn3" >
schema
schema標籤用來定義mycat實例中的邏輯庫,mycat能夠有多個邏輯庫,每一個邏輯庫都有本身的相關配置。可使用schema標籤來劃分這些不一樣的邏輯庫。
若是不配置schema標籤,全部表的配置會屬於同一個默認的邏輯庫。
邏輯庫的概念和MySql的database的概念同樣,咱們在查詢兩個不一樣邏輯庫中的表的時候,須要切換到該邏輯庫下進行查詢。
注意:進行查詢的時候須要在server.xml配置相關用戶權限信息 ,這個隨後講解
dataNode
該標籤用於綁定邏輯庫到某個具體的database上。
checkSQLschema
當該值爲true時,例如咱們執行語句select * from TESTDB.company 。mycat會把語句修改成 select * from company 去掉TESTDB。
sqlMaxLimit
當該值設置爲某個數值時,每條執行的sql語句,若是沒有加上limit語句,Mycat會自動加上對應的值。不寫的話,默認返回全部的值。
須要注意的是,若是運行的schema爲非拆分庫的,那麼該屬性不會生效。須要本身sql語句加limit。
二、table 標籤
<table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
table標籤訂義了mycat中的邏輯表,全部須要拆分的表都須要在這個標籤中定義。
name屬性
name屬性表明了邏輯表的表名,同一個schema中name標籤中定義的名字必須惟一。如同咱們在數據庫執行create table 命令指定的名字同樣。
dataNode屬性
定義這個邏輯表所屬的dataNode,該屬性的值須要和dataNode標籤中的name值相對應。若是須要定義的dn很是多,可使用以下方法定義
<table name="travelrecord" dataNode="multipleDn$0-99,multipleDn2$100-199" rule="auto-sharding- long" ></table>
<dataNode name="multipleDn" dataHost="localhost1" database="db$0-99" ></dataNode>
<dataNode name="multipleDn2" dataHost="localhost1" database=" db$0-99" ></dataNode>
database屬性所指的真實databas name須要在mysql中存在,好比上面例子中,咱們須要在mysql中創建名稱爲dbs0到dbs99的database 。
rule屬性
該屬性指定邏輯表使用的規則名字,規則名字在rule.xml中定義,必須與tableRule標籤中name屬性對應。
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
指定表是否須要自動的在每一個語句後面加上limit限制,因爲使用了分庫分表,數據量有時候會特別龐大,這時候執行查詢語句,忘記加上limt就會等很久,因此mycat自動爲咱們加上了limit 100,這個屬性默認爲true,能夠本身設置爲false禁用。
三、dataNode標籤
<dataNode name="dn1" dataHost="localhost1" database="db1" />
datanode標籤訂義了mycat中的數據節點,也就是咱們所說的數據分片。一個datanode標籤就是一個獨立的數據分片。
例子中的表述的意思爲,使用名字爲localhost1數據庫實例上的db1物理數據庫,這就組成一個數據分片,最後咱們用dn1來標示這個分片。
name:定義數據節點的名字,這個名字須要惟一。咱們在table標籤上用這個名字來創建表與分片對應的關係
dataHost
用於定義該分片屬於哪一個數據庫實例,屬性與datahost標籤上定義的name對應
database
用於定義該分片屬於數據庫實例上 的具體庫。
四、dataHost標籤
這個標籤直接定義了具體數據庫實例,讀寫分離配置和心跳語句。
name
惟一標示dataHost標籤,供上層使用
maxCon
指定每一個讀寫實例鏈接池的最大鏈接。
minCon
指定每一個讀寫實例鏈接池的最小鏈接,初始化鏈接池的大小
balance
負載均稱類型
0:不開啓讀寫分離機制,全部讀操做都發送到當前可用的writeHost上
1:所有的readHost與stand by writeHost參與select語句的負載均衡,簡單的說,當雙主雙從模式(M1-S1,M2-S2 而且M1 M2互爲主備),正常狀況下,M2,S1,S2都參與select語句的負載均衡。
2:全部讀操做都隨機的在writeHost、readHost上分發
3:全部讀請求隨機的分發到writeHst對應的readHost執行,writeHost不負擔讀寫壓力。(1.4以後版本有)
writeType屬性
負載均衡類型。
0:全部的寫操做發送到配置的第一個writeHost,第一個掛了切換到第二個。切換記錄在文件dnindex.properties
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,用於實例化後端鏈接池。
---------------------
做者:糖糖_
來源:CSDN
原文:https://blog.csdn.net/linlinv3/article/details/51777324
版權聲明:本文爲博主原創文章,轉載請附上博文連接!java