1. 程式人生 > 實用技巧 >Mycat(水平拆分---分表 常規分片規則 )

Mycat(水平拆分---分表 常規分片規則 )

1.取模

此規則對分片欄位 求摸運算。也是水平分表最常用的規則。上篇文章分表中,orders表採用了此規則。

2.分片列舉

通過在配置檔案中配置可能的列舉id,自己配置分片,本規則適用於特定的場景,比如有些業務需要按照省份或者區縣來做儲存,而全國省份區縣固定的,這類業務使用本條規則。

2.1修改schema.xml配置檔案

<table name="orders_ware_info" dataNode="dn1,dn2" rule="shading_by_intfile"></table>

2.2修改rule.xml配置檔案

<tableRule name="
sharding_by_intfile"> <rule> <columns>areacode</columns> <algorithm>hash-int</algorithm> </rule> </tableRule>
#columns:分片欄位 ,algorithm:分片函式

<function name="hash-int"
class="io.mycat.route.function.PartitionByFileMap">
<property name="mapFile">partition-hash-int.txt</property>
<property name="type">1</property>
<property name="defaultNode">0</property>
</function>

#mapFile :標識配置檔名稱,type:0為int型別、豐0為String
#defaultNode:預設節點:小於0 表示不設定預設節點,大於等於0表示設定預設節點,設定預設節點如果碰不到不識別的列舉值,就讓他路由到預設節點,如果不設定不識別就報錯。

檢視 partition-hash-int.txt

10000=0
10010=1

重啟mycat
訪問mycat 建立表 訂單歸屬區域資訊表

CREATE TABLE orders_ware_info(
`id` INT AUTO_INCREMENT,
`order_id` INT ,
`address` VARCHAR(200) ,
`areacode` VARCHAR(
20) , PRIMARY KEY(id) ); 插入資料: insert into orders_ware_info(id,order_id,address,areacode) values(1,1,'beijing',10000); insert into orders_ware_info(id,order_id,address,areacode) values(2,2,'tianjing',10010);

查詢Mycat,dn1,dn2

3.範圍約定

此分片適用於,提前規劃好分片欄位某個範圍屬於哪個分片。

3.1修改schema.xml配置檔案

<table name="payment_info" dataNode="dn1,dn2" rule="auto_sharding_long"></table>

3.2修改rule.xml配置檔案

<tableRule name="auto_sharding_long">
                <rule>
                        <columns>order_id</columns>
                        <algorithm>rang-long</algorithm>
                </rule>
        </tableRule>


 <function name="rang-long"
                class="io.mycat.route.function.AutoPartitionByLong">
                <property name="mapFile">autopartition-long.txt</property>
                <property name="defaultNode">0</property>
        </function>

3.3修改配置檔案autopartition-long.txt 由於這個配置檔案在docker容器中,這裡我把它複製到宿主機裡面修改

docker cp mycat:/usr/local/mycat/conf/autopartition-long.txt /cjh_docker/mycat/conf/
修改內容
0-101=0
103-200=1

docker cp /cjh_docker/mycat/conf/autopartition-long.txt mycat:/usr/local/mycat/conf

3.4重啟mycat

訪問mycat

支付資訊表
CREATE TABLE payment_info(
`id`  INT AUTO_INCREMENT,
`order_id` INT,
`payment_status` INT,
PRIMARY KEY(id)
);

插入資料
insert into payment_info(id,order_id,payment_status) values(1,101,0);
insert into payment_info(id,order_id,payment_status) values(2,102,1);
insert into payment_info(id,order_id,payment_status) values(3,103,0);
insert into payment_info(id,order_id,payment_status) values(4,104,1);

檢視

4.按日期(天)分片

此規則按天分片。設定時間格式、範圍

修改schemax.xml配置檔案

 <table name="login_info" dataNode="dn1,dn2" rule="sharding_by_date"></table>

修改rule.xml配置檔案

<tableRule name="sharding_by_date">
                <rule>
                        <columns>login_date</columns>
                        <algorithm>shardingByDate</algorithm>
                </rule>
        </tableRule>


 <function name="shardingByDate"
                class="io.mycat.route.function.PartitionByDate">
                <property name="dateFormat">yyyy-MM-dd</property>
                <property name="sBeginDate">2019-01-01</property> 
                <property name="sEndDate">2019-01-04</property>
                <property name="sPartionDay">2</property>
        </function>

#dateFormat:日期格式
#sBeginDate:開始時間
#sEndDate 結束日期,則代表資料達到了這個日期的分片後迴圈從開始分片插入
#sPartionDay:分割槽天數,預設從開始日期算起,分隔2天一個區分

重啟mycat

訪問mycat建立表

CREATE TABLE login_info(
    `id` INT AUTO_INCREMENT,
    `user_id` INT ,
    `login_date` Date,
    PRIMARY KEY(id)
);

insert into login_info(id,user_id,login_date) VALUES (1,101,'2019-01-01')
insert into login_info(id,user_id,login_date) VALUES (2,102,'2019-01-02');
insert into login_info(id,user_id,login_date) VALUES (3,103,'2019-01-03');
insert into login_info(id,user_id,login_date) VALUES (4,104,'2019-01-04');
insert into login_info(id,user_id,login_date) VALUES (5,105,'2019-01-05');
insert into login_info(id,user_id,login_date) VALUES (6,106,'2019-01-06');

查詢mycat、dn1、dn2 可以看見資料分片效果