开发者学堂课程【全面讲解开源数据库中间件MyCat使用及原理(二):MyCat - 分片 - 分片规则 - 取模范围算法】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/756/detail/13270
MyCat - 分片 - 分片规则 - 取模范围算法
内容介绍:
一、取模范围算法
二、测试
一、取模范围算法
1.简介
取模范围算法是先进行取模,然后根据取模值所属范围进行分片
2.优点
可以自主决定取模后数据的节点分布,意味着可以手动的去指定基准的数值是多少
3.缺点
data node 划分节点是事先建好的,需要扩展时比较麻烦,也会存在之前提到的数据迁移问题
4.配置
< tableRule name =" sharding - by - pattern " s
< ule >
< columns > id </ columns >
< algorithm > sharding - by - pattern </ algorithn >
</ rule >
</ tableRule >
< function name =' sharding - by - pattern ' class =" io . mycat . route . function . PartitionByPattern ">
sproperty name ="mapFi1e"> partit ion - pattern . txt </ property >
< pr operty name =" defaultNode ">0</ pr operty >
< property name =" patternValue ">96</ property
</ function >
配置一个 tableRule 规则取模范围算法,算法是 sharding - by - pattern,function 是分片的处理类叫做 PartitionByPattern,里面有一个映射文件 partit ion - pattern . txt,defaultNode 默认节点,patternValue 就是刚才说的求模的基数,96 是对应的插入值要除以 96,要模于 96,
而对于 partit ion - pattern . txt 当中的配置如下,
0-32=0
33-64=1
65-96=2
代表的意思是插入的值模于 96 算出来的值如果在 0~32 之间存储在第一个节点上,如果在 33~64 之间存储在第二个节点上,如果在 65~96 之间存储在第三个节点上,插入的 ID 模于 96 算出来的值肯定介于 0~96 之间,如果在 0~32 之间是在第一个节点,33~64 之间,在第二个节点,65~96 在第三个节点。这是取模范围算法含义以及配置
二、测试
以一个案例的形式被大家进行演示,首先要配置一个逻辑表,在 schema 中进行配置,逻辑表的表名叫做 tb _mod _range,sharding - by - pattern 配置一个分片
<table name =' tb _mod _range " dataNode ='dn1,cn2,dn3" rule =" sharding - by - pattern "/>
接下来需要在 ruler.xml 中配置 sharding - by - pattern ,里面没有需要自己进行配置
< tableRule name =" sharding - by - pattern ">
< rule
< columns > id </ columng >
< algorithm > sharding - by - pattern </ algorithm >
</ rule ></ tableRule >
这里面所使用的算法叫做 sharding - by - pattern ,这里面也没有也需要自己进行配置
< function name =' sharding - by - pattern ' class =" io . mycat . route . function . PartitionByPattern ">
sproperty name ="mapFi1e"> partition - pattern . txt </ property >
< property name =" defaultNode ">0</ pr operty >
< property name =" patternValue ">96</ property
</ function >
里面还有一段配置文件叫做 partition - pattern . txt,这份配置文件也没有,需要增加这样一份配置文件,这份配置文件名就叫 partition - pattern . txt,这份文件配置好之后,需要在这份配置文件当中进行配置,配置内容如下
0-32=0
33-64=1
65-96=2
关于分片规则的配置就已经配置好了,第一步是生成一个逻辑表,然后指定分片规则,这个分片规则需要在 ruler.xml 中进行声明,然后指定分片算法 sharding - by - pattern,下面需要指定 sharding - by - pattern 的处理类,这块的配置已经完成,接下来重启 my cat,执行重新操作,重启后再连接 mycat,连接上以后 show databases 接下来执行操作 use PARTITION_DB 再 show databases 这样就能查看到当前数据库所有的表,接下来需要创建这个表对应的表结构
CREATE TABLE tb _ mod _ range (
id int (11) NOT NULL coMMENT ' ID ',
namp varchar (200) DEFAULT NULL coMMENT '名称’
PRIMARY KEY ( id )
) ENGINE = InnoDB DEFAULT CHARSET =utf8mb4;
是一个无效的创建值,找一下原因是名城后面缺少一个逗号,在后面加上一个逗号,再来拷贝,继续执行
CREATE TABLE tb _ mod _ range (
id int (11) NOT NULL coMMENT ' ID ',
namp varchar (200) DEFAULT NULL coMMENT '名称’,
PRIMARY KEY ( id )
) ENGINE = InnoDB DEFAULT CHARSET =utf8mb4;
表结构现在已经创建好了,接下来看一下这个表结构 show tables;
在这里可以看到,现在需要在这个表 mycat 中向表中插入数据,插入以下数据:
insert into tb _ br and ( id , name ) values (1,'Test1'); insert into tb _ br and ( id , name ) values (2,'Test2');
insert into tb _ br and ( id , name ) values (3,"Test3);
ins ert into tb _ br and ( id , name ) values (4,'Test4');
insert into tb _ br and ( id , name ) values (5,'Test5');
插入了 ID 为 12345 这五条数据,
接下来执行select*from tb_mod_range
会发现是空的,因为刚才插入的数据插入到了 brand 的当中,想要插入的是 mod range,所以在这里需要增改一下表名,将 brand 更改为 mod
insert into tb _ mod _ range ( id , name ) values (1,'Test1');
insert into tb _ mod _ range ( id , name ) values (2,'Test2');
insert into tb _ mod_range ( id , name ) values (3,'Test3');
insert into tb _ mod_range ( id , name ) values (4,'Test4');
insert into tb _ mod _ range ( id , name ) values (5,'Test5');
更改完成以后再进行插入,执行,这次插入了五条数据之后再来进行查询select*from tb_mod_range
这五条数据已经查询出来了,我们想知道这五条数据到底落在哪个节点当中,按照刚才的分片规则配置 sharding - by - pattern,而且叫做取模范围算法,在这里任何 ID 会模于 96,模于 96 以后再根据配置文件配置范围进行计算,如果模于 96 之后在 0~32 之间就在第一个节点,33~64 之间,在第二个节点,65~96 之间,处于第三个节点,12345 模于 96 出来的值就是 123456,应该在第一个节点,执行select*from tb_mod_range
可以看到 12345 有在第一个节点,select*from tb_mod_range 第二个节点没有,同样 select*from tb_mod_range 第三个节点当中也是没有的,这是插入 ID 小于 5的,接下来进行一个测试,接下来插入一个 34 的,再插入一个 35 的,再插入一个 36 的
insert into tb _ mod _ range ( id , name ) values (34,'Test34');
insert into tb _ mod _ range ( id , name ) values (35,'Test35');
insert into tb _ mod_range ( id , name ) values (36,'Test36');
插入完以后执行查询
可以看到三条数据已经插入,第一个节点现在没有,存储在第二个节点中,因为根据刚才的规则 33~64 都是在第二个节点,要想使数据存在第三个节点中必须在 ID处作修改,如果 ID 模于 96 是大于 65 的这时就会存储在第三个节点当中比如 66,67,这些都是大于 65 的,都会存储在第三个节点中
insert into tb _ mod_range ( id , name ) values (66,'Test66');
insert into tb _ mod_range ( id , name ) values (67,'Test67');
这就是取模范围算法