myCat schema.xml詳解

schema.xml 是mycat重要的配置文件之一,管理者mycat的邏輯庫、表、分片規則、DataNode以及DataSource。想要了解使用mycat就要弄清楚schema裏面的標籤含義,下面將介紹一下schema裏面的詳細內容。java

首先 mycat自帶的schema.xml 以下所示:node

 
  1. <?xml version="1.0"?>
  2. <!DOCTYPE mycat:schema SYSTEM "schema.dtd">
  3. <mycat:schema xmlns:mycat="http://org.opencloudb/" >
  4.  
  5. <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
  6. <!-- auto sharding by id (long) -->
  7. <table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
  8.  
  9. <!-- global table is auto cloned to all defined data nodes ,so can join
  10. with any table whose sharding node is in the same data node -->
  11. <table name="company" primaryKey="ID" dataNode="dn3,dn2,dn1" rule="mod-long"/>
  12. <table name="goods" primaryKey="ID" type="global" dataNode="dn1,dn2" />
  13. <!-- random sharding using mod sharind rule -->
  14. <table name="hotnews" primaryKey="ID" dataNode="dn1,dn2,dn3"
  15. rule="mod-long" />
  16. <!-- <table name="dual" primaryKey="ID" dataNode="dnx,dnoracle2" type="global"
  17. needAddLimit="false"/> <table name="worker" primaryKey="ID" dataNode="jdbc_dn1,jdbc_dn2,jdbc_dn3"
  18. rule="mod-long" /> -->
  19. <table name="employee" primaryKey="ID" dataNode="dn1,dn2"
  20. rule="sharding-by-intfile" />
  21. <table name="customer" primaryKey="ID" dataNode="dn1,dn2"
  22. rule="sharding-by-intfile">
  23. <childTable name="orders" primaryKey="ID" joinKey="customer_id"
  24. parentKey="id">
  25. <childTable name="order_items" joinKey="order_id"
  26. parentKey="id" />
  27. </childTable>
  28. <childTable name="customer_addr" primaryKey="ID" joinKey="customer_id"
  29. parentKey="id" />
  30. </table>
  31. <!-- <table name="oc_call" primaryKey="ID" dataNode="dn1$0-743" rule="latest-month-calldate"
  32. /> -->
  33. </schema>
  34. <!-- <dataNode name="dn1$0-743" dataHost="localhost1" database="db$0-743"
  35. /> -->
  36. <dataNode name="dn1" dataHost="localhost1" database="db1" />
  37. <dataNode name="dn2" dataHost="localhost1" database="db2" />
  38. <dataNode name="dn3" dataHost="localhost1" database="db3" />
  39. <!--<dataNode name="dn4" dataHost="sequoiadb1" database="SAMPLE" />
  40. <dataNode name="jdbc_dn1" dataHost="jdbchost" database="db1" />
  41. <dataNode name="jdbc_dn2" dataHost="jdbchost" database="db2" />
  42. <dataNode name="jdbc_dn3" dataHost="jdbchost" database="db3" /> -->
  43. <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
  44. writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
  45. <heartbeat>select user()</heartbeat>
  46. <!-- can have multi write hosts -->
  47. <writeHost host="hostM1" url="10.202.4.39:3306" user="root"
  48. password="sf123456">
  49. <!-- can have multi read hosts -->
  50. <!--<readHost host="hostS2" url="192.168.1.200:3306" user="root" password="xxx" />-->
  51. </writeHost>
  52. <!--<writeHost host="hostS1" url="localhost:3316" user="root"-->
  53. <!--password="123456" />-->
  54. <!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> -->
  55. </dataHost>
  56. <!--
  57. <dataHost name="sequoiadb1" maxCon="1000" minCon="1" balance="0" dbType="sequoiadb" dbDriver="jdbc">
  58. <heartbeat> </heartbeat>
  59. <writeHost host="hostM1" url="sequoiadb://1426587161.dbaas.sequoialab.net:11920/SAMPLE" user="jifeng" password="jifeng"></writeHost>
  60. </dataHost>
  61.  
  62.  <dataHost name="oracle1" maxCon="1000" minCon="1" balance="0" writeType="0" dbType="oracle" dbDriver="jdbc"> <heartbeat>select 1 from dual</heartbeat>
  63. <connectionInitSql>alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss'</connectionInitSql>
  64. <writeHost host="hostM1" url="jdbc:oracle:thin:@127.0.0.1:1521:nange" user="base" password="123456" > </writeHost> </dataHost>
  65.  
  66. <dataHost name="jdbchost" maxCon="1000" minCon="1" balance="0" writeType="0" dbType="mongodb" dbDriver="jdbc">
  67. <heartbeat>select user()</heartbeat>
  68. <writeHost host="hostM" url="mongodb://192.168.0.99/test" user="admin" password="123456" ></writeHost> </dataHost>
  69.  
  70. <dataHost name="sparksql" maxCon="1000" minCon="1" balance="0" dbType="spark" dbDriver="jdbc">
  71. <heartbeat> </heartbeat>
  72. <writeHost host="hostM1" url="jdbc:hive2://feng01:10000" user="jifeng" password="jifeng"></writeHost> </dataHost> -->
  73.  
  74. <!-- <dataHost name="jdbchost" maxCon="1000" minCon="10" balance="0" dbType="mysql"
  75. dbDriver="jdbc"> <heartbeat>select user()</heartbeat> <writeHost host="hostM1"
  76. url="jdbc:mysql://localhost:3306" user="root" password="123456"> </writeHost>
  77. </dataHost> -->
  78. </mycat:schema>

 

一、schema 標籤mysql

 
  1. <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1,dn2,dn3" >
  • schemasql

    schema標籤用來定義mycat實例中的邏輯庫,mycat能夠有多個邏輯庫,每一個邏輯庫都有本身的相關配置。可使用schema標籤來劃分這些不一樣的邏輯庫。mongodb

        若是不配置schema標籤,全部表的配置會屬於同一個默認的邏輯庫。數據庫

        邏輯庫的概念和MySql的database的概念同樣,咱們在查詢兩個不一樣邏輯庫中的表的時候,須要切換到該邏輯庫下進行查詢。後端

注意:進行查詢的時候須要在server.xml配置相關用戶權限信息 ,這個隨後講解緩存

  • dataNodesession

        該標籤用於綁定邏輯庫到某個具體的database上。oracle

  • checkSQLschema 

    當該值爲true時,例如咱們執行語句select * from TESTDB.company 。mycat會把語句修改成 select * from company 去掉TESTDB。

  • sqlMaxLimit 

    當該值設置爲某個數值時,每條執行的sql語句,若是沒有加上limit語句,Mycat會自動加上對應的值。不寫的話,默認返回全部的值。

須要注意的是,若是運行的schema爲非拆分庫的,那麼該屬性不會生效。須要本身sql語句加limit。

二、table 標籤

 
  1. <table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />

table標籤訂義了mycat中的邏輯表,全部須要拆分的表都須要在這個標籤中定義。

  • name屬性

    name屬性表明了邏輯表的表名,同一個schema中name標籤中定義的名字必須惟一。如同咱們在數據庫執行create table 命令指定的名字同樣。

  • dataNode屬性

    定義這個邏輯表所屬的dataNode,該屬性的值須要和dataNode標籤中的name值相對應。若是須要定義的dn很是多,可使用以下方法定義

 
  1. <table name="travelrecord" dataNode="multipleDn$0-99,multipleDn2$100-199" rule="auto-sharding- long"></table>
 
  1. <dataNode name="multipleDn" dataHost="localhost1" database="db$0-99" ></dataNode>
  2. <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標籤

 
  1. <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.Drive

writeHost readHost

指定後端數據庫的相關配置給mycat,用於實例化後端鏈接池。

相關文章
相關標籤/搜索