1、概念與圖示前端
schema.xml配置的幾個術語與其關係圖示:mysql
2、schema 標籤sql
schema 標籤用於定義 MyCat 實例中的邏輯庫,如:mongodb
<schema name="USERDB" dataNode="dn1" checkSQLschema="false" sqlMaxLimit="100">數據庫 |
1. name屬性後端
配置邏輯庫的名字(即數據庫實例名);緩存
2. dataNode屬性oracle
用於配置該邏輯庫默認的分片。沒有經過table標籤配置的表,就會走到默認的分片上。這裏注意沒有配置在table標籤的表,用工具查看是沒法顯示的,可是能夠正常使用。負載均衡
若是沒有配置dataNode屬性,則沒有配置在table標籤的表,是沒法使用的。注意,dual表在mycat中,也被視爲一個表。工具
查詢:select sysdate() from dual LIMIT 0, 1000
錯誤代碼: 1064 can't find table define in schema DUAL schema:USERDB |
另外,經過mycat建表,而該表並無提早配置table標籤,則mycat會找到默認的dataNode,並把表建在默認的dataNode上。若是沒有配置默認dataNode,則mycat會報錯。
查詢:create table test(id varchar(10)) 錯誤代碼: 1064 op table not in schema----TEST |
而若是該表有配置table標籤,則表會分別在table標籤指定的dataNode上建表。
3. checkSQLschema屬性
boolean類型。
當前端執行【select *from USERDB.tf_user;】時(表名前指定了mycat邏輯庫名),兩種取值:
true:mycat會把語句轉換爲【select * from tf_user;】
false:會報錯
查詢:SELECT * FROM USERDB.tf_user LIMIT 0, 1000 錯誤代碼: 1064 find no Route:SELECT * FROM USERDB.tf_user LIMIT 0, 1000 |
4. sqlMaxLimit屬性
至關於sql的結果集中,加上【limit N】。若是sql自己已經指定limit,則以sql指定的爲準。
mysql> explain select * from tf_user; +-----------+---------------------------------+ | DATA_NODE | SQL | +-----------+---------------------------------+ | dn1 | SELECT * FROM tf_user LIMIT 100 | | dn2 | SELECT * FROM tf_user LIMIT 100 | +-----------+---------------------------------+ 2 rows in set (0.00 sec)
mysql> explain select * from tf_user limit 50; +-----------+--------------------------------+ | DATA_NODE | SQL | +-----------+--------------------------------+ | dn1 | SELECT * FROM tf_user LIMIT 50 | | dn2 | SELECT * FROM tf_user LIMIT 50 | +-----------+--------------------------------+ 2 rows in set (0.00 sec) |
注意,若是table標籤的表,needAddLimit屬性配置爲false,則該表的sql禁止自動加上limit
3、table 標籤
table標籤爲schema標籤的子標籤。
table標籤用於定義Mycat的邏輯表,以及邏輯表的分片規則。如:
<table name="tf_user" primaryKey="USER_ID" autoIncrement="true"dataNode="dn1,dn2" rule="hash-int" /> |
1. name屬性
邏輯表的表名,同一個schema表名必須惟一。
2. dataNode屬性
定義這個邏輯表所屬的 dataNode,用英文逗號間隔,如:dataNode="dn1,dn2"
若是dataNode過多,可使用以下的方法減小配置:
<table name="travelrecord" dataNode="multipleDn$0-99,multipleDn2$100-199" rule="auto-shardinglong" ></table>
<dataNode name="multipleDn" dataHost="localhost1" database="db$0-99" ></dataNode> <dataNode name="multipleDn2" dataHost="localhost1" database=" db$0-99" ></dataNode> |
db$0-99爲mysql的數據庫,即從db0至db99的數據庫(100個)。
3. rule屬性
該屬性用於指定邏輯表要使用的規則名字,規則名字在 rule.xml 中定義,必須與 tableRule 標籤中 name 屬性屬性值一一對應。
4. ruleRequired屬性
該屬性用於指定表是否綁定分片規則,若是配置爲 true,但沒有配置具體 rule 的話 ,程序會報錯
5. primaryKey屬性
指定該邏輯表對應真實表的主鍵。MyCat會緩存主鍵(經過primaryKey屬性配置)與具體 dataNode的信息。當分片規則使用非主鍵進行分片時,那麼在使用主鍵進行查詢時,MyCat就會經過緩存先肯定記錄在哪一個dataNode上,而後再在該dataNode上執行查詢。
若是緩存並無命中的話,仍是會發送語句給全部的dataNode。
mysql> explain select * from employee where id=101; +-----------+-------------------------------------+ | DATA_NODE | SQL | +-----------+-------------------------------------+ | dn1 | select * from employee where id=101 | | dn2 | select * from employee where id=101 | +-----------+-------------------------------------+ 2 rows in set (0.00 sec)
mysql> select * from employee where id=101; +-----+------+-------------+ | id | name | sharding_id | +-----+------+-------------+ | 101 | A | 10000 | +-----+------+-------------+ 1 row in set (0.01 sec)
mysql> explain select * from employee where id=101; +-----------+-------------------------------------+ | DATA_NODE | SQL | +-----------+-------------------------------------+ | dn1 | select * from employee where id=101 | +-----------+-------------------------------------+ 1 row in set (0.00 sec) |
關於Mycat的主鍵緩存,其機制是:當根據主鍵查詢的SQL語句第一次執行時,Mycat會對其結果進行分析,肯定該主鍵在哪一個分片上,並進行該主鍵到分片ID的緩存。經過鏈接MyCAT的9066管理端口,執行show@@cache,能夠顯示當前緩存的使用狀況。可在sql執行先後的2個時間點執行show @@cache,經過結果信息中的LAST_PUT和LAST_ACCESS列,判斷相應表的緩存是否有被更新過。
6. type屬性
該屬性定義了邏輯表的類型,目前邏輯表只有「全局表」和」普通表」兩種類型。對應的配置:
全局表:global。
普通表:不指定該值爲 global 的全部表。
7. autoIncrement屬性
8. subTables屬性
分表配置,mycat1.6以後開始支持,但dataNode 在分表條件下只能配置一個。
9. needAddLimit屬性
與schema標籤的sqlMaxLimit配合使用,若是needAddLimit值爲false,則語句不會加上limit
4、childTable 標籤
childTable 標籤用於定義 E-R 分片的子表。經過標籤上的屬性與父表進行關聯。
1. name屬性
定義子表的表名
2. joinKey屬性
插入子表的時候會使用這個列的值查找父表存儲的數據節點。
3. parentKey屬性
該屬性指定的值通常爲與父表創建關聯關係的列名。Mycat首先獲取 joinkey 的值,再經過 parentKey 屬性指定的列名產生查詢語句,經過執行該語句獲得父表存儲在哪一個分片上。從而肯定子表存儲的位置。
4. primaryKey屬性
同table標籤描述。
5. needAddLimit 屬性
同table標籤描述。
5、dataNode 標籤
<dataNode name="dn1" dataHost="localhost1" database="mycatdb00" /> |
1. name 屬性
指定分片的名字
2. dataHost 屬性
定義該分片屬於哪一個數據庫實例
3. database 屬性
定義該分片屬於哪一個具體數據庫實例上的具體庫(即對應mysql中實際的DB)
6、dataHost標籤
定義後端的數據庫主機
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> |
1. name 屬性
指定dataHost的名字
2. maxCon
指定每一個讀寫實例鏈接池的最大鏈接。也就是說,標籤內嵌套的writeHost、 readHost 標籤都會使用這個屬
性的值來實例化出鏈接池的最大鏈接數。
3. minCon 屬性
指定每一個讀寫實例鏈接池的最小鏈接,初始化鏈接池的大小。
4. balance 屬性
負載均衡類型:
(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 及其之後版本有,1.3 沒有。
5. writeType 屬性
(1)writeType="0", 全部寫操做發送到配置的第一個 writeHost,第一個掛了切到還生存的第二個riteHost,從新啓動後已切換後的爲準,切換記錄在配置文件中:dnindex.properties.
(2)writeType="1",全部寫操做都隨機的發送到配置的 writeHost,1.5 之後廢棄不推薦。
6. dbType 屬性
指定後端鏈接的數據庫類型,目前支持二進制的 mysql 協議,還有其餘使用 JDBC 鏈接的數據庫。例如:mongodb、 oracle、 spark 等。
7. dbDriver 屬性
指定鏈接後端數據庫使用的 Driver,目前可選的值有 native 和 JDBC。使用native 的話,由於這個值執行的是二進制的 mysql 協議,因此可使用 mysql 和 maridb。其餘類型的數據庫則須要使用 JDBC 驅動來支持。
8. switchType 屬性
-1 表示不自動切換
1 默認值,自動切換
2 基於 MySQL 主從同步的狀態決定是否切換
心跳語句爲 show slave status
3 基於 MySQL galary cluster 的切換機制(適合集羣)(1.4.1)
心跳語句爲 show status like ‘wsrep%’.
9. tempReadHostAvailable 屬性
若是配置了這個屬性 writeHost 下面的 readHost 仍舊可用,默認 0 可配置(0、 1)。
7、writeHost 標籤、 readHost 標籤
1. host 屬性
用於標識不一樣實例,通常 writeHost 咱們使用*M1,readHost 咱們用*S1。
2. url 屬性
後端實例鏈接地址,若是是使用 native 的 dbDriver,則通常爲 address:port 這種形式。用 JDBC 或其餘的dbDriver,則須要特殊指定。當使用 JDBC 時則能夠這麼寫:jdbc:mysql://localhost:3306/。
3. user 屬性
後端存儲實例須要的用戶名字
4. password 屬性
後端存儲實例須要的密碼
5. weight 屬性
權重 配置在 readhost 中做爲讀節點的權重(1.4 之後)
6. usingDecrypt 屬性
是否對密碼加密默認 0 否 如須要開啓配置 1,同時使用加密程序對密碼加密