一、取模
此规则是对分片字段求模运算。也就是水平分表里最常用的规则。例如 Mycat 之 水平拆分(分表) 主表【orders】采用的规则。
二、分片枚举
通过在配置文件中配置可能的枚举id,自己配置分片,本规则适用于特定的场景,比如有些业务需要按照省份或区县来保存,而全国省份区县固定的
1、配置文件
vim /usr/local/mycal/conf/schema.xml
<table name="orders_ware_info" dataNode="dn1,dn2" rule="sharding_by_intfile"></table>
在rule配置文件里新增分片规则sharding_by_intfile
vim /usr/local/mycal/conf/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>
<tableRule>中的
columns:分片字段;
algorithm:分片函数
<property>中的
mapFile:标识配置文件名称;
type:0为int型,非0为string;
defaultNode:默认节点。小于0表示不设置默认节点,大于等于0表示设置默认节点,设置默认节点如果碰不到识别的枚举值,就让它路由到默认节点,如不设置不识别就报错。
vim /usr/local/mycal/conf/partition-hash-int.txt
110=0
120=1
2、重启mycat服务
mycat console
3、在mycat创建表,并插入数据
#订单归属区域信息表
CREATE TABLE `orders_ware_info` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '编号',
`order_id` int(11) DEFAULT NULL COMMENT '订单编号',
`address` varchar(200) DEFAULT NULL COMMENT '地址',
`areacode` varchar(20) DEFAULT NULL COMMENT '区域编号',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
#插入数据
INSERT INTO ORDERS_WARE_INFO(id, order_id,address,areacode) VALUES (1,1,'北京','110');
INSERT INTO ORDERS_WARE_INFO(id, order_id,address,areacode) VALUES (2,2,'天津','120');
错误:
1)、执行insert语句时,报错
ERROR 1146 (HY000): Table 'orders.orders_ware_info' doesn't exist
原因:mycat创建的表名是大写的
解决方法:
INSERT INTO ORDERS_WARE_INFO(id, order_id,address,areacode) VALUES (1,1,'北京','110');
INSERT INTO ORDERS_WARE_INFO(id, order_id,address,areacode) VALUES (2,2,'天津','120');
2)、ERROR 1366 (HY000): Incorrect string value: '\xE5\x8C\x97\xE4\xBA\xAC' for column 'ADDRESS' at row 1
原因:创建表时为规定charset=utf8
解决方法:
创建表的时候规定好charset
4、在mycat、主机1、主机2里查看数据分片效果
三、范围约定
适用于提前规划好分片字段某个范围属于哪个分片。
1、配置文件
vim /usr/local/mycal/conf/schema.xml
<table name="payment_info" dataNode="dn1,dn2" rule="auto_sharding_long" ></table>
在rule配置文件里新增分片规则auto_sharding_long
vim /usr/local/mycal/conf/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>
<tableRule>中的
columns:分片字段;
algorithm:分片函数
<property>中的
mapFile:标识配置文件名称;
defaultNode:默认节点。小于0表示不设置默认节点,大于等于0表示设置默认节点,设置默认节点如果碰不到识别的枚举值,就让它路由到默认节点,如不设置不识别就报错。
vim /usr/local/mycal/conf/autopartition-long.txt
0-100=0
101-200=1
2、重启mycat服务
mycat console
3、在mycat创建表,并插入数据
#支付信息表
CREATE TABLE payment_info
(
`id` INT AUTO_INCREMENT comment '编号',
`order_id` INT comment '订单编号',
`payment_status` INT comment '支付状态',
PRIMARY KEY(id)
) DEFAULT CHARSET=utf8;
#插入数据
INSERT INTO PAYMENT_INFO (id,order_id,payment_status) VALUES (1,99,0);
INSERT INTO PAYMENT_INFO (id,order_id,payment_status) VALUES (2,100,1);
INSERT INTO PAYMENT_INFO (id,order_id ,payment_status) VALUES (3,101,0);
INSERT INTO PAYMENT_INFO (id,order_id,payment_status) VALUES (4,102,1);
4、在mycat、主机1、主机2里查看数据分片效果
四、按日期(天)分片
按天分片,设定时间格式、范围。
1、配置文件
vim /usr/local/mycal/conf/schema.xml
<table name="login_info" dataNode="dn1,dn2" rule="sharding_by_date" ></table>
在rule配置文件里新增分片规则sharding_by_date
vim /usr/local/mycal/conf/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">2020-11-21</property>
<property name="sEndDate">2020-11-24</property>
<property name="sPartionDay">2</property>
</function>
<tableRule>中的
columns:分片字段;
algorithm:分片函数
<property>中的
dateFormat:日期格式;
sBeginDate:开始日期。
sEndDate:结束日期,则代表数据达到了这个日期的分片后循环开始分片插入
sPartionDay:分区天数,即默认从开始日期算起,分隔2天一个分区
2、重启mycat服务
mycat console
3、在mycat创建表,并插入数据
#用户信息表
CREATE TABLE login_info
(
`id` INT AUTO_INCREMENT comment '编号',
`user_id` INT comment '用户编号',
`login_date` date comment '登录日期',
PRIMARY KEY(id)
)DEFAULT CHARSET=utf8;
#插入数据
INSERT INTO LOGIN_INFO(id,user_id,login_date) VALUES (1,101,'2020-11-21');
INSERT INTO LOGIN_INFO(id,user_id,login_date) VALUES (2,102,'2020-11-22');
INSERT INTO LOGIN_INFO(id,user_id,login_date) VALUES (3,103,'2020-11-23');
INSERT INTO LOGIN_INFO(id,user_id,login_date) VALUES (4,104,'2020-11-24');
INSERT INTO LOGIN_INFO(id,user_id,login_date) VALUES (5,103,'2020-11-25');
INSERT INTO LOGIN_INFO(id,user_id,login_date) VALUES (6,104,'2020-11-26');
4、在mycat、主机1、主机2里查看数据分片效果