开发者学堂课程【全面讲解开源数据库中间件MyCat使用及原理(二):MyCat - 分片 - 分片规则 - 范围求模算法】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/756/detail/13268
MyCat - 分片 - 分片规则 - 范围求模算法
内容介绍:
一、范围求模算法
二、配置求模分片
三、数据表的范围求模分片
一、范围求模算法
1.简介
范围求模分片其实分为两个词,先范围分片,再求模分片。该算法为先进行范围分片,算出分片组,在进行组内求模。他的意思是在这种分片算法中会将所有的分片进行一个分组,假如有四个分片,对于这四个分片来讲,首先会进行一个分组,假如前面两个是一组,后面两个是一组,插入某一条数据时,这条数据究竟往哪存,假如插入一条 ID=100 的数据,进行范围分片,范围分配大家都知道是根据某一个字段值的大小来决定当前字段存储在哪一个节点中,假如第一组存储的是 ID 值小于等于 1000 万的数据,第二组存储的是大于等于 1000 万的数据,这时如果 id 为100 按照范围分片就会分在第一组当中,分在第一组之后,接下来又怎么决定到底是在第一个分片上还是在第一组的第二个分片上,这时涉及到另外一个操作叫做求模,先根据范围算出分片组,然后再求模,由于这个分片组有两个节点,100 模于2 就是 0,就会落在第一个节点上面,落在第一个节点上,数据就会存储在第一个节点上。假如现在用户又插入了一个 ID,ID=101。这条数据在进行插入时先进行范围分片,然后算出分片组,范围分片算出分配组,这个时候计算发现 101 与小于 1 千万,依然在第一个分组中,接下来 101 又要模于 2,模于 2 之后的数据是1,落在第二个节点上。同样在插入一条数据,如果这个插入数据的值 ID=10000001,这条数据首先进行范围分片,算出分片组应该落入第二个组,接下来再进行求模运算,而在进行求模的时候发现模于 2 由于这个分组也是两个节点,模于 2 等于 1,这个时候就会坐落在第二个分片中,这就是范围求模分片。
2.优点
范围求模分片实际上融入了范围分片和求模分片的优点,分片组内使用求模可以保证组内的数据分布比较均匀,分片组之间采用范围分片可以兼顾范围分片的特点。范围求模算法虽然比较灵活,但是也有缺点。
3.缺点
在数据范围时固定值(非递增值)时,存在不方便扩展的情况,例如将 data node group size 从 2 扩展为 4 时,需要进行数据迁移才能完成,如图所示:
如果范围分片是一个自增的,字段是自增的这样是比较简单的,不需要进行数据迁移。假如这时分片的字段不再是 ID 而是 status,是状态字段。假如一个业务系统中 status=1,2,3,4,5,接下来无论插入多少数据,Status 总是这五个值,而在进行分片时是按照 status 进行分片,这时在进行扩容时就需要数据迁移,因为如果不进行数据迁移,原有的这两个节点的数据容易容量满了,为什么要扩容,就是因为这两个服务器的磁盘满了才需要扩容,如果在扩容时不进行数据迁移这两个磁盘永远是满的,接下来再插入数据时,由于路由规格还要继续往下分发这个请求,这两台服务器存储不下,所以在这一块进行操作时如果数据范围是固定值时需要进行数据迁移 128 129 数据要迁移一部分到增加的两个节点中,这是他的缺点。
简单介绍了范围求模分片后,接下来为大家演示范围求模分片在哪一块儿去配置。
二、配置求模分片
1.配置
在 Mycat rule 分片规则的配置文件中有这样一段配置。table rule 指的是分片规则,auto - sharding - rang - mod 是范围求模分片,rang - mod 这里指定了范围求模分片的算法类,mapFile 指的是范围求模分片映射的范围是在哪一个文件当中配置了什么范围应该存储在哪一个节点当中都是在这个配置文件中配置的,defaultNode 指的是默认节点,不满足上面这些求模分片的规则时就会走默认。
<tab1eRule name =" auto - sharding - rang - mod ">
< rule >
< columns > id / columns >
< algorithm > rang - mod </ algorithm >
</ rule
</ tableRule >
< function name =" rang - mod ” class =" io . mycat . route . function . PartitionByRangeMod ">
< property name =" mapFile "> autopartition - range - mod . txt </ property < property name =" defaultNode '>0</ property >
</ function >
2.autopartition - range - mod . txt 配置格式
# r ange start - end , data node group size
0-500M=1
500M1-2000M=2
0 是 start,500M 是 end,M 代表是万,也就是说 0~500 万的数据存储在第一个节点,后面一代表节点分片组数量,也就是说 0~500 万这个分片组节点中只有一个节点,500M 代表五百万 1 代表有五百个 1,也就是说 500 万~2000 万的记录会在第二个分片中,而第二个分片组有两个数据节点,也就是 500万~2000 万 会有两个数据节点存储。
三、数据表的范围求模分片
如何完成数据表的范围求模分片
1.配置
< table name =" tb _ stu ” dat aNode ="dn1,dn2,dn3" rule =" auto - sharding - rang - mod "/
需要配置一个逻辑表,逻辑表都是在 schema 中配置,手机表的表名叫做 tb_stu,他分配的节点 dn1,dn2,dn3,分片规则 auto - sharding - rang - mod ,这个 ruler 引用的是 ruler.mod 当中的分片规则
< tableRule name =" auto - sharding - rang - mod ">
< rule >
< eolumns > id </ eolumns >
Kalgorithm > rang - mod / algorithr </ rule >
</ tableRule >
所以要找到 ruler.这里配置的有一个叫做 auto - sharding - rang - mod ",这块儿根据 ID 分片就可以,分配的算法根据 range mod,Range mod 在向下走,走到这里
< funetion name =" rang - mod "class=" io . mycat . route . function . PartitionByRangeMod ">
Kproperty nam " mapFile " partition - range - mod . txt く/ property
</ function >
rang mod 在这一块关联的分片处理类,partition - long . txt 需要修改这份配置文件
range start - end , data node group size
0-200M=5
200M1-400M=1
400Mi-600M=4
600M1-800M=4
800M1-1000M=6
这些配置文件都不需要,需要替换为
# r ange start - end , data node group size
0-500M=1
500M1-2000M=2
这个配置指的是 0~500 万一个数据节点存储,500 万~2000 万之间有两个数据节点存储,两个数据节点至于怎么存储采用的是求模算法,这样逻辑表分线规则以及分线规则的映射简介都已经配置好。接下来就重新启动 my cat,进行测试。
2.测试
新启动 my cat 要使用一个远程工具,使用 mobxterm, 这个软件和 Poty,xshare是类似的,都是远程连接的软件。157 158 159 已经连接好了,如果要去使用这个软件,要去建立规划可以右键 new station,选择 ssh,然后选择 remote host 远程主机,以及指定连接的用户名。点击 ok 就可以了。这一块儿直接连接 157,将Mysl 连接上,然后切换下数据库。切换过来之后再连接158,连接好再来连接第三个 159 连接方式都是 mysql-u root-p enter password show databases use partition_db,这三台 MySQL 已经连接好了,这里要重启的是 my cat,所以再打开一个会话去连接 my cat
cd/usr/local/mycat/ 重新启动 mycat,启动 mycat 完成之后查看一下它的进程在不在 ps-ef|grep -my cat,
可以看到 my cat 的进程是在的,接下来做的时候就需要连接上 mycat
mysql-h 127.0.0.1-P 8066-u root -p
连接上 my cat 端口号是 8066
mycat 已经连接上,接下来 show databases 里面的数据库已经有了,接下来 use partition_DB,然后 show tables
这张表也已经有了,接下来创建这张表的表结构。
(1)创建表结构
CREATE TABLE tb _ stu (
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 = ut f8mb4;
第一个 ID,第二个 username,第三个 status,刚才指定根据 ID 进行分片,现在来执行一下这条语句。创建完成,在 show tables 查看这张表结构
这张表结构已经有了,继续在这个 mycat 中进行操作。
(2)插入数据
insert into tb _ stu ( id , username , status ) values (1,' Tom ',1);
insert into tb _ stu ( id , username , status ) values (2,' Cat ',2);
insert into tb _ stu ( id , username , status ) values (3,' Rose ',3);
insert into tb _ stu ( id , username , status ) values (4,' Coco ',2);
insert into tb _ stu ( id , username , status ) values (5,' Lily ',1);
先插入这五条数据,在执行 select*from tb_stu
可以看到五条数据也已经有了,这五条数据到底是在哪个节点上存储,先看一下第一个 select*from tb_stu 有,再来看第二个 select*from tb_stu 没有,再来看第三个 select*from tb_stu 没有,接下来假如在这一块儿再插入一条数据,假如这条数据的值是 100,Lily2, insert into tb _ stu ( id , username , status ) values (100,' Lily 2',1); 看一下这条数据在哪存储,还是在第一个节点存储,因为先进行范围分片,小于等于 500 万的都是在第一个节点,接下来再插入大于 500 万的值
insert into tb _ stu ( id , username ,3tatus) values (5000001,"
insert into tb _ stu ( id , username , status ) values (5000002,'
insert into tb _ stu ( id , username , status ) values (5000003," Mini ",1):
插入这三条数据,select*from tb_stu 接下来查看第一个是否有变化,没有变化,紧接着看第二个节点和第三个节点是否有变化。第二个节点 select*from tb_stu
第二个 ID 已经插入进,接下来再来看 5000001 和 5000003
插入在了第二个节点上,假如在这里插入 5000004,查看一下这时会插入到哪个节点中
insert into tb _ stu ( id , username , status ) values (5000003," Mini ",1):
,执行select*from tb_stu
查询
查到了,只要插入数据的 ID 值大于 500 万就会在第二个分片组当中,而第二个分片组在刚才配置时有两个节点,到底存储在这两个节点中的哪一个节点是根据求模来判别的。5000002 模于 2 等于 0,就会存储在分片组第一个节点上。5000004 模于 2 也等于 0,所以也存储在第一个节点当中。这就是范围求模算法。总的来讲是先进行范围分片,在进行求模决定这条数据向哪个节点进行存储。