一、简介

字符串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));

【b】配置server.xml

<user name="root"><property name="password">0905</property><property name="schemas">TESTSTRINGHASH</property><!-- 表级 DML 权限设置 --><!--            <privileges check="false"><schema name="TESTDB" dml="0110" ><table name="tb01" dml="0000"></table><table name="tb02" dml="1111"></table></schema></privileges>           -->
</user><user name="user"><property name="password">user</property><property name="schemas">TESTSTRINGHASH</property><property name="readOnly">true</property>
</user>

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

<tableRule name="partition-by-string-hash"><rule><columns>id</columns><algorithm>partition-by-string-hash-function</algorithm></rule>
</tableRule><function name="partition-by-string-hash-function" class="io.mycat.route.function.PartitionByString"><property name="partitionLength">512</property> <!--求模基数  zero-based --><property name="partitionCount">2</property> <!-- 分片数量  --><property name="hashSlice">0:6</property> <!-- hash预算位  -->
</function>

  • 分片数量必须小于等于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配置分片节点、分片表等

<schema name="TESTSTRINGHASH" checkSQLschema="true" sqlMaxLimit="1000"><table name="user" dataNode="dn$1-2" primaryKey="id" rule="partition-by-string-hash" />
</schema><dataNode name="dn1" dataHost="dataHost01" database="stringhash01" />
<dataNode name="dn2" dataHost="dataHost01" database="stringhash02" /><dataHost name="dataHost01" maxCon="1000" minCon="10" balance="0"writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100"><heartbeat>select user()</heartbeat><writeHost host="hostM1" url="192.168.179.131:3306" user="root" password="0905" />
</dataHost>

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

【f】分析

public class PartitionByStringTest {@Testpublic 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,对应数据库stringhash02idVal = "2222222";System.out.println(rule.calculate(idVal));  //1,即dataNode2,对应数据库stringhash02idVal = "3333333";System.out.println(rule.calculate(idVal));  //1,即dataNode2,对应数据库stringhash02idVal = "4444444";System.out.println(rule.calculate(idVal));  //1,即dataNode2,对应数据库stringhash02idVal = "8960000";System.out.println(rule.calculate(idVal));  //0,即dataNode1,对应数据库stringhash01}
}

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

/*** 字符串hash算法:s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1] <br>* 其中s[]为字符串的字符数组,换算成程序的表达式为:<br>* h = 31*h + s.charAt(i); => h = (h << 5) - h + s.charAt(i); <br>** @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分片规则之字符串hash解析算法分片相关推荐

  1. Mycat(三)——几种分片规则 分库 一致性hash的原理及使用

    文章目录 Mycat分片规则 取模 分库 schema.xml 分片枚举 schema.xml 测试 问题: 固定hash分片 优点 范围约定分片 按日期分区 按天分 一致性HASH 解决什么问题? ...

  2. mysql mycat 路由规则_Mycat水平拆分之十种分片规则

    @Test public void testPartition() { // 本例的分区策略:希望将数据水平分成3份,前两份各占25%,第三份占50%.(故本例非均匀分区) // || // |||| ...

  3. xx:xx,xx:xx规则的字符串怎么解析呢

    package com.gaofengTest;import java.util.ArrayList; import java.util.List; import java.util.StringTo ...

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

    mycat分片规则 1.环境准备 : 2.分片规则 2.1 取模分片 2.2 范围分片 2.3 枚举分片 2.4 范围求模算法 2.5 固定分片hash算法 2.6 取模范围算法 2.7 字符串has ...

  5. MySql使用MyCat分库分表(四)分片规则

    视频学习地址:17-尚硅谷-垂直分库_哔哩哔哩_bilibili 笔记参考地址:MySQL 分库分表 | xustudyxu's Blog (frxcat.fun) 分片规则 范围分片 介绍 根据指定 ...

  6. MySQL运维篇之Mycat分片规则

    3.5.3.Mycat分片规则 3.5.3.1.范围分片 根据指定的字段及其配置的范围与数据节点的对应情况,来决定该数据属于哪一个分片. 示例: 可以通过修改autopartition-long.tx ...

  7. 【MySQL | 运维篇】06、MySQL 分库分表之 MyCat 分片规则

    目录 一.范围分片 1. 介绍 2. 配置 schema.xml逻辑表配置: schema.xml数据节点配置: rule.xml分片规则配置: 二.取模分片 1. 介绍 2. 配置 schema.x ...

  8. Mycat分片规则详解

    1.分片枚举 通过在配置文件中配置可能的枚举 id,自己配置分片,本规则适用于特定的场景,比如有些业务需要按照省份或区县来做保存,而全国省份区县固定的,这类业务使用本条规则,配置如下: <tab ...

  9. mycat 分片规则

    传统的分片策略都是基于单表,或者分片基于主键进行分配,或者某些场景下需要多个表依赖于一个分片,或者分片的字段并不是主键. a.  对于传统的数据库分片方式都是基于单个表格,对于表关联这种操作,则很难处 ...

  10. mysql查逻辑表的分片规则_MySQL(19) Mycat分片(分库分表)配置

    一.前言 本文将基于主从复制,读写分离的环境基础上进行一个简单的分片(分库分表)配置 二.Mycat分片配置 mycat分片主要在scheam.xml,rule.xml这2个表中配置 ① scheam ...

最新文章

  1. 胖子哥的大数据之路(10)- 基于Hive构建数据仓库实例
  2. JAVA操作Hadoop
  3. 孤傲授权系统网站源码
  4. [C++] C++标准中定义的实体(entity)/ 声明 / 定义
  5. 手动angular2环境搭建_详解.Net Core + Angular2 环境搭建
  6. nginx ngx_core_module(main event)
  7. python代码读取外部变量_在Python中从外部文件中写入和读取特定的变量
  8. linux centos需要MPEG-4 AAC解码器
  9. java页面左右飘窗_左右飘窗代码研读
  10. MacOS High Sierra(10.13.6)上安装xcode10.2.1
  11. 计算机重启没有用户名,电脑重启之后图标没了怎么办
  12. C语言——函数(上)
  13. vue中的子传父和父传子
  14. Sublime Text 3 配置python开发环境遇见的问题
  15. zabbix的psk加密结合zabbix_get取值
  16. 微信群影视机器人登录使用教程
  17. 红米k40刷鸿蒙系统,红米K40开孔仅2.8mm,全球最小或命名为无感孔,到底有多极致...
  18. GOJS入门三-如何设置节点间的连线
  19. 耐克NIKE验厂的两个方面总结
  20. 企业家够疯狂:他选择了挑战微软

热门文章

  1. C/C++[codeup 1926]EXCEL排序
  2. DL-C_1_week_1_1
  3. 翻译:Swift中的Operations和OperationQueues入门
  4. lingo纳什均衡代码_数学建模练习题.
  5. 多数元素 在数组中出险次数大于n/2
  6. 592. 分数加减运算
  7. reactbootstrap php,什么是React-Bootstrap
  8. )类 新建javafx程序时_JavaFX 类 RadioButton用法及代码示例
  9. cadence设计运算放大器_「好设计论文」一种用于高精度DAC的实用型CMOS带隙基准源...
  10. Haar特征与积分图