分布式数据的拓容问题,配置及应用指定算法解析

优采云 发布时间: 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博客”,链接:,如需转载请注明出处,否则将追究法律责任。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线