Mycat 水平拆分----分表

相對於垂直拆分,水平拆分不是將表做分類,而是按照某個字段的某種規則來分散到多個庫之中,

每個表中 包含一部分數據。簡單來說,我們可以將數據的水平切分理解爲是按照數據行的切分,就

是將表中的某些行切分 到一個數據庫,而另外的某些行又切分到其他的數據庫中,如下圖:

MySQL單表存儲數據條數是有瓶頸的,單表達到 1000 萬條數據就達到了瓶頸,會影響查詢效率,需要進行水平拆分(分表)進行優化。

Mycat原理圖如下 :

Mycat和Mysql環境搭建如前幾篇文章。

主/從機IP如下說明:

192.168.1.111       主機   dn1

192.168.1.109      從機   dn2

具體分表操作有如下幾個步驟:

一. 選擇分表字段

以 orders 表(表結構語句如下面)爲例,可以根據不同字段進行分表

(1)id(主鍵、或創建時間)    查詢訂單注重時效,歷史訂單被查詢的次數少,如此分片會造成一個節點訪問多,一個訪問少,不平均。

(2)customer_id(客戶 id)    根據客戶 id 去分,兩個節點訪問平均,一個客戶的所 有訂單都在同一個節點。故此處選擇它來分表。

二.   修改schema.xml配置文件

添加table語句(如下截圖),將orders表掛載在兩個節點(dn1,dn2)上

vim /usr/local/mycat/conf/schema.xml

<table name="orders" dataNode="dn1,dn2" rule="mod_rule"></table>

三. 修改分表規則---客戶id(customer_id)取模

經過前面的分析,我們選擇了客戶id這個字段來作爲分表字段。

在 rule 配置文件裏新增分片規則 mod_rule,並指定規則適用字段爲 customer_id,選擇分片算法 mod-long(對字段求模運算),customer_id 對2個節點(dn1,dn2)求模。

根據結果分片配置算法 mod-long 參數 count 爲 2,即兩個節點。

說明:mod-long(mycat自帶的算法)

vim /usr/local/mycat/conf/rule.xml

把 mod-long函數算法的節點數修改爲2個節點,因爲這裏我們只有兩個節點(dn1,dn2)

rule修改部分的源文件內容:

 <tableRule name="mod_rule">
    <rule>
      <columns>customer_id</columns>
      <algorithm>mod-long</algorithm>
    </rule>
 </tableRule>

四. 登錄dn2上的mysql 創建orders這個表

在上節垂直分庫中,我已經在dn1上創建了orders表,此處dn1上就不需要再創建表了

登錄mysql:cd /usr/local/mysql/bin

./mysql -u root -p

創建訂單表 語句如下:

CREATE TABLE orders(

    id INT AUTO_INCREMENT,

    order_type INT,

    customer_id INT,

    amount DECIMAL(10,2),

    PRIMARY KEY(id)

);

五.  訪問 Mycat 實現分片

1. 重啓 Mycat,讓配置生效

cd /usr/local/mycat/bin

./mycat console

2. 登錄mycat

mysql -u mycat -p -h 192.168.1.111 -P 8066

密碼:123456

3. 通過mycat插入數據到orders表中

INSERT INTO orders(id,order_type,customer_id,amount) VALUES (1,101,100,100100); 
INSERT INTO orders(id,order_type,customer_id,amount) VALUES(2,101,100,100300); 
INSERT INTO orders(id,order_type,customer_id,amount) VALUES(3,101,101,120000);
INSERT INTO orders(id,order_type,customer_id,amount) VALUES(4,101,101,103000); 
INSERT INTO orders(id,order_type,customer_id,amount) VALUES(5,102,101,100400); 
INSERT INTO orders(id,order_type,customer_id,amount) VALUES(6,102,100,100020);

4. 通過mycat查詢剛剛我們插入的那6條數據(select * from orders;)

六. 分表操作結果分析

如下圖所示,可以看出customer_id=100的數據通過取模操作,3條數據全部插入到了主機中(dn1)。

customer_id=101的通過取模操作,3條數據全部插入到了從機中(dn2)。

也就是說通過配置mycat中的rule.xml規則文件(這裏選擇的是對customer_id取模),將通過mycat插入的數據很好的分到了2個節點上的orders表中,從而達到了分表的目的,減輕了數據庫的壓力。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章