Mycat中間件核心配置文件schema.xml說明,值得收藏

2019-10-16     波波說運維

概述

schema.xml 作為 MyCat 中重要的配置文件之一,管理著 MyCat 的邏輯庫、表、分片規則、 DataNode 以及 DataSource。今天主要介紹一下schema.xml,這也是mycat必須掌握的點。


1、schema相關標籤

schema標籤用於定義mycat實例中的邏輯庫,mycat可以有多個邏輯庫,每個邏輯庫可以有自己的相關配置,如果不配置schema標籤,所有表配置會屬於同一個默認的邏輯庫。

示例如下:







上面示例是配置了兩個邏輯庫,就如同在mysql中定義了兩個資料庫。查詢數據是切換到對應的邏輯庫進行。

1.1、schema標籤:

name屬性:

邏輯資料庫的名稱。

checkSQLschema屬性: 

該欄位就是用戶執行sql語句時,是否檢查表明的schema,當該值設置為 true 時,如果我們執行語句(select * from USERDB.tb_user)則 MyCat 會把語句修改為(select * from tb_user)。即把表示 schema 的name去掉,避免發送到後端資料庫執行時報錯。建議將該欄位設置為false。

sqlMaxLimit屬性:

當該值設置為某個數值時。每條執行的 SQL 語句,如果沒有加上 limit 語句,MyCat 也會自動的加上所對應的值。例如設置值為 100,執行select * from USERDB.tb_user;等效執行select * from USERDB.tb_user limit 100;

如果沒有設置該值的話,MyCat 默認會把查詢到的信息全部都展示出來。在正常使用中,還是建議加上一個值,用於減少過多的數據返回。當如果SQL 語句中也顯式的指定 limit 的大小,不受該屬性的約束。

1.2 table標籤

name屬性:

定義邏輯表的表名,就如mysql中的table名稱,同個schema中定義的必須唯一。

dataNode屬性:

定義當前邏輯表所屬dataNode,dataNode指定了邏輯資料庫對應的物理資料庫節點,該屬性的值需要和 dataNode 標籤中 name 屬性的值相互對應。如果需要定義的 dn 過多可以使用如下的方法減少配置:





上面的例子中,需要在mysql上建立名稱為 dbs0 到 dbs99 的 database。

rule 屬性:

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

ruleRequired 屬性:

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

primaryKey 屬性:

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

type 屬性:

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

  • 全局表:global
  • 普通表:不指定該值為 globla 的所有表。

autoIncrement 屬性:

mycat 目前提供了自增長主鍵功能,但是如果對應的 mysql 節點上數據表,沒有定義 auto_increment,那麼在 mycat 層調用 last_insert_id()也是不會返回結果的。由於 insert 操作的時候沒有帶入分片鍵,mycat 會先取下這個表對應的全局序列,然後賦值給分片鍵。這樣才能正常的插入到資料庫中,最後使用 last_insert_id()才會返回插入的分片鍵值。該屬性默認是禁用的。

subTables屬性:

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

needAddLimit 屬性:

指定表是否需要自動的在每個語句後面加上 limit 限制。由於使用了分庫分表,數據量有時會特別巨大。mycat 就自動的為我們加上LIMIT 100。如果語句中有 limit,就不會加上。該屬性默認為 true,你也可以設置成 "false"來禁用掉。

1.3 childTable 標籤

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

示例:






name 屬性:

定義子表的表名;

joinKey 屬性:

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

parentKey 屬性:

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

primaryKey 屬性:

同 table 標籤所描述的。

needAddLimit 屬性:

同 table 標籤所描述的。

1.4 dataNode 標籤:

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


示例使用名字為localhost1資料庫實例上的db1物理資料庫,這就組成一個數據分片,使用名字dn1 識這個分片。

name 屬性:

定義數據節點的名字,這個名字需要是唯一的,我們需要在 table 標籤上應用這個名字,來建立邏輯表與分片對應的關係。

dataHost 屬性:

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

database 屬性:

該屬性用於定義該分片屬性哪個具體資料庫實例上的具體庫,因為這裡使用兩個維度來定義分片:實例+具體的庫。因為每個庫上建立的表和表結構是一樣的。所以這樣做就可以輕鬆的對表進行水平拆分。

1.5 dataHost 標籤

作為 schema.xml 中最後的一個標籤,該標籤在 mycat 邏輯庫中也是作為最底層的標籤存在,直接定義了具體的資料庫實例、讀寫分離配置和心跳語句。


select user()




name 屬性:

唯一標識 dataHost 標籤,供dataNode標籤使用。

maxCon 屬性:

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

minCon 屬性:

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

balance 屬性:

負載均衡類型,具體有以下4種:

 1. balance="0", 不開啟讀寫分離機制,所有讀操作都發送到當前可用的 writeHost 上。
2. balance="1",全部的 readHost 與 stand by writeHost 參與 select 語句的負載均衡,簡單的說,當雙主雙從模式(M1->S1,M2->S2,並且 M1 與 M2 互為主備),正常情況下,M2,S1,S2 都參與 select 語句的負載均衡。
3. balance="2",所有讀操作都隨機的在 writeHost、 readhost 上分發。
4. balance="3",所有讀請求隨機的分發到 wiriterHost 對應的 readhost 執行,writerHost 不負擔讀壓力,注意 balance=3 只在 1.4 及其以後版本有。

writeType 屬性:

負載均衡寫操作類型,目前的取值有 2 種:

 1. writeType="0", 所有寫操作發送到配置的第一個 writeHost,第一個掛了切到還生存的第二個writeHost,重新啟動後以切換後的為準,切換記錄在配置文中:dnindex.properties。
2. writeType="1",所有寫操作都隨機的發送到配置的 writeHost,1.5 以後廢棄不推薦。

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)

1.6 heartbeat 標籤

該標籤內指明用於和後端資料庫進行心跳檢查的語句。例如,MYSQL 可以使用 select user(),Oracle 可以使用 select 1 from dual 等。

1.7 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表示開啟,同時使用加密程序對密碼加密。


只有了解schema.xml參數含義,你才好配讀寫分離和分庫分表,所以對裡面的標籤要重點理解。後面會分享更多devops和DBA內容,感興趣的朋友可以關注下!

文章來源: https://twgreatdaily.com/zh-tw/cpeK0m0BMH2_cNUg-7ju.html