开发者学堂课程【全面讲解开源数据库中间件MyCat使用及原理(二):MyCat - 分片 - 分片规则 - 枚举分片】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/756/detail/13267
MyCat - 分片 - 分片规则 - 枚举分片
内容介绍:
一、概念
二、演示
一、概念
枚举分片,指的是可以通过配置文件当中配置可能枚举的值。这个可能枚举的值指的是某一个字段可能枚举的值,指定数据分布到不同的数据节点上。枚举分片比较常用或者典型的应用场景是按照一些状态:性别、省份这些方面进行业务拆分。拆分的业务就可以使用枚举。
枚举分片规则的配置如下:
<tableRule name=“sharding-by-intfile”>
<rule>
<columns>status</columns>
<algorithm>hash-int</ algorithm>
</rule>
</tableRule>
枚举分片默认的名称做 sharding-by-intfile, 可以指定按照哪个字段进行枚举分片,也可以自己定义。比如按照状态是 status,然后分片算法叫 hash-int。class是枚举分片的处理的类。
<function name=”hash-int”class=”io.mycat.route.function. PartitionByFileMap”>
<property name =”mapFile‘’>partition-hash-int.txt</property>
<property name =”type‘’>0</property>
<property name =”defaultNode‘’>0</property>
</function>
以上配置了三个属性。第一个映射的文件 mapFile。在 mapFile 对应的文件当中,它所需要配置的是枚举值与分片节点的一个对应关系。type 表示的是该字段的类型。接下来还有一个是否有默认的 defaultNode 节点。
partition-hash-int.txt 内容如下:
1=0
2=1
3=2
partition-hash-int.txt 映射文件当中配置的格式是一个 key 和 value。注意 key 的123 可能就是上面 status 的枚举值。对应的节点相当于是 0、1、2,分别对应了三个节点。即如果 status 值为 1,会坐落在第一个节点上。如果 status 值为 2,将坐落在第二个节点。如果 status 值为 3,将坐落在第三个节点。
二、演示
首先需要定义逻辑表,拷贝<table name=”tb_log”dataNode=”dn1,dn2,dn3” rule=”auto-sharding-long”/>
<tablename=”tb_user”dataNode=”dn1,dn2,dn3” rule=”auto-sharding-long”/>
接着关注分片规则 rule.xml 。可以直接把下面的分片规则放置在 rule 中。
<tableRule name=“sharding-by-intfile”>
<rule>
<columns>status</columns>
<algorithm>hash-int</ algorithm>
</tableRule>
当然更改 sharrding_id 也可以,但是假如在业务系统当中有另一张表,它的分片规则想要按照枚举分片的规则进行,但是分片的字段名不一样。所以同一个分片规则是可以定义多个的。
再次定义 TableRule, 重新命名为 “sharding-by-enum-status”
,修改为<columns>status</columns>
<algorithm>hash-int</ algorithm>
hash-int 所关联的就是分片函数 hash-int:
<function name=”hash-int”
class=”io.mycat.route.function. PartitionByFileMap”>
<property name =”mapFile‘’>partition-hash-int.txt</property
当然 function 也允许定义多个。
分片规则已经定义出来,接下来需要在 scheme.xml 中的逻辑表来引用分片规则,然后还需要去修改 partition-hash-int.txt 文件。
举例如下:用户表里面有 id、username、status。status 的取值只可能为三个值:1 是未启用,2 代表已启用,3 代表已关闭。即 status 的取值为 123,那么它的枚举也是三个:1=0、2=1、3=2。当 status 值是 1 时,它坐落在第一个节点上;status 值为 2 的时候,它坐落在第二个节点上;status 值为 3 时,将会坐落在第三个节点上。后面从 0 开始的数,是分片节点的索引值。
以上操作下已经配置完毕。那么一旦文件变化,就需要重启 mycat。mycat 启动完成之后,重新输入密码 123456,接下来在 mysql 后分别输入 show databases 和 PARTITION_DB 切换数据库。发现里面有两张逻辑表,一个是 tb_log,一个是tb_user。tb_user 的表结构还没有定义,接下来需要创建有 tb_user 的表结构。执行以下代码:
CREATE TABLE “tb_user”(
id bigint(20) NOT NULL COMMENT ‘ID’,
username varchar(200) DEFAULT NULL COMMENT‘姓名’,
status int (2) DEFAULT ‘1‘COMMENT’1:未启用,2:已启用,3:已关闭,
PRIMARY KEY (’id‘)
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
user 的表结构已经创建出来,接下来再往 user 中插入数据。注意 status 的取值在123 之间。
再插入以下代码:
insert into tb_log(id,operateuser,operation)values(1,‘Tom’,1);insert into tb_log(id,operateuser,operation)values(2,‘Cat’,2);insert into tb_log(id,operateuser,operation)values(3,‘Rose’,3);insert into tb_log(id,operateuser,operation)values(4,‘Coco’,2);insert into tb_log(id,operateuser,operation)values(5,‘Lily’,1);
再次浏览可以看到 1、2、3、4、5 节点的数据已经插入。接着关注 1、2、3、4、5 数据到坐落在哪一个节点,是否是 status 为 1,就在第一个节点上呢,如果status为2,就在第二个节点上的结果。
在 mysql 后输入 select*from tb_user,
可以看到 status 为 1。接下来再到第二个节点当中看 status 为 2,到第三个节点中来看 status 为 3,
是按照指定的规则 status 的枚举值进行分片。
那么假如进行数据插入时,插入了一个值 4,4 没有在配置文件当中配置,会出现报错的现象,不能找到有效的一个数据节点。
如果不想出现报错的情况,可以配置 defaultNode,
<property name=”defaultNode”>0</property>
它是默认的节点,配置 defaultNode 属性就可以避免报错的发生。