Mycat 配置說明(schema.xml )


Schema.xml 作為 MyCat中重要的配置文件之一,管理着 MyCat的邏輯庫、表、分片規則、DataNode以

及DataSource。弄懂這些配置,是正確使用MyCat的前提。

schema 標簽

該標簽用於定義MyCat實例中的邏輯庫,MyCat可以有多個邏輯庫,每個邏輯庫都有自己的相關配置。可以使用 schema 標簽來划分這些不同的邏輯庫。

<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">

<table name="tableName" primaryKey="id" dataNode="dn1,dn2" rule="rule1"/>

</schema>

  • 相關屬性
    • dataNode :字符串,分片節點名稱,多個以","號分隔
    • checkSQLschema :布爾類型,當該值設置為 true 時,如果我們執行語句**select * from TESTDB.travelrecord;**則MyCat 會把語句修改為**select * from travelrecord;**。即把表示schema的字符去掉,避免發送到后端數據庫執行時報**(ERROR 1146 (42S02): Table 'testdb.travelrecord' doesn't exist)。** 不過,即使設置該值為 true ,如果語句所帶的是並非是schema指定的名字,例如:**select * from db1.travelrecord;** 那么MyCat並不會刪除db1這個字段,如果沒有定義該庫的話則會報錯,所以在提供SQL語句的最好是不帶這個字段。
    • sqlMaxLimit :int 類型,表示每條執行的SQL語句,如果沒有加上limit語句,MyCat也會自動的加上所對應的值。例如設置值為100,執行**select * from TESTDB.travelrecord;**的效果為和執行**select * from TESTDB.travelrecord limit 100;**相同。 設置該值的話,MyCat默認會把查詢到的信息全部都展示出來,造成過多的輸出。所以,在正常使用中,還是建議加上一個值,用於減少過多的數據返回。 當然SQL語句中也顯式的指定limit的大小,不受該屬性的約束。 需要注意的是,如果運行的 schema為非拆分庫的,那么該屬性不會生效。需要手動添加limit語句。

table 標簽

該標簽屬於 schema 的子標簽,用於定義了MyCat中的邏輯表,所有需要拆分的表都需要在這個標簽中定義。

  • 相關屬性
    • name:定義邏輯表的表名,這個名字就如同我在數據庫中執行create table命令指定的名字一樣,同個schema標簽中定義的名字必須唯一。
    • dataNode:定義這個邏輯表所屬的dataNode, 該屬性的值需要和dataNode標簽中name 屬性的值相互對應。
    • rule:該屬性用於指定邏輯表要使用的規則名字,規則名字在rule.xml中定義,必須與tableRule標簽中name屬性屬性值一一對應
    • ruleRequired :該屬性用於指定表是否綁定分片規則,如果配置為true,但沒有配置具體rule的話 ,程序會報錯
    • type:該屬性定義了邏輯表的類型,目前邏輯表只有"全局表"和"普通表"兩種類型。對應的配置:
      • 全局表:global
      • 普通表:不指定該值為globla的所有表
    • needAddLimit :指定表是否需要自動的在每個語句后面加上limit限制,這個屬性默認為 true
    • primaryKey :該邏輯表對應真實表的主鍵,例如:分片的規則是使用非主鍵進行分片的,那么在使用主鍵查詢的時候,就會發送查詢語句到所有配置的 DN上,如果使用該屬性配置真實表的主鍵。難么MyCat會緩存主鍵與具體DN 的信息,那么再次使用非主鍵進行查詢的時候就不會進行廣播式的查詢,就會直接發送語句給具體的 DN,但是盡管配置該屬性,如果緩存並沒有命中的話,還是會發送語句給具體的 DN,來獲得數據。
    • autoIncrement :mysql對非自增長主鍵,使用last_insert_id()是不會返回結果的,只會返回0。所以,只有定義了自增長主鍵的表才可以用last_insert_id()返回主鍵值。 mycat目前提供了自增長主鍵功能,但是如果對應的 mysql節點上數據表,沒有定義auto_increment,那么在mycat層調用last_insert_id()也是不會返回結果的。 由於insert操作的時候沒有帶入分片鍵,mycat會先取下這個表對應的全局序列,然后賦值給分片鍵。這樣才能正常的插入到數據庫中,最后使用last_insert_id()才會返回插入的分片鍵值。 如果要使用這個功能最好配合使用數據庫模式的全局序列。
      • 使用autoIncrement="true" 指定這個表有使用自增長主鍵,這樣mycat才會不拋出分片鍵找不到的異常。
      • 使用 autoIncrement="false" 來禁用這個功能,當然你也可以直接刪除掉這個屬性。默認就是禁用的。
    • subTables :配置分表規則,並且在分表條件下,只能配置一個 dataNode,並且分表條件下不支持各種條件的 join 語句。配置實例如: subTables="t_order$1-2,t_order3" ,

      分庫模式下是:insert into table(xxx)values(1,name);

      router:{

      node1:insert into table(xxx)values(1,name) ,datanode1,

      node2:insert into table(xxx)values(2,name) ,datanode2,

      node3:insert into table(xxx)values(3,name) ,datanode3,

      },

         

      分表模式是: insert into table(xxx)values(1,name);

      router:{

      node1:insert into table1(xxx)values(1,name) ,datanode1,

      node2:insert into table2(xxx)values(2,name) ,datanode1,

      node3:insert into table3(xxx)values(3,name) ,datanode1,

      },

         

childTable 標簽

該標簽屬於 table 的子標簽,該標簽用於定義E-R分片的子表,通過標簽上的屬性與父表進行關聯。

  • 相關屬性
    • name :定義子表的表名
    • joinKey :插入子表的時候會使用這個列的值查找父表存儲的數據節點。
    • parentKey :屬性指定的值一般為與父表建立關聯關系的列名。
    • primaryKey :該邏輯表對應真實表的主鍵,例如:分片的規則是使用非主鍵進行分片的,那么在使用主鍵查詢的時候,就會發送查詢語句到所有配置的 DN上,如果使用該屬性配置真實表的主鍵。難么MyCat會緩存主鍵與具體DN 的信息,那么再次使用非主鍵進行查詢的時候就不會進行廣播式的查詢,就會直接發送語句給具體的 DN,但是盡管配置該屬性,如果緩存並沒有命中的話,還是會發送語句給具體的 DN,來獲得數據。
    • needAddLimit :指定表是否需要自動的在每個語句后面加上limit限制,這個屬性默認為 true

dataNode 標簽

dataNode 標簽定義了 MyCat中的數據節點,也就是我們通常說所的數據分片。一個dataNode 標簽就是

一個獨立的數據分片,比如我們要創建使用名字為lch3307數據庫實例上的db1物理數據庫,這就組成一個數據分片,最后,我們使用名字dn1標識這個分片,實例配置如下:

<dataNode name="dn1" dataHost="lch3307" database="db1"></dataNode>

  • 相關屬性
    • name :定義數據節點的名字,這個名字需要是唯一的,我們需要在 table標簽上應用這個名字,來建立表與分片對應的關系。
    • dataHost :該屬性用於定義該分片屬於哪個數據庫實例的,屬性值是引用 dataHost標簽上定義的name屬性
    • database:該屬性用於定義該分片屬性哪個具體數據庫實例上的具體庫,因為這里使用兩個緯度來定義分片,就是:實例+具體的庫。因為每個庫上建立的表和表結構是一樣的。所以這樣做就可以輕松的對表進行水平拆分。

dataHost標簽

該標簽在mycat邏輯庫中也是作為最底層的標簽存在,直接定義了具體的數據庫實例、讀寫分離配置和心跳語。

<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"

writeType="0" dbType="mysql" dbDriver="native">

<heartbeat>select user()</heartbeat>

<!-- 可以有多個寫入主機 -->

<!-- 第一個主機 -->

<writeHost host="hostM1" url="localhost:3306" user="root" password="123456">

<!-- balance=3 所有讀請求使用該服務器執行,可以有多個讀主機 -->

<readHost host="hostS1" url="localhost:3306" user="root" password="123456" />

</writeHost>

<!-- 第二個主機 -->

<writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/>

</dataHost>

  • 相關屬性
    • name :唯一標識dataHost 標簽
    • maxCon:指定每個讀寫實例連接池的最大連接。也就是說,標簽內嵌套的 writeHost、readHost標簽都會使用這個屬性的值來實例化出連接池的最大連接數
    • minCon :指定每個讀寫實例連接池的最小連接,初始化連接池的大小
    • balance:負載均衡類型,目前的取值有4 種:
      • 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",所有讀請求隨機的分發到wiriterHost對應的readhost執行,writerHost 不負擔讀壓力
    • dbType :指定后端連接的數據庫類型,目前支持二進制的mysql協議,還有其他使用 JDBC連接的數據庫。例如:mongodb、oracle、spark等。
    • dbDriver:指定連接后端數據庫使用的Driver,目前可選的值有native和 JDBC。使用native的話,因為這個值執行的是二進制的mysql協議,所以可以使用mysql、maridb 和 postgresql(1.6版本),其他類型的數據庫則需要使用 JDBC驅動來支持,如果使用JDBC的話需要將符合 JDBC 4標准的驅動JAR包放到 MYCAT\lib目錄下,並檢查驅動JAR包中包括如下目錄結構的文件:META-INF\services\java.sql.Driver,在這個文件內寫上具體的Driver 類名,例如:com.mysql.jdbc.Driver
    • switchType:主從數據庫切換類型,目前的取值有4種:
      • -1 表示不自動切換
      • 1 默認值,自動切換
      • 2 基於MySQL主從同步的狀態決定是否切換心跳語句為 show slave status
      • 3 基於MySQL galary cluster的切換機制(適合集群)心跳語句為 show status like 'wsrep%'
    • tempReadHostAvailable:如果配置了這個屬性writeHost 下面的readHost仍舊可用,默認0 可配置(0、1)

heartbeat標簽

這個標簽屬於dataHost的子標簽內指明用於和后端數據庫進行心跳檢查的語句。例如,MYSQL可以使用select user(),Oracle可以

使用select 1 from dual等。

這個標簽還有一個connectionInitSql 屬性,主要是當使用Oracla數據庫時,需要執行的初始化SQL語句就

這個放到這里面來。例如:alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss' ,示例代碼:

<heartbeat>select user()</heartbeat>

writeHost 和 readHost 標簽

這兩個標簽都屬於dataHost的子標簽,用於指定后端數據庫的相關配置給 mycat,用於實例化后端連接池。唯一不同的是,writeHost指

定寫實例、readHost指定讀實例,組着這些讀寫實例來滿足系統的要求。

在一個dataHost內可以定義多個writeHost和readHost。但是,如果writeHost指定的后端數據庫宕機,那么這個writeHost綁定的所有readHost都將不可用。另一方面,由於這個writeHost宕機系統會自動的檢測到,並切換到備用的writeHost上去。

  • 相關屬性
    • host:用於標識不同實例,一般writeHost我們使用*M1,readHost我們用*S1
    • url:后端實例連接地址,如果是使用native 的dbDriver,則一般為address:port 這種形式。用 JDBC或其他的

      dbDriver,則需要特殊指定。當使用JDBC 時則可以這么寫:jdbc:mysql://localhost:3306/

    • user:后端存儲實例需要的用戶名字
    • password :后端存儲實例需要的密碼
    • weight :權重,配置在readhost 中作為讀節點的權重
    • usingDecrypt :是否對密碼加密,默認否=0, 如需要開啟配置=1,同時使用加密程序對密碼加密,加密命令為:

      # java -cp Mycat-server-1.6-RELEASE.jar io.mycat.util.DecryptUtil 1:host:user:password

      其中 Mycat-server-1.6-RELEASE.jar 位於 mycat/lib 目錄中,1:host:user:password,其中 1 表示 db端加密標識

         

       

       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM