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條時就會報錯存不進去