MyCat分片规则之字符串hash解析算法分片

一、简介

字符串hash解析分片,其实就是根据配置的hash预算位规则,将截取的字符串进行hash计算后,得到的int数值即为datanode index(分片节点索引,从0开始)。

二、字符串hash分片

实现步骤:

【a】创建数据库和表

create database stringhash01;
create table user(id bigint not null primary key,name varchar(20));

create database stringhash02;
create table user(id bigint not null primary key,name varchar(20));

MyCat分片规则之字符串hash解析算法分片_第1张图片

【b】配置server.xml


        0905
        TESTSTRINGHASH

        
        



        user
        TESTSTRINGHASH
        true

MyCat分片规则之字符串hash解析算法分片_第2张图片

【c】rule.xml配置分片规则


        
                id
                partition-by-string-hash-function
        



        512 
        2 
        0:6 

MyCat分片规则之字符串hash解析算法分片_第3张图片

  • 分片数量必须小于等于dataNode数
  • length代表字符串hash求模基数,
  • count分区数,其中length*count=1024
  • hashSlice hash预算位,即根据子字符串中int值 hash运算 0 代表 str.length(), -1 代表 str.length()-1,大于0只代表数字自身
  • 简单理解为substring(start,end),start为0则只表示0
  • 例:值“8960000”,hash预算位0:6 ,取其中896000进行计算

【d】schema.xml配置分片节点、分片表等


        



        select user()
        
 
  

MyCat分片规则之字符串hash解析算法分片_第4张图片

【e】测试插入数据

insert into user(id,name) values(1111111,database());
insert into user(id,name) values(2222222,database());
insert into user(id,name) values(3333333,database());
insert into user(id,name) values(4444444,database());
insert into user(id,name) values(8960000,database());

MyCat分片规则之字符串hash解析算法分片_第5张图片

MyCat分片规则之字符串hash解析算法分片_第6张图片

【f】分析

public class PartitionByStringTest {

   @Test
   public void test() {
      PartitionByString rule = new PartitionByString();
      rule.setPartitionLength("512");
      rule.setPartitionCount("2");
      rule.init();
      rule.setHashSlice("0:6");
      String idVal = "1111111";
      System.out.println(rule.calculate(idVal));  //1,即dataNode2,对应数据库stringhash02

      idVal = "2222222";
      System.out.println(rule.calculate(idVal));  //1,即dataNode2,对应数据库stringhash02

      idVal = "3333333";
      System.out.println(rule.calculate(idVal));  //1,即dataNode2,对应数据库stringhash02

      idVal = "4444444";
      System.out.println(rule.calculate(idVal));  //1,即dataNode2,对应数据库stringhash02

      idVal = "8960000";
      System.out.println(rule.calculate(idVal));  //0,即dataNode1,对应数据库stringhash01

   }
}

MyCat分片规则之字符串hash解析算法分片_第7张图片

【g】MyCat源码中字符串hash算法

/**
 * 字符串hash算法:s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1] 
* 其中s[]为字符串的字符数组,换算成程序的表达式为:
* h = 31*h + s.charAt(i); => h = (h << 5) - h + s.charAt(i);
* * @param start * hash for s.substring(start, end) * @param end * hash for s.substring(start, end) */ public static long hash(String s, int start, int end) { if (start < 0) { start = 0; } if (end > s.length()) { end = s.length(); } long h = 0; for (int i = start; i < end; ++i) { h = (h << 5) - h + s.charAt(i); } return h; }

 

你可能感兴趣的:(MyCat分库分表)