分布式数据的拓容问题,配置及应用指定算法解析
优采云 发布时间: 2021-06-17 01:23分布式数据的拓容问题,配置及应用指定算法解析
一、应用指定算法
运行阶段由应用决定路由到哪个段,直接根据字符子串(必须是数字)计算段号,配置如下:
id
sharding-by-substring
0
2
3
0
配置说明:
示例说明:
id=05-100000002,在这个配置中,就是从id中的startIndex=0开始,截取siz=2个数字,即05,05就是得到的分区。如果不通过,则默认分配给defaultPartition。
测试:
配置
数据
二、String 哈希解析算法
截取字符串中指定位置的子字符串,进行哈希算法,计算分片。配置如下:
user_id
sharding-by-stringhash
512
2
0:2
配置说明:
测试:
配置
数据
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());
原则:
三、一致性哈希算法
一致性Hash算法有效解决分布式数据扩展问题,配置如下:
id
murmur
0
3
160
配置说明:
测试:
配置
数据
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());
INSERT INTO tb_order (id,money,content) VALUES(212, 100 , UUID());
INSERT INTO tb_order (id,money,content) VALUES(312, 100 , UUID());
INSERT INTO tb_order (id,money,content) VALUES(412, 100 , UUID());
INSERT INTO tb_order (id,money,content) VALUES(534, 100 , UUID());
INSERT INTO tb_order (id,money,content) VALUES(621, 100 , UUID());
INSERT INTO tb_order (id,money,content) VALUES(754563, 100 , UUID());
INSERT INTO tb_order (id,money,content) VALUES(8123, 100 , UUID());
INSERT INTO tb_order (id,money,content) VALUES(91213, 100 , UUID());
INSERT INTO tb_order (id,money,content) VALUES(23232, 100 , UUID());
INSERT INTO tb_order (id,money,content) VALUES(112321, 100 , UUID());
INSERT INTO tb_order (id,money,content) VALUES(21221, 100 , UUID());
INSERT INTO tb_order (id,money,content) VALUES(112132, 100 , UUID());
INSERT INTO tb_order (id,money,content) VALUES(12132, 100 , UUID());
INSERT INTO tb_order (id,money,content) VALUES(124321, 100 , UUID());
INSERT INTO tb_order (id,money,content) VALUES(212132, 100 , UUID());
四、日期分割算法
按日期拆分
create_time
sharding-by-date
yyyy-MM-dd
2020-01-01
2020-12-31
10
配置说明:
注意:配置了规则的表的dataNode分片数必须与分片规则数相同,例如2020-01-01到2020-12-31,每10天一个分片,一个总共需要 37 个分片。
五、每月小时算法
单月按小时拆分,最小粒度为小时,一天最多可以有24个分片,最小为1个分片。下个月从头开始,每个月底需要手动清理数据。
配置如下:
create_time
sharding-by-hour
24
配置说明:
六、自然月分片算法
使用场景是按照月份列进行分区,每个自然月是一个分片,配置如下:
create_time
sharding-by-month
yyyy-MM-dd
2020-01-01
2020-12-31
配置说明:
七、日期范围哈希算法
这个想法与范围模数碎片相同。首先根据日期通过范围分片得到分片组,然后根据时间hash在短期内更均匀地分布数据;
优点:可以避免扩容时的数据迁移,在一定程度上避免范围碎片化的热点问题
注意:日期格式要求尽量精确,否则达不到局部统一的目的
create_time
range-date-hash
yyyy-MM-dd HH:mm:ss
2020-01-01 00:00:00
6
10
配置说明:
来自“ITPUB博客”,链接:,如需转载请注明出处,否则将追究法律责任。