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

数据库中间件分片算法之hash前言 夜深人静的时候,打开 ,点上一曲 ,带上真无线蓝牙耳机,瞬间燃到爆,键盘打字如飞倦意全无。 分片规则 这几天有人问我,dble和MyCat到底有什么不同。其实dble作为MyCAT的同门,吸收了

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

前言

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

分片规则

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

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

  1. hash分区算法
  2. stringhash分区算法
  3. enum分区算法
  4. numberrange分区算法
  5. patternrange分区算法
  6. date分区算法
  7. 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>

代码100分

分区算法定义

如下所示,使用function标签定义分区算法,name代表算法的名字,算法的名字要和上面的tableRule中的

标签相对应。
class:指定分区算法实现类。
property指定了对应分区算法的参数。不同的算法参数不同。

代码100分<function name="rang-long" class="com.actiontech.dble.route.function.AutoPartitionByLong">
<property name="mapFile">auto-sharding-long.txt</property>
...
</function>
  • partitionCount:指定分区的区间数,具体为 C1 +C2 + … + Cn
  • partitionLength:指定各区间长度,具体区间划分为 [0, L1), [L1, 2L1), …, [(C1-1)L1, C1L1), [C1L1, C1L1+L2), [C1L1+L2, C1L1+2L2), … 其中,每一个区间对应一个数据节点。

测试Hash分区算法

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

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

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

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

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

select * from shareding_key = 999;

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

4.举个简单的例子:

代码100分<property name="partitionCount">2,3</property>
<property name="partitionLength">100,50</property>

根据公式1

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

也就是传进来的值需要对350取模。

根据公式2,物理分区为

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

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

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

请原谅我作为一个GEEK,把桌面和终端完美结合成二次元是标配。

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

6.另一个例子

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

此时C _L=2_1000=2000,将对2000进行取模。

同时将划分如下的分区:

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

注意事项

  1. 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的约数,这样预分片扩容方便。
  2. 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
  3. $C_n$和$L_n$的个数必须相等。
  4. 分区字段必须为整型字段,如果是其他类型,要求值可转化为数字。
  5. 当partitionLength为1时,hash分区算法退化为求模算法,M及N均为partitionCount的值。
  6. NULL作为分片列的值的时候数据的结果恒落在0号节点(第一个节点上),建议最好不要让这种情况出现,强制设置分片键为not null。

后记

今天学习了分片算法Hash。后续将继续分享其他的算法。谢谢支持!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/10320.html

(0)
上一篇 2022-12-29 17:30
下一篇 2022-12-29

相关推荐

  • 执行DB devices时提示版本不匹配「建议收藏」

    执行DB devices时提示版本不匹配「建议收藏」
    重新安装了adb和夜神模拟器后,启动夜神模拟器,并在控制台执行adb devices时总是提示错误: List of devices attachedadb…

    2023-04-08
    121
  • 数据库死锁排查及处理方法视频_数据库的死锁会一直等待

    数据库死锁排查及处理方法视频_数据库的死锁会一直等待MySQL查看死锁和解除锁 的两种方法 第一种: 1.查询是否锁表 show OPEN TABLES where In_use > 0; 2.查询进程(如果您有SUPER权限,您可以看到所有线程。否…

    2023-02-25
    127
  • Python编程之解析Python的内涵

    Python编程之解析Python的内涵Python是一门面向对象的编程语言。面向对象编程(OOP)是一种编程范式,它将数据和方法封装在由对象构成的单元中。Python中一切都是对象,包括类和函数都是对象。对象有自己的属性和方法,并能通过对象调用其属性和方法。Python中的类定义方式是使用class关键字:

    2024-02-29
    63
  • kafka消息机制_kafka消息持久化处理

    kafka消息机制_kafka消息持久化处理1、Kafka消息持久性概述 Kakfa依赖文件系统来存储和缓存消息。对于硬盘的传统观念是硬盘总是很慢,基于文件系统的架构能否提供优异的性能?实际上硬盘的快慢完全取决于使用方式。同时 Kafka 基于

    2023-04-14
    145
  • 使用Python读取文件内容

    使用Python读取文件内容Python可以通过多种方式读取文件,最常用的方式为使用with关键字打开文件,然后循环读取文件中的每一行内容。

    2023-12-26
    97
  • 数据库cast函数的用法_sql中numeric

    数据库cast函数的用法_sql中numericCAST函数用于将某种数据类型的表达式显式转换为另一种数据类型。CAST()函数的参数是一个表达式,它包括用AS关键字分隔的源值和目标数据类型。 语法:CAST (expression AS dat…

    2023-01-25
    134
  • Python Canvas:打造灵活交互的图形界面应用

    Python Canvas:打造灵活交互的图形界面应用Python是一种高级编程语言,广泛应用于各种领域,包括数据科学、金融领域、物联网以及Web开发等。这些领域的发展都离不开图形界面的支持。在Python中,可以使用Tkinter、PyQt等框架实现图形界面。本文将介绍如何使用Python中的Canvas组件打造灵活交互的图形界面应用。

    2024-01-15
    86
  • 使用Pycharm多行注释的快捷键

    使用Pycharm多行注释的快捷键Python是一种高级编程语言,其可读性和易于理解占据了开发者心中的一席之地。然而,在Python项目中,正确的注释是一个必不可少的部分。Pycharm是一种被广泛使用的IDE(集成开发环境),它提供了各种不同类型的注释。本文所介绍的是Pycharm多行注释的快捷键。我们将详细介绍如何在Pycharm中使用快捷键来在你的代码中添加多行注释。

    2024-06-22
    23

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注