MyCat數據庫中間件數據切分實現

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

<一>schema 標籤
        schema 標籤用於定義 MyCat 實例中的邏輯庫,MyCat 能夠有多個邏輯庫,每一個邏輯庫都有本身的相關配置。可使用 schema 標籤來劃分這些不一樣的邏輯庫。
       若是不配置 schema 標籤,全部的表配置,會屬於同一個默認的邏輯庫。python

<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
    <table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" ></table>
</schema>

<schema name="USERDB" checkSQLschema="false" sqlMaxLimit="100">
    <table name="company" dataNode="dn10,dn11,dn12" rule="auto-sharding-long" ></table>
</schema>

 如上所示的配置就配置了兩個不一樣的邏輯庫,邏輯庫的概念和 MYSQL 數據庫中 Database 的概念相同,咱們在查詢這兩個不一樣的邏輯庫中表的時候須要切換到該邏輯庫下才能夠查詢到所須要的表。mysql

schema 標籤的相關屬性:sql

屬性名                     值                數量限制
dataNode               任意String   (0..1)
checkSQLschema   Boolean      (1)
sqlMaxLimit           Integer        (1)mongodb

dataNode屬性:
       該屬性用於綁定邏輯庫到某個具體的 database 上,1.3 版本若是配置了 dataNode,則不能夠配置分片表,1.4 能夠配置默認分片,只須要配置須要分片的表便可,具體以下配置:
1.3 配置:
<schema name="USERDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
<!—裏面不能配置任何表-->
</schema>數據庫

1.4 配置:
<schema name="USERDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn2">
<!—配置須要分片的表-->
<table name=「tuser」 dataNode=」dn1」/>
</schema>後端

那麼如今 tuser 就綁定到 dn1 所配置的具體 database 上,能夠直接訪問這個 database,沒有配置的表則會走
默認節點 dn2,這裏注意沒有配置在分片裏面的表工具查看沒法顯示,可是能夠正常使用。緩存

checkSQLschema屬性:
        當該值設置爲 true 時,若是咱們執行語句 select * from TESTDB.travelrecord;,
                               則 MyCat 會把語句修改成 select * from travelrecord;。即把表示 schema 的字符去掉,避免發送到後端數據庫執行時報
(ERROR1146 (42S02): Table ‘testdb.travelrecord’ doesn’t exist)。
        不過,即便設置該值爲 true ,若是語句所帶的是並不是是 schema 指定的名字,例如:select * from db1.travelrecord; 那麼 MyCat 並不會刪除 db1 這個字段,若是沒有定義該庫的話則會報錯。
        因此在提供 SQL語句的最好是不帶這個字段。 session

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

<二>table 標籤
        Table 標籤訂義了 MyCat 中的邏輯表,全部須要拆分的表都須要在這個標籤中定義。 

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

屬性名                       值              數量限制
name                        String       (1)
dataNode                 String       (1..*)
rule                           String       (0..1)
ruleRequired             boolean   (0..1)
primaryKey               String       (1)
type                          String       (0..1)
autoIncrement         boolean    (0..1)
subTables                 String       (1)
needAddLimit          boolean    (0..1)

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

dataNode 屬性:
       定義這個邏輯表所屬的 dataNode, 該屬性的值須要和 dataNode 標籤中 name 屬性的值相互對應。若是須要定義的 dn 過多可使用以下的方法減小配置: 

<table name="travelrecord" dataNode="multipleDn$0-99,multipleDn2$100-199" rule="auto-sharding-long" ></table>
<dataNode name="multipleDn" dataHost="localhost1" database="db$0-99" ></dataNode>
<dataNode name="multipleDn2" dataHost="localhost1" database=" db$0-99" ></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()纔會返回插入的分片鍵值。
        若是要使用這個功能最好配合使用數據庫模式的全局序列。
        使用 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 禁用掉默認行爲。 

<三>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 標籤訂義了 MyCat 中的數據節點,也就是咱們一般說所的數據分片。一個 dataNode 標籤就是一個獨立的數據分片。

<dataNode name="dn1" dataHost="lch3307" database="db1" ></dataNode>
##例子中所表述的意思爲:使用名字爲 lch3307 數據庫實例上的 db1 物理數據庫,這就組成一個數據分片,最後,咱們使用名字 dn1 標識這個分片。

 dataNode 標籤的相關屬性:

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

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

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

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

<五>dataHost 標籤
         該標籤在 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="hostS1" url="localhost:3306" user="root" password="123456"/>
    </writeHost>

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

 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 種:
              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 沒有。

writeType 屬性:負載均衡類型,目前的取值有 3 種:
             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)。

<六>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                      String  (1)
url                         String  (1)
password              String  (1)
user                       String  (1)
weight                  String  (1)
usingDecrypt        String  (1)

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 之後):                    java -cp Mycat-server-1.4.1-dev.jar org.opencloudb.util.DecryptUtil 1:host:user:password          Mycat-server-1.4.1-dev.jar 爲 mycat download 下載目錄的 jar         1:host:user:password 中 1 爲 db 端加密標誌,host 爲 dataHost 的 host 名稱

相關文章
相關標籤/搜索