概述
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 過多可以使用如下的方法減少配置:
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內容,感興趣的朋友可以關注下!