1. 程式人生 > >MyCat 簡介

MyCat 簡介

1.什麼是MyCat

  是目前最流行的分散式資料庫中間外掛,更多解釋見官網

2.為什麼使用MyCat

  如今隨著網際網路的發展,資料的量級也是撐指數的增長,從GB到TB到PB。對資料的各種操作也是愈加的困難,傳統的關係性資料庫已經無法滿足快速查詢與插入資料的需求。這個時候NoSQL的出現暫時解決了這一危機。它通過降低資料的安全性,減少對事務的支援,減少對複雜查詢的支援,來獲取效能上的提升。但是,在有些場合NoSQL一些折衷是無法滿足使用場景的,就比如有些使用場景是絕對要有事務與安全指標的。這個時候NoSQL肯定是無法滿足的,所以還是需要使用關係性資料庫。如何使用關係型資料庫解決海量儲存的問題呢?此時就需要做資料庫叢集,為了提高查詢效能將一個數據庫的資料分散到不同的資料庫中儲存,為應對此問題就出現了——MyCat
  綜上所述:Mycat作用為:能滿足資料庫資料大量儲存;提高了查詢效能

3.支援的資料庫

  mysql,sqlserver,mongoDB等

4.架構

  前端使用者可以把mycat看作是一個數據庫代理,用mysql客戶端工具(如Navicat)和命令訪問,而後端支援mysql,sqlserver,oracle等主流資料庫,用mysql native 協議和多個mysql伺服器通訊,也可用JDBC協議與大多數主流資料庫伺服器通訊,其核心功能就是分庫分表,即將一個大表水平分割為N個小表,真正的儲存在後端Mysql伺服器中或其它資料庫中

  mycat原理:可以用“攔截”一詞形容,它攔截了使用者傳送過來的SQL語句,首先對SQL語句做了一些特定的分析,如分片分析,路由分析,讀寫分離分析,快取分析等,然後將此sql發往後端的真實資料庫,並將返回的結果做適當處理,最終返回給使用者

5.分片

  資料庫分片指:通過某種特定的條件,將我們存放在一個數據庫中的資料分散存放在不同的多個數據庫(主機)中,這樣來達到分散單臺裝置的負載,根據切片規則,可分為以下兩種切片模式:

 5.1垂直切片

  將不同的表切分到不同的資料庫中

 5.2水平切片

  將同一種表按照某種條件切分到不同的資料庫中(這種方式最常用)

  MyCAT通過定義表的分片規則來實現分片,每個表格可以捆綁一個分片規則,每個分片規則指定一個分片欄位並繫結一個函式,來實現動態分片演算法
  1.Schema:邏輯庫,與MySQL中的Database(資料庫)對應,一個邏輯庫中定義了所包括的Table。
  2.Table:邏輯表,即物理資料庫中儲存的某一張表,與傳統資料庫不同,這裡的表格需要宣告其所儲存的邏輯資料節點DataNode。在此可以指定表的分片規則。
  3.DataNode:MyCAT的邏輯資料節點,是存放table的具體物理節點,也稱之為分片節點,通過DataSource來關聯到後端某個具體資料庫上
  4.DataSource:定義某個物理庫的訪問地址,用於捆綁到Datanode上

6.配置檔案詳解

  mycat主要有3個配置檔案,rule.xml,schema.xml和server.xml,這主要對這3個檔案作講解

 6.1 rule.xml

  該檔案主要定義了分片的規則,這個檔案裡面主要有tableRule和function這兩個標籤。在具體使用過程中可以按照需求新增tableRule和function

tableRule標籤:

<tableRule name="auto-sharding-long">
    <rule>
        <columns>id</columns>
        <algorithm>rang-long</algorithm>
    </rule>
</tableRule>

  name:使用者標識不同的分表規則
  columns:指定按哪一列進行拆分
  algorithm:該屬性值為下面function標籤中name的屬性值,定義了連線表規則的具體的路由演算法,多個表規則可以連線到同一個路由演算法上

function標籤:

<function name="rang-long"
    class="org.opencloudb.route.function.AutoPartitionByLong">
    <property name="mapFile">autopartition-long.txt</property>
</function>

  name:標識演算法的名字
  class:指定路由演算法具體的類名字
  property:具體演算法用到的一些屬性

 6.2 schema.xml

  該檔案是MyCat中重要的配置檔案之一,管理著MyCat的邏輯庫、表、分片規則、DataNode以及DataSource

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/">
    <schema name="e3mall" checkSQLschema="false" sqlMaxLimit="100">
        <table name="tb_item" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
    </schema>
    <dataNode name="dn1" dataHost="localhost1" database="db1" />
    <dataNode name="dn2" dataHost="localhost1" database="db2" />
    <dataNode name="dn3" dataHost="localhost1" database="db3" />
    <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
        writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
        <heartbeat>select user()</heartbeat>
        <writeHost host="hostM1" url="192.168.20.216:3306" user="root"
            password="root">
        </writeHost>
    </dataHost>
</mycat:schema>

  schema標籤:定義mycat例項中的邏輯庫
  table標籤:定義mycat例項中的邏輯表
  dataNode標籤:定義mycat中的資料節點,也是通常說的資料分片
  dataHost標籤:作為最底層標籤存在,定義了具體的真正存放資料的資料庫例項,讀寫分離配置和心跳語句,我這隻用來一臺主鍵,所以只配了一個dataHost,如果你配了N個主機,就要配N個dataHost節點
  具體講解如圖(網上借用):
這裡寫圖片描述

 6.3 server.xml

<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://org.opencloudb/">
    <system>
    <property name="defaultSqlParser">druidparser</property>
    </system>
    <user name="user">
        <property name="password">user</property>
        <property name="schemas">e3mall</property>
        <property name="readOnly">false</property>
    </user>
</mycat:server>

  system標籤:內嵌的所有property標籤都與系統配置有關
    defaultSqlParser:指定預設的解析器(如解析sql),目前的可用的取值有:druidparser和 fdbparser。使用的時候可以選擇其中的一種,目前一般都使用druidparser

  user標籤
    name:邏輯使用者名稱,即登入mycat的使用者名稱
    password:邏輯密碼,即登入mycat的使用者名稱對應的密碼
    schemas:邏輯資料庫,可配置多個,用英文逗號隔開,對應於schema.xml檔案中配置的邏輯資料庫,兩者對應
    readOnly:該資料庫是否為只讀,如果true就是隻讀

7.安裝

  第一步:把MyCat的壓縮包上傳到linux伺服器
  第二步:解壓縮 tar zxf 壓縮包名稱
  第三步:進入mycat/bin目錄
  第四步:啟動命令:./mycat start
      停止命令:./mycat stop
      重啟命令:./mycat restart

8.遇到的問題

 8.1 對錶操作或點選表時,報1184 錯誤

  解決辦法:修改mycat的service.xml檔案,將readobly屬性去掉
readonly初始時為true,因為我們要對檔案進行寫,我就想改為false就行了,結果執行時就出現了1184錯誤,將它去掉就可以了,但又出現了問題2

<property name="readOnly">false</property>

  此設定即該資料庫是否為只讀(就是隻能讀資料唄),我改為false,就是不是隻讀唄,就是我可以就行寫等其它操作唄,不知道為什麼會出現上面錯誤,但我解決了問題2後,在把該句添上就又可以了,也不報錯了,奇怪。。。

 8.2 建立表時,報3309錯誤

  解決辦法:schema.xml檔案寫錯了,資料來源database寫的是db1,但是實際在資料庫中建的叫d1,所以mycat找不到配置的資料來源db1,所以報錯了

    <dataNode name="dn1" dataHost="localhost1" database="db1" />

9.測試

  我們用的auto-sharding-long分片策略,經測試,每個表只能容5000000資料,我們一個用了3個節點,所以只能存15000000條資料,多餘15000000條時就會報錯存不進去