Mycat 配置文件schema.xml


1、介紹

schema.xml 作為 MyCat 中重要的配置文件之一,管理着 MyCat 的邏輯庫、表、分片規則、 DataNode 以及 DataSource。

2、schema相關標簽

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

示例如下:

<schema name="USERDB" checkSQLschema="false" sqlMaxLimit="100" datanode="dn3,dn4">
       <table name="tb_user" dataNode="dn1,dn2" rule="auto-sharing-long"></table>
</schema>
<schema name="ORDERDB" checkSQLschema="false" sqlMaxLimit="100">
    <table name="tb_order" dataNode="dn3,dn4" rule="auto-sharing-long"></table>
</schema>

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

2.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 的大小,不受該屬性的約束。

2.2 table標簽:

name屬性:

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

dataNode屬性:

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

<table name="tb_user" dataNode="Dn$0-99,Dn2$100-199" rule="auto-shardinglong" >
<!--數據節點配置-->
<dataNode name="Dn" dataHost="localhost1" database="db$0-99" >
<dataNode name="Dn2" dataHost="localhost1" database=" db$0-199" >

上面的例子中,需要在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"來禁用掉。

2.3 childTable 標簽

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

示例:

<table name="customer" primaryKey="ID" dataNode="dn1,dn2" rule="sharding-by-intfile">
    <childTable name="orders" primaryKey="ID" joinKey="customer_id" parentKey="id">
    <childTable name="order_items" primaryKey="ID" joinKey="order_id" parentKey="id" />
    <childTable name="customer_addr" primaryKey="ID" joinKey="customer_id" parentKey="id" />
</table>

name 屬性:

  定義子表的表名;

joinKey 屬性:

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

parentKey 屬性:

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

primaryKey 屬性:

  同 table 標簽所描述的。

needAddLimit 屬性:

  同 table 標簽所描述的。

2.4 dataNode 標簽:

dataNode標簽定義了 MyCat 中的數據節點,也就是我們通常說所的數據分片。一個dataNode標簽就是一個獨立的數據分片。
<dataNode name="dn1" dataHost="localhost1" database="db1" />

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

name 屬性:

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

dataHost 屬性:

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

database 屬性:

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

2.5 dataHost 標簽:

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

<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native">

    <heartbeat>select user()</heartbeat>

    <writeHost host="hostM1" url="localhost:3306" user="root" password="123456" />

        <readHost host="hostS2" url="localhost:3306" user="root" password="123456"/>

    </writeHost>

    <writeHost host="hostS1" url="localhost:3316" user="root" password="123456" />

</dataHost>  

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)

2.6 heartbeat 標簽

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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM