天天看点

Mycat 分表扩展之常用分片规则

一、取模

此规则是对分片字段求模运算。也就是水平分表里最常用的规则。例如 Mycat 之 水平拆分(分表) 主表【orders】采用的规则。

二、分片枚举

通过在配置文件中配置可能的枚举id,自己配置分片,本规则适用于特定的场景,比如有些业务需要按照省份或区县来保存,而全国省份区县固定的

1、配置文件

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

<table name="orders_ware_info" dataNode="dn1,dn2" rule="sharding_by_intfile"></table>
           
Mycat 分表扩展之常用分片规则

在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>
           
Mycat 分表扩展之常用分片规则
Mycat 分表扩展之常用分片规则

<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里查看数据分片效果

Mycat 分表扩展之常用分片规则

三、范围约定

适用于提前规划好分片字段某个范围属于哪个分片。

1、配置文件

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

<table name="payment_info" dataNode="dn1,dn2" rule="auto_sharding_long" ></table>
           
Mycat 分表扩展之常用分片规则

在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里查看数据分片效果

Mycat 分表扩展之常用分片规则

四、按日期(天)分片

按天分片,设定时间格式、范围。

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里查看数据分片效果

Mycat 分表扩展之常用分片规则