-
准备与说明
场景
根据数据表某个字段的值,手动配置分片,例如:不同省份的数据保存到不同节点。这里举例:订单区域表(orders_area_info)根据区域编号字段(areacode)的将不同区域的数据存储到不同的节点
拆分方案及定义
- 在文章 https://blog.csdn.net/shuair/article/details/118885670(mycat水平分表) 描述内容的基础上,添加订单区域表(orders_area_info)
- mycat逻辑库:TESTDB103
- mysql物理库:两个节点,库名均为orders103
准备:提前搭建好mycat,可以参考文章:https://blog.csdn.net/shuair/article/details/118546292
-
修改schema.xml
警告:所有的schema写在一起、所有的dataNode写在一起、所有的dataHost写在一起
<table name="orders_area_info" dataNode="dn10301,dn10302" rule="orders-sharding-by-intfile"></table>
-
修改rule.xml
警告:所有的tableRule写在一起、所有的function写在一起
<!-- 省略其它tableRule -->
<!-- 配置一个分表规则 -->
<tableRule name="orders-sharding-by-intfile">
<rule>
<!-- 分片字段 -->
<columns>areacode</columns>
<!-- 分片算法 -->
<algorithm>orders-hash-int</algorithm>
</rule>
</tableRule>
<!-- 省略其它function -->
<!-- 定义分片算法,后面有写好的算法hash-int,复制一份,调整内容即可 -->
<function name="orders-hash-int" class="io.mycat.route.function.PartitionByFileMap">
<!-- 配置文件 -->
<property name="mapFile">orders-partition-hash-int.txt</property>
<!-- 0为int型,非0为String -->
<property name="type">1</property>
<!-- 小于0表示不设置默认节点,大于等于0表示设置默认节点,数值为节点的编号,编号从0开始。遇到不识别的枚举值时,设置默认节点路由到默认节点,不设置默认节点则报错 -->
<property name="defaultNode">0</property>
</function>
-
创建分片算法配置文件
rule.xml同目录(conf目录)创建配置文件 :orders-partition-hash-int.txt,在这个文件中手动指定区域编号与节点之间的对应关系
110=0
120=1
重启mycat
-
创建数据表
可以在mycat窗口创建数据表,但是可能会出现异常,这里直接在mysql数据库创建表,两个节点分别创建订单区域表(orders_area_info )
DROP TABLE IF EXISTS orders_area_info;
CREATE TABLE orders_area_info (
`id` INT auto_increment PRIMARY KEY COMMENT '主键',
`order_id` INT COMMENT '订单编号',
`address` VARCHAR ( 200 ) COMMENT '地址',
`areacode` VARCHAR ( 20 ) COMMENT '区域编号'
);
-
添加测试数据
在mycat窗口添加测试数据
INSERT INTO `orders_area_info` ( `id`, `order_id`, `address`, `areacode` ) VALUES ( 1, 1, '北京', '110' );
INSERT INTO `orders_area_info` ( `id`, `order_id`, `address`, `areacode` ) VALUES ( 2, 2, '天津', '120' );
此时查看数据库,会发现:areacode=110的数据在第1个节点上,areacode=120的数据在第2个节点上
此时mycat分片枚举就配置完成了