1、 取模
此規則爲對分片字段求摸運算。也是水平分表最常用規則。5.1 配置分表中,orders 表採用了此規
則。
2、 分片枚舉
通過在配置文件中配置可能的枚舉 id,自己配置分片,本規則適用於特定的場景,比如有些業務
需要按照省份或區縣來做保存,而全國省份區縣固定的,這類業務使用本條規則。
(1).修改 Mycat 的配置文件 /usr/local/mycat/conf/schema.xml
<table name="orders_ware_info" dataNode="dn1,dn2" rule="sharding_by_intfile" ></table>
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
<table name="customer" dataNode="dn2"></table>
<table name="orders" dataNode="dn1,dn2" rule="mod_rule" >
<childTable name="orders_detail" primaryKey="id" joinKey="order_id" parentKey="id" />
</table>
<table name="dict_order_type" dataNode="dn1,dn2" type="global" ></table>
<table name="orders_ware_info" dataNode="dn1,dn2" rule="sharding_by_intfile" ></table>
</schema>
<dataNode name="dn1" dataHost="host1" database="orders" />
<dataNode name="dn2" dataHost="host2" database="orders" />
<dataHost name="host1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="172.16.94.131:3306" user="root"
password="Zan_123456">
</writeHost>
</dataHost>
<dataHost name="host2" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM2" url="172.16.94.133:3306" user="root"
password="Zan_123456">
</writeHost>
</dataHost>
</mycat:schema>
(2) 修改rule.xml配置文件
<tableRule name="sharding_by_intfile">
<rule>
<columns>areacode</columns>
<algorithm>hash-int</algorithm>
</rule>
</tableRule>
<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>
# columns:分片字段,algorithm:分片函數
# mapFile:標識配置文件名稱,type:0爲int型、非0爲String,
#defaultNode:默認節點:小於 0 表示不設置默認節點,大於等於 0 表示設置默認節點,
# 設置默認節點如果碰到不識別的枚舉值,就讓它路由到默認節點,如不設置不識別就報錯
(3)修改partition-hash-int.txt配置文件
110=0
120=1
(4).重啓 Mycat,讓配置生效
[root@shuidi01 bin]# ./mycat stop
Stopping Mycat-server...
Stopped Mycat-server.
[root@shuidi01 bin]# ./mycat start
Starting Mycat-server...
(5)訪問Mycat創建表
#訂單歸屬區域信息表
CREATE TABLE orders_ware_info
(
`id` INT AUTO_INCREMENT comment '編號',
`order_id` INT comment '訂單編號',
`address` VARCHAR(200) comment '地址',
`areacode` VARCHAR(20) comment '區域編號',
PRIMARY KEY(id)
#(6)插入數據
INSERT INTO orders_ware_info(id, order_id,address,areacode) VALUES (1,1,'beijing','110');
INSERT INTO orders_ware_info(id, order_id,address,areacode) VALUES (2,2,'tianjing','120');
(7)查詢Mycat、dn1、dn2可以看到數據分片效果
select * from orders_ware_info;
3、 範圍約定
此分片適用於,提前規劃好分片字段某個範圍屬於哪個分片。
(1).修改 Mycat 的配置文件 /usr/local/mycat/conf/schema.xml
<table name="payment_info" dataNode="dn1,dn2" rule="auto_sharding_long" ></table>
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
<table name="customer" dataNode="dn2"></table>
<table name="orders" dataNode="dn1,dn2" rule="mod_rule" >
<childTable name="orders_detail" primaryKey="id" joinKey="order_id" parentKey="id" />
</table>
<table name="dict_order_type" dataNode="dn1,dn2" type="global" ></table>
<table name="orders_ware_info" dataNode="dn1,dn2" rule="sharding_by_intfile" ></table>
<table name="payment_info" dataNode="dn1,dn2" rule="auto_sharding_long" ></table>
</schema>
<dataNode name="dn1" dataHost="host1" database="orders" />
<dataNode name="dn2" dataHost="host2" database="orders" />
<dataHost name="host1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="172.16.94.131:3306" user="root"
password="Zan_123456">
</writeHost>
</dataHost>
<dataHost name="host2" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM2" url="172.16.94.133:3306" user="root"
password="Zan_123456">
</writeHost>
</dataHost>
</mycat:schema>
(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>
# columns:分片字段,algorithm:分片函數
# mapFile:標識配置文件名稱
#defaultNode:默認節點:小於 0 表示不設置默認節點,大於等於 0 表示設置默認節點,
# 設置默認節點如果碰到不識別的枚舉值,就讓它路由到默認節點,如不設置不識別就
報錯
(3)修改autopartition-long.txt配置文件
0-102=0
103-200=1
(4).重啓 Mycat,讓配置生效
[root@shuidi01 bin]# ./mycat stop
Stopping Mycat-server...
Stopped Mycat-server.
[root@shuidi01 bin]# ./mycat start
Starting Mycat-server...
(5)訪問Mycat創建表
#支付信息表
CREATE TABLE payment_info
(
`id` INT AUTO_INCREMENT comment '編號',
`order_id` INT comment '訂單編號',
`payment_status` INT comment '支付狀態',
PRIMARY KEY(id)
);
(6)插入數據
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);
(7)查詢Mycat、dn1、dn2可以看到數據分片效果
4、 按日期(天)分片
此規則爲按天分片。設定時間格式、範圍
(1).修改 Mycat 的配置文件 /usr/local/mycat/conf/schema.xml
<table name="login_info" dataNode="dn1,dn2" rule="sharding_by_date" ></table>
(2)修改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>
# columns:分片字段,algorithm:分片函數
#dateFormat :日期格式
#sBeginDate :開始日期
#sEndDate:結束日期,則代表數據達到了這個日期的分片後循環從開始分片插入
#sPartionDay :分區天數,即默認從開始日期算起,分隔 2 天一個分區
(3).重啓 Mycat,讓配置生效
[root@shuidi01 bin]# ./mycat stop
Stopping Mycat-server...
Stopped Mycat-server.
[root@shuidi01 bin]# ./mycat start
Starting Mycat-server...
(4)訪問Mycat創建表
#用戶信息表
CREATE TABLE login_info
(
`id` INT AUTO_INCREMENT comment '編號',
`user_id` INT comment '用戶編號',
`login_date` date comment '登錄日期',
PRIMARY KEY(id)
);
(5)插入數據
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,103,'2019-01-05');
INSERT INTO login_info(id,user_id,login_date) VALUES (6,104,'2019-01-06');
(6)查詢Mycat、dn1、dn2可以看到數據分片效果