美文网首页Java
数据库中间件分片算法之hash

数据库中间件分片算法之hash

作者: Java天天 | 来源:发表于2020-02-27 16:02 被阅读0次


前言

夜深人静的时候,打开云音乐,点上一曲攀登,带上真无线蓝牙耳机,瞬间燃到爆,键盘打字如飞倦意全无。

分片规则

这几天有人问我,dble和MyCat到底有什么不同。其实dble作为MyCAT的同门,吸收了MyCat的精华,同时也相应的做了一些减法。只支持MySQL显得更加的纯粹。所以选择对比学习两者我觉得挺好。

前面我们学习了schema.xml文件的配置,我们能独立的把逻辑库和逻辑表搭建起来,让数据表跟随我们的定义规则(取模)进行分布。今天我们介绍具体的分片算法。dble相对于mycat来说,是做了一些减法的。比如一致hash算法就没有,而是使用了jumpstringhash代替了一致性hash。具体原因可以参考文章dble 沿用 jumpstringhash,移除 Mycat 一致性 hash 原因

hash分区算法

stringhash分区算法

enum分区算法

numberrange分区算法

patternrange分区算法

date分区算法

jumpstringhash算法

HASH分区算法

Hash分区算法是一种比较典型而且常用的算法。要使用HASH分区算法需要在rule.xml中定义两个部分。

分区规则定义

如下所示,使用tableRule标签定义,name对应的是规则的名字,而rule标签中的columns则对应的分片字段,这个字段必须和表中的字段一致。algorithm则代表了执行分片函数的名字。

<tableRule name="auto-sharding-long">

<rule>

<columns>id</columns>

<algorithm>rang-long</algorithm>

</rule>

</tableRule>

分区算法定义

如下所示,使用function标签定义分区算法,name代表算法的名字,算法的名字要和上面的tableRule中的标签相对应。class:指定分区算法实现类。property指定了对应分区算法的参数。不同的算法参数不同。

<function name="rang-long"" class="com.actiontech.dble.route.function.AutoPartitionByLong">

<property name="mapFile">auto-sharding-long.txt</property>

...

</function>

先看一下hash分区的定义。function的中的class属性需要设置为hash或者com.actiontech.dble.route.function.PartitionByLong规则。然后分区算法对应参数是partitionCount和partitionLength。

<function name="hashLong" class="hash">

<property name="partitionCount">C1[,C2, ...Cn]</property>

<property name="partitionLength">L1[,L2, ...Ln]</property>

</function>

partitionCount:指定分区的区间数,具体为 C1 [+C2 + ... + Cn]

partitionLength:指定各区间长度,具体区间划分为 [0, L1), [L1, 2L1), ..., [(C1-1)L1, C1L1), [C1L1, C1L1+L2), [C1L1+L2, C1L1+2L2), ... 其中,每一个区间对应一个数据节点。

测试Hash分区算法

1.在启动的时候,两个数组点乘做运算,得到取模数。

2.两个数组进行叉乘,得出物理分区表。

3.根据where条件的值来落入实际分片

select * from shareding_key = 999;

先根据分片键取出999,按照公式1的计算结果除取摸,然后得到的值落到2计算出来的分片中。

4.举个简单的例子:

<property name="partitionCount">2,3</property>

<property name="partitionLength">100,50</property>

根据公式1:

也就是传进来的值需要对350取模。 根据公式2: 物理分区为

999对350取模,正好是299。落在[250-300]这个区间里面。也就是第4个区间。 接下来我们实际来测试一下,我们在rule.xml中设置如下:

<tableRule name="rule_hash">

    <rule>

        <columns>id</columns>

        <algorithm>func_hash_test</algorithm>

    </rule>

</tableRule>

<function name="func_hash_test" class="Hash">

    <property name="partitionCount">2,3</property>

    <property name="partitionLength">100,50</property>

</function>

我们通过公式2算出有5个分片。所以在schema.xml中设置table属性如下:

<table name="hash_test" primaryKey="id" rule="rule_hash" dataNode="dn1,dn2,dn3,dn4,dn5"/>

5.创建表测试

我们先使用shell创建1000行数据,在创建表,通过load data语法将我们shell产生的文件进行导入。

for i in  {1..1000}

do

echo  $i'|name'$[i]'' >>a1.txt

done

这里可以看到我们查询999这个数据,会自动到dn4这个分片上进行查询。再比如我们查500,500对350取模是150,150是落在第二个分区里面的。

6.另一个例子

<property name="partitionCount">2</property>

<property name="partitionLength">1000</property>

此时C* L=2*1000=2000,将对2000进行取模。 同时将划分如下的分区:

注意事项

M不能大于2880。2880的原因是这样的:2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 18, 20, 24, 30, 32, 36, 40, 45, 48, 60, 64, 72, 80, 90, 96, 120, 144, 160, 180, 192, 240, 288, 320, 360, 480, 576, 720, 960, 1440是2880的约数,这样预分片扩容方便。

N必须要等于schema.xml中使用该分区算法的逻辑表的dataNode属性指定的DataNode数量之和,比如我们上面这个算法是5个分区,但是如果你在逻辑表的dataNode属性中设置分区个数小于5,dataNode="dn1,dn2,dn3,dn4",则dble就会报错。 partition size : 5 > table datanode size : 4 please make sure table datanode size = function partition size

和的个数必须相等。

分区字段必须为整型字段,如果是其他类型,要求值可转化为数字。

当partitionLength为1时,hash分区算法退化为求模算法,M及N均为partitionCount的值。

NULL作为分片列的值的时候数据的结果恒落在0号节点(第一个节点上),建议最好不要让这种情况出现,强制设置分片键为not null。

最后:

上面都是自己整理好的!我就把资料贡献出来给有需要的人!顺便求一波关注,哈哈~各位小伙伴关注我后私信【Java】就可以免费领取哒

作者:Buddyyuan

链接:https://juejin.im/post/5e0a2b16518825495a1e78f6

相关文章

  • 数据库中间件分片算法之hash

    前言 夜深人静的时候,打开云音乐,点上一曲攀登,带上真无线蓝牙耳机,瞬间燃到爆,键盘打字如飞倦意全无。 分片规则 ...

  • 数据库中间件分片算法之hash

    前言 夜深人静的时候,打开云音乐,点上一曲攀登,带上真无线蓝牙耳机,瞬间燃到爆,键盘打字如飞倦意全无。 分片规则 ...

  • MyCat路由规则分析(十)

    一致性hash 一般来说,基于hash算法的分片中,算法内部是把记录分片到一种叫做“bucket”(hash桶)的...

  • patternrange -> PartitionByPa

    与hash算法的最终效果一样,这个算法也是先求模得到逻辑分片号,再根据逻辑分片号直接映射到物理分片的一种散列算法。...

  • 一致性hash算法及java实现

    一致性hash算法是分布式中一个常用且好用的分片算法、或者数据库分库分表算法。现在的互联网服务架构中,为避免单点故...

  • mycat分片(固定分片hash算法)

    实现方式: 该算法类似于十进制的求模运算,但是为二进制的操作,例如,取 id 的二进制低 10 位 与 11111...

  • 数据库中间件分片算法之enum

    前言 最近挺焦虑的,不知道未来该做什么,方向又是什么。只能用别慌,月亮也正在大海的某处迷茫。来安慰下自己。不过学习...

  • 数据库中间件分片算法之stringhash

    前言 又是一个夜黑风高的晚上,带上无线耳机听一曲。突然很感慨一句话:生活就像心电图,一帆风顺就证明你挂了。 就如同...

  • 分布式 | DBLE 分片算法之 hash 分片

    作者:赵红杰DBLE 项目测试负责人,主导分布式中间件的测试,在测试中不断发现产品和自身的 bug。迭代验证,乐在...

  • shardjedis常用操作

    shardjedis采用一致hash算法实现key的分片,通过计算key的hash值将key分布到不同的redis...

网友评论

    本文标题:数据库中间件分片算法之hash

    本文链接:https://www.haomeiwen.com/subject/dfgthhtx.html