Mycat(水平拆分---分表 常规分片规则 )

1.取模

此规则对分片字段 求摸运算。也是水平分表最常用的规则。上篇文章分表中,orders表采用了此规则。

2.分片枚举

通过在配置文件中配置可能的枚举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

Mycat(水平拆分---分表   常规分片规则 )

 

 

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);

查看

Mycat(水平拆分---分表   常规分片规则 )

 

 

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

Mycat(水平拆分---分表   常规分片规则 )

 

上一篇:数据库的主从以及mycat的特性


下一篇:06-MySQL基于MyCat的分布式数据库的搭建