Schema.xml 做爲 MyCat 中重要的配置文件之一,管理着 MyCat 的邏輯庫、表、分片規則、DataNode 以及 DataSource。弄懂這些配置,是正確使用 MyCat 的前提。這裏就一層層對該文件進行解析。html
schema 標籤用於定義 MyCat 實例中的邏輯庫,如:java
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100"></schema>
配置邏輯庫的名字(即數據庫實例名);node
用於配置該邏輯庫默認的分片。沒有經過table標籤配置的表,就會走到默認的分片上。這裏注意沒有配置在table標籤的表,用工具查看是沒法顯示的,可是能夠正常使用。mysql
若是沒有配置dataNode屬性,則沒有配置在table標籤的表,是沒法使用的。注意,dual表在mycat中,也被視爲一個表。
另外,經過mycat建表,而該表並無提早配置table標籤,則mycat會找到默認的dataNode,並把表建在默認的dataNode上。若是沒有配置默認dataNode,則mycat會報錯。
而若是該表有配置table標籤,則表會分別在table標籤指定的dataNode上建表。sql
當該值設置爲 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
語句的最好是不帶這個字段。mongodb
false:會報錯數據庫
當該值設置爲某個數值時。每條執行的 SQL 語句,若是沒有加上 limit 語句,MyCat 也會自動的加上所對應
的值。例如設置值爲 100,執行select * from TESTDB.travelrecord;的效果爲和執行select * from
TESTDB.travelrecord limit 100;相同。
設置該值的話,MyCat 默認會把查詢到的信息所有都展現出來,形成過多的輸出。因此,在正常使用中,還
是建議加上一個值,用於減小過多的數據返回。
72
固然 SQL 語句中也顯式的指定 limit 的大小,不受該屬性的約束。
須要注意的是,若是運行的 schema 爲非拆分庫的,那麼該屬性不會生效。須要手動添加 limit 語句。後端
<table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" ></table>
定義邏輯表的表名,這個名字就如同我在數據庫中執行 create table 命令指定的名字同樣,同個 schema 標 籤中定義的名字必須惟一。
定義這個邏輯表所屬的 dataNode, 該屬性的值須要和 dataNode 標籤中 name 屬性的值相互對應。若是需 要定義的 dn 過多 可使用以下的方法減小配置: ```xml <table name="travelrecord" dataNode="multipleDn$0-99,multipleDn2$100-199" rule="auto-shardinglong" ></table> <dataNode name="multipleDn$0-99" dataHost="localhost1" database="db$0-99" ></dataNode> <dataNode name="multipleDn2$100-199" dataHost="localhost1" database=" db$100-199" ></dataNode> ``` 這裏須要注意的是 database 屬性所指定的真實 database name 須要在後面添加一個,例如上面的例子中, 我須要在真實的 mysql 上創建名稱爲 dbs0 到 dbs99 的 database。
該屬性用於指定邏輯表要使用的規則名字,規則名字在 rule.xml 中定義,必須與 tableRule 標籤中 name 屬 性屬性值一一對應。
該屬性用於指定表是否綁定分片規則,若是配置爲 true,但沒有配置具體 rule 的話 ,程序會報錯
該邏輯表對應真實表的主鍵,例如:分片的規則是使用非主鍵進行分片的,那麼在使用主鍵查詢的時候,就 會發送查詢語句到全部配置的 DN 上,若是使用該屬性配置真實表的主鍵。難麼 MyCat 會緩存主鍵與具體 DN 的 信息,那麼再次使用非主鍵進行查詢的時候就不會進行廣播式的查詢,就會直接發送語句給具體的 DN,可是儘管 配置該屬性,若是緩存並無命中的話,仍是會發送語句給具體的 DN,來得到數據。
該屬性定義了邏輯表的類型,目前邏輯表只有「全局表」和」普通表」兩種類型。對應的配置: 全局表:global。 普通表:不指定該值爲 globla 的全部表。
mysql 對非自增加主鍵,使用 last_insert_id()是不會返回結果的,只會返回 0。因此,只有定義了自增加主 鍵的表才能夠用 last_insert_id()返回主鍵值。 mycat 目前提供了自增加主鍵功能,可是若是對應的 mysql 節點上數據表,沒有定義 auto_increment,那 麼在 mycat 層調用 last_insert_id()也是不會返回結果的。 因爲 insert 操做的時候沒有帶入分片鍵,mycat 會先取下這個表對應的全局序列,而後賦值給分片鍵。這樣 才能正常的插入到數據庫中,最後使用 last_insert_id()纔會返回插入的分片鍵值。 若是要使用這個功能最好配合使用數據庫模式的全局序列。 74 使用 autoIncrement=「true」 指定這個表有使用自增加主鍵,這樣 mycat 纔會不拋出分片鍵找不到的異 常。 使用 autoIncrement=「false」 來禁用這個功能,固然你也能夠直接刪除掉這個屬性。默認就是禁用的。
使用方式添加 subTables="t_order$1-2,t_order3"。
目前分表 1.6 之後開始支持 而且 dataNode 在分表條件下只能配置一個,分表條件下不支持各類條件的join 語句。緩存
指定表是否須要自動的在每一個語句後面加上 limit 限制。因爲使用了分庫分表,數據量有時會特別巨大。這時候執行查詢語句,若是恰巧又忘記了加上數量限制的話。那麼查詢全部的數據出來,也夠等上一小會兒的。
因此,mycat 就自動的爲咱們加上 LIMIT 100。固然,若是語句中有 limit,就不會在次添加了。這個屬性默認爲 true,你也能夠設置成 false`禁用掉默認行爲。session
childTable 標籤用於定義 E-R 分片的子表。經過標籤上的屬性與父表進行關聯。
childTable 標籤的相關屬性:
屬性名 | 值 | 數量限制 |
---|---|---|
name | String | (1) |
joinKey | String | (1) |
parentKey | String | (1) |
primaryKey | String | (0..1) |
needAddLimit | boolean | (0..1) |
定義子表的表名。
插入子表的時候會使用這個列的值查找父表存儲的數據節點。
屬性指定的值通常爲與父表創建關聯關係的列名。程序首先獲取 joinkey 的值,再經過 parentKey 屬性指定的列名產生查詢語句,經過執行該語句獲得父表存儲在哪一個分片上。從而肯定子表存儲的位置。
同 table 標籤所描述的。
同 table 標籤所描述的。
<dataNode name="dn1" dataHost="lch3307" database="db1" ></dataNode>
dataNode 標籤訂義了 MyCat 中的數據節點,也就是咱們一般說所的數據分片。一個 dataNode 標籤就是
一個獨立的數據分片。
例子中所表述的意思爲:使用名字爲 lch3307 數據庫實例上的 db1 物理數據庫,這就組成一個數據分片,最後,咱們使用名字 dn1 標識這個分片。
dataNode 標籤的相關屬性:
屬性 | 值 | 數量限制 |
---|---|---|
name | String | (1) |
dataHost | String | (1) |
database | String | (1) |
定義數據節點的名字,這個名字須要是惟一的,咱們須要在 table 標籤上應用這個名字,來創建表與分片對應的關係。
該屬性用於定義該分片屬於哪一個數據庫實例的,屬性值是引用 dataHost 標籤上定義的 name 屬性。
該屬性用於定義該分片屬性哪一個具體數據庫實例上的具體庫,由於這裏使用兩個緯度來定義分片,就是:實 例+具體的庫。由於每一個庫上創建的表和表結構是同樣的。因此這樣作就能夠輕鬆的對錶進行水平拆分。
做爲 Schema.xml 中最後的一個標籤,該標籤在 mycat 邏輯庫中也是做爲最底層的標籤存在,直接定義了具體的數據庫實例、讀寫分離配置和心跳語句。如今咱們就解析下這個標籤。
dataHost 標籤的相關屬性:
屬性名 | 值 | 數量限制 |
---|---|---|
name | String | (1) |
maxCon | Integer | (1) |
minCon | Integer | (1) |
balance | Integer | (1) |
writeType | Integer | (1) |
dbType | String | (1) |
dbDriver | String | (1) |
惟一標識 dataHost 標籤,供上層的標籤使用。
指定每一個讀寫實例鏈接池的最大鏈接。也就是說,標籤內嵌套的 writeHost、readHost 標籤都會使用這個屬性的值來實例化出鏈接池的最大鏈接數。
指定每一個讀寫實例鏈接池的最小鏈接,初始化鏈接池的大小。
負載均衡類型,目前的取值有 3 種:
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 不負擔讀壓力,注意 balance=3 只在 1.4 及其之後版本有,1.3 沒有。
負載均衡類型,目前的取值有 3 種:
指定後端鏈接的數據庫類型,目前支持二進制的 mysql 協議,還有其餘使用 JDBC 鏈接的數據庫。例如:
mongodb、oracle、spark 等。
指定鏈接後端數據庫使用的 Driver,目前可選的值有 native 和 JDBC。使用 native 的話,由於這個值執行的是二進制的 mysql 協議,因此可使用 mysql 和 maridb。其餘類型的數據庫則須要使用 JDBC 驅動來支持。
從 1.6 版本開始支持 postgresql 的 native 原始協議。
若是使用 JDBC 的話須要將符合 JDBC 4 標準的驅動 JAR 包放到 MYCAT\lib 目錄下,並檢查驅動 JAR 包中包括以下目錄結構的文件:META-INF\services\java.sql.Driver。在這個文件內寫上具體的 Driver 類名,例如:
com.mysql.jdbc.Driver。
-1 表示不自動切換
1 默認值,自動切換
2 基於 MySQL 主從同步的狀態決定是否切換心跳語句爲 show slave status
3 基於 MySQL galary cluster 的切換機制(適合集羣)(1.4.1) 心跳語句爲 show status like ‘wsrep%’
若是配置了這個屬性 writeHost 下面的 readHost 仍舊可用,默認 0 可配置(0、1)。
這個標籤內指明用於和後端數據庫進行心跳檢查的語句。例如,MYSQL 可使用 select user(),Oracle 可使用 select 1 from dual 等。
這個標籤還有一個 connectionInitSql 屬性,主要是當使用 Oracla 數據庫時,須要執行的初始化 SQL 語句就這個放到這裏面來。例如:alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss'
1.4 主從切換的語句必須是:show slave status
這兩個標籤都指定後端數據庫的相關配置給 mycat,用於實例化後端鏈接池。惟一不一樣的是,writeHost 指定寫實例、readHost 指定讀實例,組着這些讀寫實例來知足系統的要求。
在一個 dataHost 內能夠定義多個 writeHost 和 readHost。可是,若是 writeHost 指定的後端數據庫宕機, 那麼這個 writeHost 綁定的全部 readHost 都將不可用。另外一方面,因爲這個 writeHost 宕機系統會自動的檢測到,並切換到備用的 writeHost 上去。
這兩個標籤的屬性相同,這裏就一塊兒介紹。
用於標識不一樣實例,通常 writeHost 咱們使用M1,readHost 咱們用S1。
後端實例鏈接地址,若是是使用 native 的 dbDriver,則通常爲 address:port 這種形式。用 JDBC 或其餘的
dbDriver,則須要特殊指定。當使用 JDBC 時則能夠這麼寫:jdbc:mysql://localhost:3306/。
後端存儲實例須要的用戶名字。
後端存儲實例須要的密碼。
權重 配置在 readhost 中做爲讀節點的權重(1.4 之後)。
是否對密碼加密默認 0 否 如須要開啓配置 1,同時使用加密程序對密碼加密,加密命令爲: 執行 mycat jar 程序(1.4.1 之後):