1. 程式人生 > >mycat是什麼鬼?垂直切分?水平切分?

mycat是什麼鬼?垂直切分?水平切分?

mycat是什麼鬼

mycat是國人開發的一款開源的資料庫中介軟體,他的作用就是偽裝成一個真的資料庫,然後在它背後,連的是多種型別,叢集分散式的真實資料庫。他的體系結構就像下面:

這裡寫圖片描述

需要理解mycat的幾個概念。

schema:邏輯庫,與MySQL中的Database(資料庫)對應,一個邏輯庫中定義了所包括的Table。
table:表,即物理資料庫中儲存的某一張表,與傳統資料庫不同,這裡的表格需要宣告其所儲存的邏輯資料節點DataNode,這是通過表格的分片規則定義來實現的,table可以定義其所屬的“子表(childTable)”,子表的分片依賴於與“父表”的具體分片地址,簡單的說,就是屬於父表裡某一條記錄A的子表的所有記錄都與A儲存在同一個分片上。
分片規則:是一個欄位與函式的捆繫結義,根據這個欄位的取值來返回所在儲存的分片(DataNode)的序號,每個表格可以定義一個分片規則,分片規則可以靈活擴充套件,預設提供了基於數字的分片規則,字串的分片規則等。
dataNode: MyCAT的邏輯資料節點,是存放table的具體物理節點,也稱之為分片節點,通過DataSource來關聯到後端某個具體資料庫上,一般來說,為了高可用性,每個DataNode都設定兩個DataSource,一主一從,當主節點宕機,系統自動切換到從節點。
dataHost:定義某個物理庫的訪問地址,用於捆綁到dataNode上。

MyCAT目前通過配置檔案的方式來定義邏輯庫和相關配置:
MYCAT_HOME/conf/schema.xml中定義邏輯庫,表、分片節點等內容;
MYCAT_HOME/conf/rule.xml中定義分片規則;
MYCAT_HOME/conf/server.xml中定義使用者以及系統相關變數,如埠等。

說了那麼多,或許你看看下面的圖就明白了:

這裡寫圖片描述

mycat的好處就是你可以使用他就像使用真的mysq資料庫一樣,jdbc該怎麼連,命令列該怎麼敲就怎麼敲,sql語句該怎麼寫就怎麼寫,它的出現讓你的業務程式碼持久層不用動,而背後,卻能幫搭建起mysql的分表,分庫,讀寫分離,叢集分散式。

下面就簡單使用mycat來幫助我們將業務資料表進行垂直切分和水平切分

垂直切分搭建

垂直切分其實就是根據業務的不同,將不同業務的表放到不同的資料庫中,例如我們訂單表,使用者表,使用者評論表,因為他們業務的不同,可以將他們分別放到三個資料庫中。好,那我們就使用三個資料庫,分別安裝三張表,使用mysql架構如下:

這裡寫圖片描述

1、修改MYCAT_HOME/conf/schema.xml,內容如下:

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/">

    <!-- schema邏輯資料庫 -->
<schema name="mycat1" checkSQLschema="false" sqlMaxLimit="100" dataNode="mycat1" /> <schema name="mycat2" checkSQLschema="false" sqlMaxLimit="100" dataNode="mycat2" /> <schema name="mycat3" checkSQLschema="false" sqlMaxLimit="100" dataNode="mycat3" /> <!--使用dataNode將實際資料庫和邏輯資料庫對映--> <dataNode name="mycat1" dataHost="mycat" database="mycat1" /> <dataNode name="mycat2" dataHost="mycat" database="mycat2" /> <dataNode name="mycat3" dataHost="mycat" database="mycat3" /> <dataHost name="mycat" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native"> <heartbeat>select user()</heartbeat> <!--寫上資料庫連結資訊--> <writeHost host="hostM1" url="192.168.137.101:3306" user="root" password="123" /> <writeHost host="hostM2" url="192.168.137.102:3306" user="root" password="123" /> <writeHost host="hostM3" url="192.168.137.103:3306" user="root" password="123" /> </dataHost> </mycat:schema>

2、修改MYCAT_HOME/conf/server.xml,新增連結mycat的帳號資訊等

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://org.opencloudb/">
    <system>
    <property name="defaultSqlParser">druidparser</property>
    </system>
    <!--帳號密碼以及所連結的邏輯庫-->
    <user name="test">
        <property name="password">test</property>
        <property name="schemas">mycat1,mycat2,mycat3</property>
    </user>

    <!--只讀的使用者資訊-->
    <user name="user">
        <property name="password">user</property>
        <property name="schemas">mycat1,mycat2,mycat3</property>
        <property name="readOnly">true</property>
    </user>
</mycat:server>

3、那麼你可以用mysql的客戶端,或者直接命令列的方式進入mysql客戶端,檢視資料庫。

這裡寫圖片描述

可以看到mycat把三個資料庫的內容都包含進來了,完成的垂直切分。

資料庫水平切分

除了可以按照業務將資料表分配到不同的的資料庫中做成垂直切分,很多時候,使用者量大的時候,例如一張使用者表有上億條資料,那麼一次性查資料肯定很慢,那麼我們可以這樣子,將這張表按照某種規則將資料存放到不同的資料庫中,例如可以按照使用者省份的不同,將資料切分到廣東省,北京市,上海市等資料庫中。下面假如我們有一張student表,因為資料量太多,就按照id的取餘規則,將資料分別存放到倆個數據庫中,架構如下:

這裡寫圖片描述

下面這麼配置:

1、修改MYCAT_HOME/conf/schema.xml,內容如下:

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/">

    <!-- tb_class和tb_student有外來鍵關聯關係,可以測試join -->
    <schema name="test" checkSQLschema="false" sqlMaxLimit="100">
       <table name="tb_class" dataNode="dn1,dn2" rule="rule1" primaryKey="id"/>
       <table name="tb_student" dataNode="dn1,dn2" rule="rule1" primaryKey="id"/>
    </schema>

    <dataNode name="dn1" dataHost="mycat101" database="mycat101" />
    <dataNode name="dn2" dataHost="mycat103" database="mycat103" />

    <dataHost name="mycat101" maxCon="1000" minCon="10" balance="0"
       writeType="0" dbType="mysql" dbDriver="native">
       <heartbeat>select user()</heartbeat>
       <writeHost host="host1" url="192.168.137.101:3306" user="root" password="123" />
    </dataHost>

    <dataHost name="mycat103" maxCon="1000" minCon="10" balance="0"
       writeType="0" dbType="mysql" dbDriver="native">
       <heartbeat>select user()</heartbeat>
       <writeHost host="host3" url="192.168.137.103:3306" user="root" password="123" />
    </dataHost>
</mycat:schema>

2、修改MYCAT_HOME/conf/server.xml,新增連結mycat的帳號資訊等

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://org.opencloudb/">
    <system>
    <property name="defaultSqlParser">druidparser</property>
    </system>
    <!--帳號密碼以及所連結的邏輯庫-->
    <user name="test">
        <property name="password">test</property>
        <property name="schemas">test</property>
    </user>

    <!--只讀的使用者資訊-->
    <user name="user">
        <property name="password">user</property>
        <property name="schemas">test</property>
        <property name="readOnly">true</property>
    </user>
</mycat:server>

3、定義切片規則,修改MYCAT_HOME/conf/rule.xml,這裡是安裝id進行切片

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://org.opencloudb/"> 
 <tableRule name="rule1">
    <!--安裝id規則,將id除於1024然後取餘,如果餘數落在0~512就將資料寫到第一個資料庫,如果是在512~1024就放到第二個資料庫-->
    <rule>
      <columns>id</columns>
      <algorithm>func1</algorithm>
    </rule>
 </tableRule>

 <!--分成倆片,每片的區間是512,必須要倆個相乘是1024-->
 <function name="func1" class="org.opencloudb.route.function.PartitionByLong">
    <property name="partitionCount">2</property>
    <property name="partitionLength">512</property>
 </function>
</mycat:rule>

4、進行測試,先看看,mycat資料庫表現是怎樣?

這裡寫圖片描述

test就是我們的邏輯庫,tb_class和tb_student就是我們的表,插入一條資料到tb_class中,id為1,1在0~512之間,應該插到第一個資料庫中,

這裡寫圖片描述

然後再插一條資料為id為513的,那麼應該在第二個資料庫中。

這裡寫圖片描述

然後在mycat表現的就是一張表,你可以隨便增刪改查。

這裡寫圖片描述

到此就把垂直切分和水平切分給完成了