原理概述
实现方式:范围分片,就是我们自己根据某个字段的数值范围来确定这些数据到底存放在哪一个分片上,不过需要我们提前规划好分片字段某个范围属于哪个分片。切分规则根据文件(autopartition-long.txt)配置的范围来进行切片,根据配置的分片字段取值范围,然后把这一范围的所有数据都插入到该分片。
举个例子:比如将id在0-500W的数据分片在第一个节点上面,将id在500W-1000W的数据分片在第二个节点上,依次类推下去。
优点:适用于想明确知道某个分片字段的某个范围具体在哪一个节点;
缺点:如果短时间内有大量的批量插入操作,那么某个分片节点可能一下子会承受比较大的数据库压力,而别的分片节点此时可能处于闲置状态,无法利用其它节点进行分担压力(热点数据问题);
为方便测试,本实例在以下案例中测试
https://blog.csdn.net/qq_41712271/article/details/114984855?spm=1001.2014.3001.5501
1 schema.xml配置
<schema name="logic_shop_db" checkSQLschema="true" sqlMaxLimit="100"><!-- 逻辑表配置 --><!-- 取模分片测试 ,重点看 rule --><table name="news" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
</schema>
2 rule.xml配置
<tableRule name="auto-sharding-long"><rule><!-- 标识将要分片的表字段 --><columns>id</columns><!-- 指定分片函数与function的对应关系 --> <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">2</property><!-- 默认值为0 ; 0 表示Integer , 1 表示String --><property name="type">0</property>
</function>
3 autopartition-long.txt 配置如下:
# range start-end ,data node index
# K=1000,M=10000.
0-500M=0
500M-1000M=1
1000M-1500M=2
含义为 : 0 - 500 万之间的值 , 存储在0号数据节点 ; 500万 - 1000万之间的数据存储在1 号数据节点 ; 1000万 - 1500 万的数据节点存储在2号节点 ;
4 重启mycat服务,开始测试
insert into news(id,name) values(111,'zhangsan');
insert into news(id,name) values(222,'lisi');
insert into news(id,name) values(5000001,'wangwu');
insert into news(id,name) values(10000001,'zhaoliu');