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 可以看见数据分片效果