MyCat系列十九--数据分片之应用指定分片
MyCat系列十九--数据分片之应用指定分片
此规则由应用自主决定路由到哪个分片。
具体示例实现的步骤为如下(注:蓝色字体为本示例的相关内容):
- 新建表
CREATE TABLE `t_app` (
`id` int DEFAULT NULL,
`name` varchar(20) DEFAULT NULL
) ENGINE=InnoDB;
- 配置rule.xml
2.1 配置tableRule 标签
编辑rule.xml文件,增加或者修改如下:
<tableRule name="sharding-by-app">
<rule>
<columns>id</columns>
<algorithm>sharding-by-app</algorithm>
</rule>
</tableRule>
2.2 配置function 标签
编辑rule.xml文件,增加或者修改如下:
<function name="sharding-by-app" class="io.mycat.route.function.PartitionDirectBySubString">
<property name="startIndex">0</property>
<property name="size">2</property>
<property name="partitionCount">3</property>
<property name="defaultPartition">0</property>
</function>
应用指定分片算法的相关property 子标签含义如下:
2.2.1 startIndex
获取子串的开始位置。
例如:
<property name="startIndex">0</property>
2.2.2 size
获取子串的长度。
例如:
<property name="size">2</property>
2.2.3 partitionCount
分片数。
例如:
<property name="partitionCount">3</property>
2.2.4 defaultPartition
默认分片。
例如:
<property name="defaultPartition">0</property>
- 配置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_app" dataNode="dn1,dn2,dn3" rule="sharding-by-app"></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_app(id,name)
values ('00100','吴敏')
,('01200','张丽丽')
,('02300','王洁');
select * from t_app;
在MySQL的服务器上进行查询,如下所示:
select * from db_user_1.t_app;
select * from db_user_2.t_app;
select * from db_user_3.t_app;
从以上查询结果,可以看到数据的分片存储情况。Id=’00100’,获取长度为2的子串为00,则需要将该数据存储到index=0的分片中,且id的最终存储值为100,以此类推。需要注意id的组成算法。