MyCat分片规则之自定义范围分片

一、实现方式

  • 实现方式:范围分片,就是我们自己根据某个字段的数值范围来确定这些数据到底存放在哪一个分片上,不过需要我们提前规划好分片字段某个范围属于哪个分片。切分规则根据文件(autopartition-long.txt)配置的范围来进行切片,根据配置的分片字段取值范围,然后把这一范围的所有数据都插入到该分片。
  • 举个例子:比如将id在0-500W的数据分片在第一个节点上面,将id在500W-1000W的数据分片在第二个节点上,依次类推下去。
  •  
  • 优点:适用于想明确知道某个分片字段的某个范围具体在哪一个节点;
  • 缺点:如果短时间内有大量的批量插入操作,那么某个分片节点可能一下子会承受比较大的数据库压力,而别的分片节点此时可能处于闲置状态,无法利用其它节点进行分担压力(热点数据问题);

下面通过一个简单的示例,说明在MyCat中如何实现范围分片。

二、范围分片

【a】创建数据库和表

create database range1;
use range1;
create table user(id bigint not null primary key,name varchar(20));

create database range2;
use range2;
create table user(id bigint not null primary key,name varchar(20));

【b】配置server.xml:

<user name="root">
        <property name="password">0905</property>
        <property name="schemas">TESTDB</property>

        <!-- 表级 DML 权限设置 -->
        <!--            
        <privileges check="false">
                <schema name="TESTDB" dml="0110" >
                        <table name="tb01" dml="0000"></table>
                        <table name="tb02" dml="1111"></table>
                </schema>
        </privileges>           
         -->
</user>

<user name="user">
        <property name="password">user</property>
        <property name="schemas">TESTDB</property>
        <property name="readOnly">true</property>
</user>

【c】配置schema.xml分片表、分片节点等

<schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="1000">
        <table name="user" dataNode="dn1,dn2" primaryKey="id" rule="auto-sharding-long" />
</schema>

<dataNode name="dn1" dataHost="dataHost01" database="range1" />
<dataNode name="dn2" dataHost="dataHost01" database="range2" />

<dataHost name="dataHost01" maxCon="1000" minCon="10" balance="0"
                  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
        <heartbeat>select user()</heartbeat>
        <writeHost host="hostM1" url="192.168.179.130:3306" user="root" password="0905" />
</dataHost>

 

【d】配置rule.xml自定义范围分片

<function name="rang-long"
        class="io.mycat.route.function.AutoPartitionByLong">
        <property name="mapFile">autopartition-long.txt</property>
        <property name="defaultNode">0</property>
</function>
        
<tableRule name="auto-sharding-long">
        <rule>
                <columns>id</columns>
                <algorithm>rang-long</algorithm>
        </rule>
</tableRule>

【e】配置autopartition-long.txt文件,说明分片字段分片范围

vim autopartition-long.txt

注意:这里配置了dn1,dn2两个分片节点,所以这里也配置两个节点对应的分片字段范围,如果配置多了可能会报错。

【f】测试插入数据

insert into user(id,name) values(111,'zhangsan');
insert into user(id,name) values(222,'lisi');
insert into user(id,name) values(5000001,'wangwu');
insert into user(id,name) values(10000001,'zhaoliu');

 

如上两图可见,成功实现了id在0-500W范围内就被插入到了第一个分片上dn1,id在500W-1000W范围内被插入到第二个分片上dn2,并且配置了如果ID都不在这两个范围内的默认节点,被分配到了第一个节点上(默认节点)。

三、总结

实现范围分片大体步骤:

  • server.xml配置用户信息、逻辑库等;
  • schema.xml配置分片规则、分片表;
  • 配置autopartition-long.txt文件,说明分片字段分片范围;
  • rule.xml配置分片规则以及默认节点等;

注意事项:分片规则配置文件autopartition-long.txt中配置的节点要跟dataNode数量对应上,不然可能会报错。

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页
实付 19.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值