Mycat(水平拆分---分表 常規分片規則 )
1.取模
此規則對分片欄位 求摸運算。也是水平分表最常用的規則。上篇文章分表中,orders表採用了此規則。
通過在配置檔案中配置可能的列舉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 可以看見資料分片效果