MyCat系列八--数据分片之范围分片
MyCat系列八--数据分片之范围分片
范围分片根据指定的字段及其配置的范围与数据节点的对应情况,决定数据属于哪一个分片,此分片适用场景为:提前规划好分片字段某个范围属于哪个分片。
具体示例实现的步骤为如下(注:蓝色字体为本示例的相关内容):
- 新建表
CREATE TABLE `t_range` (
`id` int DEFAULT NULL,
`name` varchar(20) DEFAULT NULL
) ENGINE=InnoDB;
- 配置rule.xml
2.1 配置tableRule 标签
编辑rule.xml文件,增加或者修改如下:
<tableRule name="range_test">
<rule>
<columns>id</columns>
<algorithm>range_test</algorithm>
</rule>
</tableRule>
2.2 配置function 标签
编辑rule.xml文件,增加或者修改如下:
<function name="range_test" class="io.mycat.route.function.AutoPartitionByLong">
<property name="mapFile">range_test.txt</property>
<property name="defaultNode">0</property>
</function>
范围分片算法的相关property 子标签含义如下:
2.2.1 mapFile
对应的外部配置文件。
例如:
<property name="mapFile">range_test.txt</property>
2.2.2 defaultNode
超过范围后的默认节点。
例如:
<property name="defaultNode">0</property>
- 创建range_test.txt文件
在conf目录下,新建range_test.txt,并输入以下文本:
0-2000=0
2001-4000=1
4001-8000=2
代表:
范围0-2000,存储在节点1。
范围2001-4000,存储在节点2。
范围4001-8000,存储在节点3。
所有的节点配置都是从 0 开始, 0 代表节点 1
- 配置schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="testdb" checkSQLschema="true" sqlMaxLimit="100" randomDataNode="true">
<table name="t_range" dataNode="dn1,dn2,dn3" rule="range_test"></table>
</schema>
<dataNode name="dn1" dataHost="localhost" database="db_user_1" />
<dataNode name="dn2" dataHost="localhost" database="db_user_2" />
<dataNode name="dn3" dataHost="localhost" database="db_user_3" />
<dataHost name="localhost" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="localhost" url="localhost:3306" user="root"
password="123456">
</writeHost>
</dataHost>
</mycat:schema>
dataNode:数据节点,配置了dn1,dn2,dn3,分别指向不同的服务器及其数据库,这里也就是数据分片的配置。本示例为了简单,配置到同一台服务器的不同数据库上。
- 验证
重启MyCat服务。然后,我们进行如下SQL语句执行验证:
insert into t_range(id,name)
values (1,'张丽丽'),(2000,'王洁'), (2001,'李梦'),(4000,'赵雪'),(4001,'高明'), (8000,'齐凯'),(8001,'刘娟');
select * from t_range;
在MySQL的服务器上进行查询,如下所示:
select * from db_user_1.t_range;
select * from db_user_2.t_range;
select * from db_user_3.t_range;
从以上查询结果,可以看到数据的分片存储情况是正确的。
- 其它配置验证
在以上正确配置的基础上,我们修改一些标签的配置值为其它不同的值,进行一些验证。
注:以下修改仅限于提及的子标签配置,而其它配置保持不变。
6.1 range_test.txt
修改range_test.txt的内容为如下文本:
0-2K=0
2K-4K=1
4K-8K=2
注:可以使用如下字母来替代数值,K=1000,M=10000。
代表:
范围0-2000,存储在节点1。
范围2001-4000,存储在节点2。
范围4001-8000,存储在节点3。
所有的节点配置都是从 0 开始, 0 代表节点 1。
重启MyCat服务。然后,我们进行如下SQL语句执行验证:
delete from t_range;
insert into t_range(id,name)
values (1,'张丽丽'),(2000,'王洁'), (2001,'李梦'),(4000,'赵雪'),(4001,'高明'), (8000,'齐凯'),(8001,'刘娟');
在MySQL的服务器上进行查询,如下所示:
select * from db_user_1.t_range;
select * from db_user_2.t_range;
select * from db_user_3.t_range;
6.2 defaultNode
编辑rule.xml文件,修改超过范围后的默认节点。如下所示:
<property name="defaultNode">1</property>
重启MyCat服务。然后,我们进行如下SQL语句执行验证:
delete from t_range;
insert into t_range(id,name)
values (8002,'夏美娟'),(8003,'齐国');
在MySQL的服务器上进行查询,如下所示:
select * from db_user_1.t_range;
select * from db_user_2.t_range;
select * from db_user_3.t_range;
可以看到,不在范围内的数据存储到了第二个分片内。