SUSE12SP3-Mycat(2)Schema.xml配置詳解

簡介

Schema.xml 做爲 MyCat 中重要的配置文件之一,管理着 MyCat 的邏輯庫、表、分片規則、DataNode 以及 DataSource。弄懂這些配置,是正確使用 MyCat 的前提。這裏就一層層對該文件進行解析。html

schema 標籤

schema 標籤用於定義 MyCat 實例中的邏輯庫,如:java

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

name屬性

配置邏輯庫的名字(即數據庫實例名);node

dataNode屬性

用於配置該邏輯庫默認的分片。沒有經過table標籤配置的表,就會走到默認的分片上。這裏注意沒有配置在table標籤的表,用工具查看是沒法顯示的,可是能夠正常使用。mysql

若是沒有配置dataNode屬性,則沒有配置在table標籤的表,是沒法使用的。注意,dual表在mycat中,也被視爲一個表。
另外,經過mycat建表,而該表並無提早配置table標籤,則mycat會找到默認的dataNode,並把表建在默認的dataNode上。若是沒有配置默認dataNode,則mycat會報錯。
而若是該表有配置table標籤,則表會分別在table標籤指定的dataNode上建表。sql

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
語句的最好是不帶這個字段。mongodb

false:會報錯數據庫

sqlMaxLimit屬性

當該值設置爲某個數值時。每條執行的 SQL 語句,若是沒有加上 limit 語句,MyCat 也會自動的加上所對應
的值。例如設置值爲 100,執行select * from TESTDB.travelrecord;的效果爲和執行select * from
TESTDB.travelrecord limit 100;
相同。
設置該值的話,MyCat 默認會把查詢到的信息所有都展現出來,形成過多的輸出。因此,在正常使用中,還
是建議加上一個值,用於減小過多的數據返回。
72
固然 SQL 語句中也顯式的指定 limit 的大小,不受該屬性的約束。
須要注意的是,若是運行的 schema 爲非拆分庫的,那麼該屬性不會生效。須要手動添加 limit 語句。後端

table 標籤

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

name 屬性

定義邏輯表的表名,這個名字就如同我在數據庫中執行 create table 命令指定的名字同樣,同個 schema 標
籤中定義的名字必須惟一。

dataNode 屬性

定義這個邏輯表所屬的 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 屬性

該屬性用於指定邏輯表要使用的規則名字,規則名字在 rule.xml 中定義,必須與 tableRule 標籤中 name 屬
性屬性值一一對應。

ruleRequired 屬性

該屬性用於指定表是否綁定分片規則,若是配置爲 true,但沒有配置具體 rule 的話 ,程序會報錯

primaryKey 屬性

該邏輯表對應真實表的主鍵,例如:分片的規則是使用非主鍵進行分片的,那麼在使用主鍵查詢的時候,就
會發送查詢語句到全部配置的 DN 上,若是使用該屬性配置真實表的主鍵。難麼 MyCat 會緩存主鍵與具體 DN 的
信息,那麼再次使用非主鍵進行查詢的時候就不會進行廣播式的查詢,就會直接發送語句給具體的 DN,可是儘管
配置該屬性,若是緩存並無命中的話,仍是會發送語句給具體的 DN,來得到數據。

type 屬性

該屬性定義了邏輯表的類型,目前邏輯表只有「全局表」和」普通表」兩種類型。對應的配置:

全局表:global。

普通表:不指定該值爲 globla 的全部表。

autoIncrement 屬性

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

使用方式添加 subTables="t_order$1-2,t_order3"。
目前分表 1.6 之後開始支持 而且 dataNode 在分表條件下只能配置一個,分表條件下不支持各類條件的join 語句。緩存

needAddLimit 屬性

指定表是否須要自動的在每一個語句後面加上 limit 限制。因爲使用了分庫分表,數據量有時會特別巨大。這時候執行查詢語句,若是恰巧又忘記了加上數量限制的話。那麼查詢全部的數據出來,也夠等上一小會兒的。
因此,mycat 就自動的爲咱們加上 LIMIT 100。固然,若是語句中有 limit,就不會在次添加了。這個屬性默認爲 true,你也能夠設置成 false`禁用掉默認行爲。session

childTable 標籤

childTable 標籤用於定義 E-R 分片的子表。經過標籤上的屬性與父表進行關聯。
childTable 標籤的相關屬性:

屬性名 數量限制
name String (1)
joinKey String (1)
parentKey String (1)
primaryKey String (0..1)
needAddLimit boolean (0..1)

name 屬性

定義子表的表名。

joinKey 屬性

插入子表的時候會使用這個列的值查找父表存儲的數據節點。

parentKey 屬性

屬性指定的值通常爲與父表創建關聯關係的列名。程序首先獲取 joinkey 的值,再經過 parentKey 屬性指定的列名產生查詢語句,經過執行該語句獲得父表存儲在哪一個分片上。從而肯定子表存儲的位置。

primaryKey 屬性

同 table 標籤所描述的。

needAddLimit 屬性

同 table 標籤所描述的。

dataNode 標籤

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

dataNode 標籤訂義了 MyCat 中的數據節點,也就是咱們一般說所的數據分片。一個 dataNode 標籤就是
一個獨立的數據分片。
例子中所表述的意思爲:使用名字爲 lch3307 數據庫實例上的 db1 物理數據庫,這就組成一個數據分片,最後,咱們使用名字 dn1 標識這個分片。
dataNode 標籤的相關屬性:

屬性 數量限制
name String (1)
dataHost String (1)
database String (1)

name 屬性

定義數據節點的名字,這個名字須要是惟一的,咱們須要在 table 標籤上應用這個名字,來創建表與分片對應的關係。

dataHost 屬性

該屬性用於定義該分片屬於哪一個數據庫實例的,屬性值是引用 dataHost 標籤上定義的 name 屬性。

database 屬性

該屬性用於定義該分片屬性哪一個具體數據庫實例上的具體庫,由於這裏使用兩個緯度來定義分片,就是:實 例+具體的庫。由於每一個庫上創建的表和表結構是同樣的。因此這樣作就能夠輕鬆的對錶進行水平拆分。

dataHost 標籤

做爲 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)

name 屬性

惟一標識 dataHost 標籤,供上層的標籤使用。

maxCon 屬性

指定每一個讀寫實例鏈接池的最大鏈接。也就是說,標籤內嵌套的 writeHost、readHost 標籤都會使用這個屬性的值來實例化出鏈接池的最大鏈接數。

minCon 屬性

指定每一個讀寫實例鏈接池的最小鏈接,初始化鏈接池的大小。

balance 屬 性

負載均衡類型,目前的取值有 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 沒有。

writeType 屬性

負載均衡類型,目前的取值有 3 種:

writeType="0", 全部寫操做發送到配置的第一個 writeHost,第一個掛了切到還生存的第二個writeHost,從新啓動後已切換後的爲準,切換記錄在配置文件中:dnindex.properties .

writeType="1",全部寫操做都隨機的發送到配置的 writeHost,1.5 之後廢棄不推薦。

switchType 屬性

  • -1 表示不自動切換。
  • 1 默認值,自動切換。
  • 2 基於 MySQL 主從同步的狀態決定是否切換。

dbType 屬性

指定後端鏈接的數據庫類型,目前支持二進制的 mysql 協議,還有其餘使用 JDBC 鏈接的數據庫。例如:
mongodb、oracle、spark 等。

dbDriver 屬性

指定鏈接後端數據庫使用的 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。

switchType 屬性

-1 表示不自動切換
1 默認值,自動切換
2 基於 MySQL 主從同步的狀態決定是否切換心跳語句爲 show slave status
3 基於 MySQL galary cluster 的切換機制(適合集羣)(1.4.1) 心跳語句爲 show status like ‘wsrep%’

tempReadHostAvailable 屬性

若是配置了這個屬性 writeHost 下面的 readHost 仍舊可用,默認 0 可配置(0、1)。

heartbeat 標籤

這個標籤內指明用於和後端數據庫進行心跳檢查的語句。例如,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

writeHost 標籤、readHost 標籤

這兩個標籤都指定後端數據庫的相關配置給 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 中做爲讀節點的權重(1.4 之後)。

usingDecrypt 屬性

是否對密碼加密默認 0 否 如須要開啓配置 1,同時使用加密程序對密碼加密,加密命令爲: 執行 mycat jar 程序(1.4.1 之後):


http://www.mycat.io/document/mycat-definitive-guide.pdf

http://www.javashuo.com/article/p-zjvcdowv-nr.html

相關文章
相關標籤/搜索