1. 程式人生 > >資料庫路由中介軟體MyCat - 使用篇(6)

資料庫路由中介軟體MyCat - 使用篇(6)

此文已由作者張鎬薪授權網易雲社群釋出。

歡迎訪問網易雲社群,瞭解更多網易技術產品運營經驗。

配置MyCat

4. 配置schema.xml

schema.xml裡面管理著MyCat的邏輯庫、表,每張表使用的分片規則、分佈在哪個DataNode以及DataSource上。 之前的例子: 這裡寫圖片描述 ```xml< ?xml version="1.0" encoding="UTF-8"?>< !DOCTYPE mycat:schema SYSTEM "schema.dtd">                             

<!-- 規定dataNode,就是分片的位置--><dataNode name="test1" dataHost="test" database="db1" /><dataNode name="test2" dataHost="test" database="db2" /><dataNode name="test3" dataHost="test" database="db3" /><dataNode name="test4" dataHost="test" database="db4" /><dataNode name="test5" dataHost="test" database="db5" /><dataNode name="test6" dataHost="test" database="db6" /><!-- 規定每個分片host的讀寫伺服器以及登入使用者名稱密碼,還有心跳語句--><dataHost name="test" maxCon="1000" minCon="10" balance="0"
          writeType="0" dbType="mysql" dbDriver="native" switchType="-1"  slaveThreshold="100">
    <heartbeat>select 1 from dual</heartbeat>
    <writeHost host="test" url="10.202.4.181:3306" user="test" password="test">
        <readHost host="slave" url="10.202.4.181:3307"  user="root" password="sf123456"/>           
    </writeHost></dataHost>


**邏輯庫配置schema標籤:**


<!-- checkSQLschema就是開啟SQL語句檢查,把帶schema名字的查詢改寫成不帶的,一般查詢最好不要帶schema名字 --><!--sqlMaxLimit每條執行的SQL語句,如果沒有加上limit語句,MyCat也會自動的加上所對應的值-->


![這裡寫圖片描述](http://img.blog.csdn.net/20160224092202524)
其中,這裡配置的dataNode屬性,是指這個邏輯庫中邏輯表的預設分片節點是test4,如果邏輯表自己配置了分片節點,那麼這個屬性對那個邏輯表無效。
sqlMaxLimit防止過多的輸出,如果sql語句中顯式的指定了limit大小,那麼這個屬性就不會生效。而且,如果對於非分片表執行sql語句,這個屬性也不會生效。**邏輯表配置table標籤:**


    <table name="orders" primaryKey="id" dataNode="test$1-3" rule="mod-long-orders">
        <!-- 運單子母件表,運單表的子表,order_id與orders的id列對應 -->
        <childTable name="orders_cargo" joinKey="order_id" parentKey="id">
        </childTable>
        <!-- 客戶運單關係表,運單表的子表,order_id與orders的id列對應 -->
        <childTable name="customer_order_rel" joinKey="order_id" parentKey="id">
        </childTable>
        <!-- 快遞員運單關係表,運單表的子表,order_id與orders的id列對應 -->
        <childTable name="courier_order_rel" joinKey="order_id" parentKey="id">
        </childTable>
    </table>
    <!-- 運單狀態資訊表,公共表,放在和運單表同樣的分片上 -->
    <table name="order_status_interception" primaryKey="id" type="global" dataNode="test$1-3">
    </table>
    <!-- 快遞員表,非分片表 -->
    <table name="courier" primaryKey="id" dataNode="test4">
    </table>
    <!-- 客戶表,對主鍵id對2取模 -->
    <table name="customer" primaryKey="id" dataNode="test$5-6" rule="mod-long-customer">
    </table>
![這裡寫圖片描述](http://img.blog.csdn.net/20160224092256041)1. name屬性定義邏輯表的表名,這個名字就如同我在資料庫中執行create table命令指定的名字一樣,同個schema標籤中定義的名字必須唯一。2. dataNode屬性:定義這個邏輯表所屬的dataNode, 該屬性的值需要和dataNode標籤中name屬性的值相互對應。如果需要定義的dn過多可以使用上面配置的的方法減少配置3. rule屬性:該屬性用於指定邏輯表要使用的規則名字,規則名字在rule.xml中定義,必須與tableRule標籤中name屬性屬性值一一對應。4. ruleRequired屬性:該屬性用於指定表是否繫結分片規則,如果配置為true,但沒有配置具體rule的話 ,程式會報錯。5. primaryKey屬性:該邏輯表對應真實表的主鍵,例如:分片的規則是使用非主鍵進行分片的,那麼在使用主鍵查詢的時候,就會發送查詢語句到所有配置的DN上;如果使用該屬性配置真實表的主鍵,那麼MyCat會快取主鍵與具體DN的資訊,那麼再次使用非主鍵進行查詢的時候就不會進行廣播式的查詢,就會直接傳送語句給具體的DN,但是儘管配置該屬性,如果快取並沒有命中的話,還是會發送語句給具體的DN,來獲得資料。6. type屬性:該屬性定義了邏輯表的型別,目前邏輯表只有“全域性表”和”普通表”兩種型別。全域性表:global。普通表:不指定該值為globla的所有表。7. autoIncrement屬性:自增id相關,不推薦使用8. needAddLimit屬性:指定表是否需要自動的在每個語句後面加上limit限制。由於使用了分庫分表,資料量有時會特別巨大。這時候執行查詢語句,如果恰巧又忘記了加上數量限制的話。那麼查詢所有的資料出來,也夠等上一小會兒的。所以,mycat就自動的為我們加上LIMIT 100。當然,如果語句中有limit,就不會在次添加了。這個屬性預設為true,你也可以設定成false`禁用掉預設行為。**分片表子表配置 childTable標籤:**


![這裡寫圖片描述](http://img.blog.csdn.net/20160224092521012)1. name屬性2. joinKey屬性:插入子表的時候會使用這個列的值查詢父表儲存的資料節點。3. parentKey屬性:屬性指定的值一般為與父表建立關聯關係的列名。程式首先獲取joinkey的值,再通過**parentKey**屬性指定的列名產生查詢語句,通過執行該語句得到父表儲存在哪個分片上。從而確定子表儲存的位置。4. primaryKey屬性:同table標籤所描述的。5. needAddLimit屬性:同table標籤所描述的。**分片節點dataNode標籤配置:**


<dataNode name="test1" dataHost="test" database="db1" /><dataNode name="test2" dataHost="test" database="db2" /><dataNode name="test3" dataHost="test" database="db3" /><dataNode name="test4" dataHost="test" database="db4" /><dataNode name="test5" dataHost="test" database="db5" /><dataNode name="test6" dataHost="test" database="db6" />
![這裡寫圖片描述](http://img.blog.csdn.net/20160224092855174)1. name屬性2. dataHost屬性:該屬性用於定義該分片屬於哪個資料庫例項的,屬性值是引用dataHost標籤上定義的name屬性3. database屬性:該屬性用於定義該分片屬性哪個具體資料庫例項上的具體庫,因為這裡使用兩個緯度來定義分片,就是:例項+具體的庫。因為每個庫上建立的表和表結構是一樣的。所以這樣做就可以輕鬆的對錶進行水平拆分。**分片主機dataHost標籤配置:**


<dataHost name="test" maxCon="1000" minCon="10" balance="0"
          writeType="0" dbType="mysql" dbDriver="native" switchType="-1"  slaveThreshold="100">
    <heartbeat>select 1 from dual</heartbeat>
    <writeHost host="test" url="10.202.4.181:3306" user="test" password="test">
        <readHost host="slave" url="10.202.4.181:3307"  user="root" password="sf123456"/>           
    </writeHost></dataHost>

```  dataHost標籤:該標籤在mycat邏輯庫中也是作為最底層的標籤存在,直接定義了具體的資料庫例項、讀寫分離配置和心跳語句。

  1. name屬性

  2. maxCon屬性:指定每個讀寫例項連線池的最大連線。也就是說,標籤內巢狀的writeHost、readHost標籤都會使用這個屬性的值來例項化出連線池的最大連線數。

  3. minCon屬性:指定每個讀寫例項連線池的最小連線,初始化連線池的大小。

  4. balance屬性:

          - balance=“0”, 所有讀操作都發送到當前可用的writeHost上。
          - balance=“1”,所有讀操作都隨機的傳送到readHost。
          - balance=“2”,所有讀操作都隨機的在writeHost、readhost上分發。
  5. writeType屬性

          - writeType=“0”, 所有寫操作都發送到可用的writeHost上。
          - writeType=“1”,所有寫操作都隨機的傳送到readHost。
          - writeType=“2”,所有寫操作都隨機的在writeHost、readhost分上發。
  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 的切換機制(適合叢集)心跳語句必須為show status like ‘wsrep%’

  9. slaveThreshold:主從同步狀態決定是否切換,延遲超過這個就不切換

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

  11. writeHost標籤、readHost標籤:這兩個標籤都指定後端資料庫的相關配置給mycat,用於例項化後端連線池。唯一不同的是,writeHost指定寫例項、readHost指定讀例項,組著這些讀寫例項來滿足系統的要求。在一個dataHost內可以定義多個writeHost和readHost。但是,如果writeHost指定的後端資料庫宕機,那麼這個writeHost繫結的所有readHost都將不可用。另一方面,由於這個writeHost宕機系統會自動的檢測到,並切換到備用的writeHost上去。

         - host屬性:用於標識不同例項
         - url屬性:後端例項連線地址,如果是使用native的dbDriver,則一般為address:port這種形式。用JDBC或其他的dbDriver,則需要特殊指定。當使用JDBC時則可以這麼寫:jdbc:mysql://localhost:3306/。
         - user屬性:後端儲存例項需要的使用者名稱字
         - password屬性:後端儲存例項需要的密碼

5. 啟動MyCat

以上,MyCat基本配置已經配置好。下面則啟動,進入mycat的bin目錄,啟動MyCat: ./mycat start 檢視啟動狀態: ./mycat status 停止: ./mycat stop 重啟(改變上面的xml配置不用重啟,管理端可以重新載入,以後會講): ./mycat restart 檢視logs/下的wrapper.log和mycat.log可以檢視執行時問題和異常。 


免費體驗雲安全(易盾)內容安全、驗證碼等服務

更多網易技術、產品、運營經驗分享請點選




相關文章:
【推薦】 試水新的Angular4HTTPAPI
【推薦】 從加班論客戶端開發中的建模
【推薦】 淺談由管理者角色引出的B端產品設計思考點