MyCat - 數據庫中間插件

什麼是MyCat前端

是目前最流行的分佈式數據庫中間插件node

爲何使用MyCatmysql

現在隨着互聯網的發展,數據的量級也是撐指數的增加,從GB到TB到PB。對數據的各類操做也是越發的困難,傳統的關係性數據庫已經沒法知足快速查詢與插入數據的需求。這個時候NoSQL的出現暫時解決了這一危機。它經過下降數據的安全性,減小對事務的支持,減小對複雜查詢的支持,來獲取性能上的提高。算法

可是,在有些場合NoSQL一些折衷是沒法知足使用場景的,就好比有些使用場景是絕對要有事務與安全指標的。這個時候NoSQL確定是沒法知足的,因此仍是須要使用關係性數據庫。如何使用關係型數據庫解決海量存儲的問題呢?此時就須要作數據庫集羣,爲了提升查詢性能將一個數據庫的數據分散到不一樣的數據庫中存儲,爲應對此問題就出現了——MyCatsql

• 綜上所述:Mycat做用爲:能知足數據庫數據大量存儲;提升了查詢性能數據庫

原理 後端

能夠用「攔截」一詞形容,它攔截了用戶發送過來的SQL語句,首先對SQL語句作了一些特定的分析,如分片分析,路由分析,讀寫分離分析,緩存分析等,而後將此sql發日後端的真實數據庫,並將返回的結果作適當處理,最終返回給用戶。數組

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

分片安全

數據庫分片指:經過某種特定的條件,將咱們存放在一個數據庫中的數據分散存放在不一樣的多個數據庫(主機)中,這樣來達到分散單臺設備的負載,根據切片規則,可分爲如下兩種切片模式:

• 垂直切片

將不一樣的表切分到不一樣的數據庫中

• 水平切片

將同一種表按照某種條件切分到不一樣的數據庫中(這種方式最經常使用)

水平分片【最經常使用的,所以用這個】

MyCAT經過定義表的分片規則來實現分片,每一個表格能夠捆綁一個分片規則,每一個分片規則指定一個分片字段並綁定一個函數,來實現動態分片算法

• 1.Schema:邏輯庫,與MySQL中的Database(數據庫)對應,一個邏輯庫中定義了所包括的Table。

• 2.Table:邏輯表,即物理數據庫中存儲的某一張表,與傳統數據庫不一樣,這裏的表格須要聲明其所存儲的邏輯數據節點DataNode。在此能夠指定表的分片規則。

• 3.DataNode:MyCAT的邏輯數據節點,是存放table的具體物理節點,也稱之爲分片節點,經過DataSource來關聯到後端某個具體數據庫上

• 4.DataSource:定義某個物理庫的訪問地址,用於捆綁到Datanode上

配置文件詳解

 mycat主要有3個配置文件,rule.xml,schema.xml和server.xml

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">autopartitionlong.txt</property>
</function>
name:標識算法的名字 class:指定路由算法具體的類名字 property:具體算法用到的一些屬性

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節點

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就是隻讀 

常見分片算法

枚舉法

<tableRule name="sharding-by-intfile">     <rule>       <columns>user_id</columns>       <algorithm>hash-int</algorithm>     </rule>   </tableRule>
<function name="hash-int" class="io.mycat.route.function.PartitionByFileMap">     <property name="mapFile">partition-hash-int.txt</property>     <property name="type">0</property>     <property name="defaultNode">0</property>   </function> 

partition-hash-int.txt 配置: 

10000=0
10010=1

上面columns 標識將要分片的表字段,algorithm 分片函數,

其中分片函數配置中,mapFile標識配置文件名稱,type默認值爲0,0表示Integer,非零表示String,

全部的節點配置都是從0開始,及0表明節點1

defaultNode: 默認節點:小於0表示不設置默認節點,大於等於0表示設置默認節點,結點爲指定的值


默認節點的做用:枚舉分片時,若是碰到不識別的枚舉值,就讓它路由到默認節點
               

若是不配置默認節點(defaultNode值小於0表示不配置默認節點),碰到
不識別的枚舉值就會報錯 :like this:can't find datanode for sharding column:column_name val:ffffffff

固定分片hash算法

<tableRule name="rule1">
    <rule>
      <columns>user_id</columns>
      <algorithm>func1</algorithm>
    </rule>
</tableRule>
 
  <function name="func1" class="io.mycat.route.function.PartitionByLong">
    <property name="partitionCount">2,1</property>
    <property name="partitionLength">256,512</property>
  </function>

配置說明:

上面columns 標識將要分片的表字段,algorithm 分片函數,

partitionCount 分片個數列表,partitionLength 分片範圍列表
分區長度:默認爲最大2^n=1024 ,即最大支持1024分區

約束 : count,length兩個數組的長度必須是一致的。
1024 = sum((count[i]*length[i])). count和length兩個向量的點積恆等於1024

求模法

<tableRule name="mod-long">
    <rule>
      <columns>user_id</columns>
      <algorithm>mod-long</algorithm>
    </rule>
  </tableRule>
  <function name="mod-long" class="io.mycat.route.function.PartitionByMod">
   <!-- how many data nodes  -->
    <property name="count">3</property>
  </function>

配置說明:
上面columns 標識將要分片的表字段,algorithm 分片函數,
此種配置很是明確即根據id與count(你的結點數)進行求模預算,相比方式1,此種在批量插入時須要切換數據源,id不連續

相關文章
相關標籤/搜索