开发者学堂课程【全面讲解开源数据库中间件MyCat使用及原理(二):MyCat - 分片 - 分片规则 - 范围分片】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/756/detail/13266
MyCat - 分片 - 分片规则 - 范围分片
内容介绍:
一、概念
二、演示
一、概念
第二种分片规则叫做范围分片。范围分片可以根据指定的字段及其配置的范围与数据节点的对应情况,来决定数据属于哪一个分片。
<tableRule name=“auto-sharding-long”>
<rule>
<columns>id</columns>
<algorithm>mod-long</ algorithm>
</rule>
</tableRule>
这个分片规则的名称叫 auto-sharding-long, 也可以自己定义,指定的字段是根据 id 字段来范围分片。使用的算法是 rang-long,指定分片处理所涉及到的类。mapFile 描述配置的范围与数据节点的对应情况
<function name=”rang-long”class=”io.mycat.route.function.AutoPartitionByLong”>
<property name =”mapFile‘’>autopartition-long.txt</property>
<property name =”defaultNode‘’>0</property>
</function>
autopartition-long.txt 配置如下:
#range start-end,data node index
#k=1000,m=10000.
0-500M=0
500M-1000M=1
1000M-1500M=2
autopartition-long.txt 中,M=10000,0-500M=0 代表的是 0 到 500 万条记录,是在第一个节点,第 500 万条记录到 1000 万条记录之间是在第二个节点。第 1000 万个记录到 1500 万的条记录在第三个节点上。
二、演示
打开配置文件来配置 tb_log 表,关联的是 rule.xml 中的分片规则,而要使用的是auto-sharding-long 规则,粘贴 auto-sharding-long 规则。
下面的 rang-long 函数,关联 autopartition-long.txt,里面配置的内容就是刚才看到的内容。代表的是只能存储 1500 万条记录。如果超过 1500 万条,在入门程序当中的测试,插入了 15000001 的 id 会发生报错的现象,原因是因已经超出1500 万的范围。这种分片规则还有 defaultNode 属性可以配置。defaultNode 是默认的节点。即如果插入了一个id不在范围内,走默认节点零,代表走第一个节点。
下面进行测试。在进行操作时,逻辑库逻辑表都已经配置完成。接着重启一下mycat。退出并执行 bin 目录下的 mycat restart 。重启 mycat 之后,接下来重新连接一下 mycat 。输入 123456,连接上 mycat 后,通过 show databases 来检测PARTITION_DB 逻辑库是否存在。再关注一下逻辑库当中有没有 PARTITION_DB 逻辑表。现在 PARTITION_DB 逻辑表存在,但是需要去定义一下表结构。所以接下来要在 mycat 中来执行下图 mysql 语句。
mysql 语句已经执行成功。再来关注底层的 MySQL 数据库当中是否存在这张表。分别输入 use partition_db 和 show tables。底层数据库这张表存在。
接下来插入数据: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);
数据已经插入 tb _log 表结构中,同样可以查询出来。输入 select*from tb_log 发现这几条数据全部落在第一个节点。输入 use partition_db 和 select*from tb_log 查询到 158 上并没有数据。同样 159 上没有数据。那么再插入 inselect into tb_log (id,operateuser,operation)values(5000001,‘Tomcat’4)
;插入进来之后,依然可以查询出来第一个节点当中没有这条记录,第二个节点有这条记录。当插入的组件在 500 万到 1000 万之间是落在第二个节点当中的。
当再插入一条数据, id 在 10000001,再来查询数据发现落到第三个节点。
之前在插入了一个 15000001,是报错的情况,没有找到对应的节点。现在再插入一个 15000001,会发现插入成功。之后查询也是可以查询出来的。关键在于现在的 15000001 没有在最低端查询出来,而是在上面 12345 查询出来的。因为15000001 是存储在第一个分片上。刚才在配置分片规则的时候,配置defaultNode,它叫做默认节点。当插入的值没有找到对应的分片的时候,此时就会使用默认节点。
总之,范围分片会根据在分片规则当中定义的范围,来决定插入的数据归属哪一个分片。