mycat分片规则详解+实例演示

PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

2). 插入数据
insert into tb_user (id,username ,status) values(1,‘Tom’,1);
insert into tb_user (id,username ,status) values(2,‘Cat’,2);
insert into tb_user (id,username ,status) values(3,‘Rose’,3);
insert into tb_user (id,username ,status) values(4,‘Coco’,2);
insert into tb_user (id,username ,status) values(5,‘Lily’,1);


mycat:  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/3ec65bfd4c49438d991b7c3de04dba46.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yir5Zui562Jc2h55ZOl5Y-R6IKy,size_17,color_FFFFFF,t_70,g_se,x_16)  
 查看各个节点的分配情况:(这里是根据status的值枚举分片的)  
 192.168.159.33  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/73e1b42230ed488397f74c30e82c5d96.png)  
 192.168.159.34  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/670711caefc0416eaa399bb1288f32af.png)  
 192.168.159.35  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/8867405cf8af4d5dbcdbbbce5338d9a2.png)


### 2.4 范围求模算法


**该算法为先进行范围分片, 计算出分片组 , 再进行组内求模。**


**优点**: 综合了范围分片和求模分片的优点。 分片组内使用求模可以保证组内的数据分布比较均匀, 分片组之间采用范围分片可以兼顾范围分片的特点。


**缺点**: 在数据范围时固定值(非递增值)时,存在不方便扩展的情况,例如将 dataNode Group size 从 2 扩展为 4 时,需要进行数据迁移才能完成 ; 如图所示:  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/3c52566ed7184054aa410f8fd00acf66.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yir5Zui562Jc2h55ZOl5Y-R6IKy,size_20,color_FFFFFF,t_70,g_se,x_16)  
 配置如下:



id rang-mod autopartition-range-mod.txt 0

autopartition-range-mod.txt 配置格式 :



#range start-end , data node group size
0-500M=1
500M1-2000M=2


在上述配置文件中, 等号前面的范围代表一个分片组 , 等号后面的数字代表该分片组所拥有的分片数量;


配置说明:




| 属性 | 描述 |
| --- | --- |
| columns | 标识将要分片的表字段名 |
| algorithm | 指定分片函数与function的对应关系 |
| class | 指定该分片算法对应的类 |
| mapFile | 对应的外部配置文件 |
| defaultNode | 默认节点 ; 未包含以上规则的数据存储在defaultNode节点中, 节点从0开始 |


**测试:**


配置




数据



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=utf8mb4;

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);

insert into tb_stu (id,username ,status) values(5000001,'Roce',1);
insert into tb_stu (id,username ,status) values(5000002,'Jexi',2);
insert into tb_stu (id,username ,status) values(5000003,'Mini',1);

mycat:  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/9ca7e684d49f4bd3a60fea1a21a16721.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yir5Zui562Jc2h55ZOl5Y-R6IKy,size_17,color_FFFFFF,t_70,g_se,x_16)  
 各个节点的数据分配情况:  
 0到500万是第一个分组(192.168.159.33),500万到2000万是第二个分组(192.168.159.34和192.168.159.35),最后再组内求模  
 192.168.159.33  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/203da0cb8d0f4305ae9096cfcfc7863a.png)  
 192.168.159.34  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/76dc4f5392ab4129a8b073a23bc0f3ad.png)  
 192.168.159.35  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/f5be668bc2104c8b90897701b54e9380.png)


### 2.5 固定分片hash算法


**该算法类似于十进制的求模运算,但是为二进制的操作,例如,取 id 的二进制低 10 位 与 1111111111 进行位 & 运算。**


最小值:  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/5d623358bb59437585d6e6474425aee7.png)  
 最大值:  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/38a2d96116014f82a48fe059c6a229c5.png)  
 **优点**: 这种策略比较灵活,可以均匀分配也可以非均匀分配,各节点的分配比例和容量大小由partitionCount和partitionLength两个参数决定


**缺点**:和取模分片类似。


配置如下 :



id func1 2,1 256,512

在示例中配置的分片策略,希望将数据水平分成3份,前两份各占 25%,第三份占 50%。


配置说明:




| 属性 | 描述 |
| --- | --- |
| columns | 标识将要分片的表字段名 |
| algorithm | 指定分片函数与function的对应关系 |
| class | 指定该分片算法对应的类 |
| partitionCount | 分片个数列表 |
| partitionLength | 分片范围列表 |


约束 :


1). 分片长度 : 默认最大2^10 , 为 1024 ;


2). count, length的数组长度必须是一致的 ;


3). 两组数据的对应情况: (partitionCount[0]partitionLength[0])=(partitionCount[1]partitionLength[1])


以上分为三个分区:0-255,256-511,512-1023  
 **测试:**


配置




数据



1). 创建表
CREATE TABLE tb\_brand (
id int(11) NOT NULL COMMENT ‘ID’,
name varchar(200) DEFAULT NULL COMMENT ‘名称’,
firstChar char(1) COMMENT ‘首字母’,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

2). 插入数据
insert into tb_brand (id,name ,firstChar) values(1,‘七匹狼’,‘Q’);
insert into tb_brand (id,name ,firstChar) values(529,‘八匹狼’,‘B’);
insert into tb_brand (id,name ,firstChar) values(1203,‘九匹狼’,‘J’);
insert into tb_brand (id,name ,firstChar) values(1205,‘十匹狼’,‘S’);
insert into tb_brand (id,name ,firstChar) values(1719,‘六匹狼’,‘L’);


mycat:  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/97fe79b0b4694e779f4ae5671ad98d36.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yir5Zui562Jc2h55ZOl5Y-R6IKy,size_17,color_FFFFFF,t_70,g_se,x_16)  
 各个节点存储情况:  
 192.168.159.33  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/2be89a8091864335a003f80970387bac.png)  
 192.168.159.34  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/1bbf323346c2436eb97ffebb0c98d8af.png)  
 192.168.159.35  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/b13a4f590aa04e419bfb53ed7e834f52.png)


### 2.6 取模范围算法


**该算法先进行取模,然后根据取模值所属范围进行分片。**


**优点**:可以自主决定取模后数据的节点分布


**缺点**:dataNode 划分节点是事先建好的,需要扩展时比较麻烦。


配置如下:



id sharding-by-pattern partition-pattern.txt 0 96

partition-pattern.txt 配置如下:



0-32=0
33-64=1
65-96=2


在mapFile配置文件中, 1-32即代表id%96后的分布情况。如果在1-32, 则在分片0上 ; 如果在33-64, 则在分片1上 ; 如果在65-96, 则在分片2上。


配置说明:




| 属性 | 描述 |
| --- | --- |
| columns | 标识将要分片的表字段 |
| algorithm | 指定分片函数与function的对应关系 |
| class | 指定该分片算法对应的类 |
| mapFile | 对应的外部配置文件 |
| defaultNode | 默认节点 ; 如果id不是数字, 无法求模, 将分配在defaultNode上 |
| patternValue | 求模基数 |


**测试:**


配置




数据



1). 创建表
CREATE TABLE tb\_mod\_range (
id int(11) NOT NULL COMMENT ‘ID’,
name varchar(200) DEFAULT NULL COMMENT ‘名称’,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

2). 插入数据
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’);


注意 : 取模范围算法只能针对于数字类型进行取模运算 ; 如果是字符串则无法进行取模分片 ;  
 mycat:  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/d60b77012592443998e48fd3d66a8d3e.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yir5Zui562Jc2h55ZOl5Y-R6IKy,size_16,color_FFFFFF,t_70,g_se,x_16)  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/745d57e897ff430ca0ab62a80ab179fc.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yir5Zui562Jc2h55ZOl5Y-R6IKy,size_14,color_FFFFFF,t_70,g_se,x_16)  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/9d218e33ac194c56881b23c497868b31.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yir5Zui562Jc2h55ZOl5Y-R6IKy,size_8,color_FFFFFF,t_70,g_se,x_16)


查看各个节点存储情况  
 192.168.159.33  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/915cdc293f6844d7b9dd1c085c7367b8.png)  
 192.168.159.34  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/7699fa9a3418490d881095446aa43c24.png)  
 192.168.159.35  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/bbbbb78c861c43f9acfb056aa0039f65.png)


### 2.7 字符串hash求模范围算法


**与取模范围算法类似, 该算法支持数值、符号、字母取模,首先截取长度为 prefixLength 的子串,在对子串中每一个字符的 ASCII 码求和,然后对求和值进行取模运算(sum%patternValue),就可以计算出子串的分片数。**


**优点**:可以自主决定取模后数据的节点分布


**缺点**:dataNode 划分节点是事先建好的,需要扩展时比较麻烦。


配置如下:



id sharding-by-prefixpattern partition-prefixpattern.txt 5 96

partition-prefixpattern.txt 配置如下:



range start-end ,data node index

ASCII

48-57=0-9

64、65-90=@、A-Z

97-122=a-z

first host configuration

0-32=0
33-64=1
65-96=2


配置说明:




| 属性 | 描述 |
| --- | --- |
| columns | 标识将要分片的表字段 |
| algorithm | 指定分片函数与function的对应关系 |
| class | 指定该分片算法对应的类 |
| mapFile | 对应的外部配置文件 |
| prefixLength | 截取的位数; 将该字段获取前prefixLength位所有ASCII码的和, 进行求模sum%patternValue ,获取的值,在通配范围内的即分片数 ; |
| patternValue | 求模基数 |


如 :



字符串 :
gf89f9a

截取字符串的前5位进行ASCII的累加运算 :
g - 103
f - 102
8 - 56
9 - 57
f - 102

sum求和 : 103 + 102 + + 56 + 57 + 102 = 420
求模 : 420 % 96 = 36

附录 ASCII码表 :  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/fb24c9e041ee49ce9b8bd94c1e207461.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yir5Zui562Jc2h55ZOl5Y-R6IKy,size_20,color_FFFFFF,t_70,g_se,x_16)  
 **测试:**


配置




数据



1). 创建表
CREATE TABLE tb\_u (
username varchar(50) NOT NULL COMMENT ‘用户名’,
age int(11) default 0 COMMENT ‘年龄’,
PRIMARY KEY (username)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

2). 插入数据
insert into tb_u (username,age) values(‘Test100001’,18);
insert into tb_u (username,age) values(‘Test200001’,20);
insert into tb_u (username,age) values(‘Test300001’,19);
insert into tb_u (username,age) values(‘Test400001’,25);
insert into tb_u (username,age) values(‘Test500001’,22);


mycat中:  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/e9e0289fac1d411b9ec567e4d0e0bad3.png)  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/03d6ca539a014125bb30fa4078c7ce2d.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yir5Zui562Jc2h55ZOl5Y-R6IKy,size_14,color_FFFFFF,t_70,g_se,x_16)  
 查看各个节点的存储情况:  
 192.168.159.33  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/a2a7e08562b74dedb3579adeaf292985.png)  
 192.168.159.34  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/63fa8db3593145d0a03da765462560e5.png)  
 192.168.159.35  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/9b890a27d28b48cca07aa905e59dd07d.png)


### 2.8 应用指定算法


**由运行阶段由应用自主决定路由到那个分片 , 直接根据字符子串(必须是数字)计算分片号** , 配置如下 :



id sharding-by-substring 0 2 3 0

配置说明:




| 属性 | 描述 |
| --- | --- |
| columns | 标识将要分片的表字段 |
| algorithm | 指定分片函数与function的对应关系 |
| class | 指定该分片算法对应的类 |
| startIndex | 字符子串起始索引 |
| size | 字符长度 |
| partitionCount | 分区(分片)数量 |
| defaultPartition | 默认分片(在分片数量定义时, 字符标示的分片编号不在分片数量内时,使用默认分片) |


示例说明 :


id=05-100000002 , 在此配置中代表根据id中从 startIndex=0,开始,截取siz=2位数字即05,05就是获取的分区,如果没传默认分配到defaultPartition 。


**测试:**


配置




数据



1). 创建表
CREATE TABLE tb\_app (
id varchar(10) NOT NULL COMMENT ‘ID’,
name varchar(200) DEFAULT NULL COMMENT ‘名称’,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

2). 插入数据
insert into tb_app (id,name) values(‘00-00001’,‘Testx00001’);
insert into tb_app (id,name) values(‘01-00001’,‘Test100001’);
insert into tb_app (id,name) values(‘01-00002’,‘Test200001’);
insert into tb_app (id,name) values(‘02-00001’,‘Test300001’);
insert into tb_app (id,name) values(‘02-00002’,‘TesT400001’);


mycat中:  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/9ea3e1c6f9bf483f9f305a2b108ac817.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yir5Zui562Jc2h55ZOl5Y-R6IKy,size_17,color_FFFFFF,t_70,g_se,x_16)  
 各个节点的存储情况:(00开头的在192.168.159.33,01开头的在192.168.159.34,02开头的在192.168.159.35)  
 192.168.159.33  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/d860677a1ecb49b5bd37e0383a599b0b.png)  
 192.168.159.34  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/953f2c2e09cb40c4a3f10327060e4c00.png)  
 192.168.159.35  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/4c9ebfa2d72f41ef925e88adba8dfa69.png)


### 2.9 字符串hash解析算法


**截取字符串中的指定位置的子字符串, 进行hash算法, 算出分片** , 配置如下:



user_id sharding-by-stringhash 512 2 0:2

配置说明:




| 属性 | 描述 |
| --- | --- |
| columns | 标识将要分片的表字段 |
| algorithm | 指定分片函数与function的对应关系 |
| class | 指定该分片算法对应的类 |
| partitionLength | hash求模基数 ; length\*count=1024 (出于性能考虑) |
| partitionCount | 分区数 |
| hashSlice | hash运算位 , 根据子字符串的hash运算 ; 0 代表 str.length() , -1 代表 str.length()-1 , 大于0只代表数字自身 ; 可以理解为substring(start,end),start为0则只表示0 |


**测试:**


配置




数据



1). 创建表
create table tb_strhash(
name varchar(20) primary key,
content varchar(100)
)engine=InnoDB DEFAULT CHARSET=utf8mb4;

2). 插入数据
INSERT INTO tb_strhash (name,content) VALUES(‘T1001’, UUID());
INSERT INTO tb_strhash (name,content) VALUES(‘ROSE’, UUID());
INSERT INTO tb_strhash (name,content) VALUES(‘JERRY’, UUID());
INSERT INTO tb_strhash (name,content) VALUES(‘CRISTINA’, UUID());
INSERT INTO tb_strhash (name,content) VALUES(‘TOMCAT’, UUID());


原理:  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/7df3b61519b34ab9bfc90c307ad190a4.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yir5Zui562Jc2h55ZOl5Y-R6IKy,size_20,color_FFFFFF,t_70,g_se,x_16)  
 mycat:  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/e93a23bd2fca4164b107f61ad0737ed9.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yir5Zui562Jc2h55ZOl5Y-R6IKy,size_14,color_FFFFFF,t_70,g_se,x_16)  
 各个节点分配情况:  
 192.168.159.33  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/d9de5e2f9b3e446fabb4ed2a45e41cc9.png)  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/7254795d057049d5b87a2e74fa97ed72.png)  
 192.168.159.34是空的,因为我们在scheme.xml只制定了dn1,dn2两台数据节点。


### 2.10 一致性hash算法


**一致性Hash算法有效的解决了分布式数据的拓容问题** , 配置如下:



id murmur 0 3 160

配置说明:




| 属性 | 描述 |
| --- | --- |
| columns | 标识将要分片的表字段 |
| algorithm | 指定分片函数与function的对应关系 |
| class | 指定该分片算法对应的类 |
| seed | 创建murmur\_hash对象的种子,默认0 |
| count | 要分片的数据库节点数量,必须指定,否则没法分片 |
| virtualBucketTimes | 一个实际的数据库节点被映射为这么多虚拟节点,默认是160倍,也就是虚拟节点数是物理节点数的160倍;virtualBucketTimes\*count就是虚拟结点数量 ; |
| weightMapFile | 节点的权重,没有指定权重的节点默认是1。以properties文件的格式填写,以从0开始到count-1的整数值也就是节点索引为key,以节点权重值为值。所有权重值必须是正整数,否则以1代替 |
| bucketMapPath | 用于测试时观察各物理节点与虚拟节点的分布情况,如果指定了这个属性,会把虚拟节点的murmur hash值与物理节点的映射按行输出到这个文件,没有默认值,如果不指定,就不会输出任何东西 |


**测试:**


配置




数据



1). 创建表
create table tb_order(
id int(11) primary key,
money int(11),
content varchar(200)
)engine=InnoDB ;

2). 插入数据
INSERT INTO tb_order (id,money,content) VALUES(1, 100 , UUID());

最后

面试题文档来啦,内容很多,485页!

由于笔记的内容太多,没办法全部展示出来,下面只截取部分内容展示。

1111道Java工程师必问面试题

MyBatis 27题 + ZooKeeper 25题 + Dubbo 30题:

Elasticsearch 24 题 +Memcached + Redis 40题:

Spring 26 题+ 微服务 27题+ Linux 45题:

Java面试题合集:

ataNode=“dn1,dn2,dn3” rule=“sharding-by-murmur”/>


数据



1). 创建表
create table tb_order(
id int(11) primary key,
money int(11),
content varchar(200)
)engine=InnoDB ;

2). 插入数据
INSERT INTO tb_order (id,money,content) VALUES(1, 100 , UUID());

最后

面试题文档来啦,内容很多,485页!

由于笔记的内容太多,没办法全部展示出来,下面只截取部分内容展示。

1111道Java工程师必问面试题

[外链图片转存中…(img-FSxiH6LO-1714142273514)]

MyBatis 27题 + ZooKeeper 25题 + Dubbo 30题:

[外链图片转存中…(img-3rDzEfUq-1714142273515)]

Elasticsearch 24 题 +Memcached + Redis 40题:

[外链图片转存中…(img-fTc395wh-1714142273515)]

Spring 26 题+ 微服务 27题+ Linux 45题:

[外链图片转存中…(img-7dElaaUr-1714142273515)]

Java面试题合集:

[外链图片转存中…(img-CBfegbtf-1714142273516)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 16
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值