我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 信息系统项目管理师 报名、考试、查分时间动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

数据库中间件分片算法之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则代表了执行分片函数的名字。



id
rang-long

分区算法定义

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


auto-sharding-long.txt
...
  • 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.举个简单的例子:

2,3
100,50

根据公式1

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

根据公式2,物理分区为

999对350取模,正好是299。落在250-300这个区间里面。也就是第4个区间。

接下来我们实际来测试一下,我们在rule.xml中设置如下:


    
        id
        func_hash_test
    



    2,3
    100,50

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

5.创建表测试

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

for i in  {1..1000}
do
echo  $i'|name'$[i]'' >>a1.txt 
done

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

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

6.另一个例子

2
1000

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

同时将划分如下的分区:

注意事项

  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。后续将继续分享其他的算法。谢谢支持!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

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

前言夜深人静的时候,打开云音乐,点上一曲攀登,带上真无线蓝牙耳机,瞬间燃到爆,键盘打字如飞倦意全无。分片规则这几天有人问我,dble和MyCat到底有什么不同。其实dble作为MyCAT的同门,吸收了MyCat的精华,同时也相应的做了一些减法。只支持MySQL
数据库中间件分片算法之hash
2015-11-27

怎么用数据库中间件Mycat+SpringBoot完成分库分表

这篇文章主要讲解了“怎么用数据库中间件Mycat+SpringBoot完成分库分表”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用数据库中间件Mycat+SpringBoot完成分库分表
2023-06-16

(四面)阿里中间件:底层+算法+微服务+数据库+架构!面经分享

每个人都拥有大厂梦,我也不例外,在小公司待久了,感觉人会荒废掉,太轻松,没有压迫感。在众多大厂中,最终选择了阿里。“年轻、活力、富有激情”是我听到得最多对它的形容词,所以毅然决然,希望自己能够在这个舞台上展示出自己。以下分享这次面试阿里中间件和蚂蚁的面试题,另
(四面)阿里中间件:底层+算法+微服务+数据库+架构!面经分享
2016-06-21

Java数据库读写分离中的数据库中间件DBProxy是怎样的

Java数据库读写分离中的数据库中间件DBProxy是怎样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。前言碎语好久没更博了,今天引用美团技术团队的一篇文章来
2023-06-17

SpringBoot2如何整合Sharding-Jdbc中间件实现数据分库分表

小编给大家分享一下SpringBoot2如何整合Sharding-Jdbc中间件实现数据分库分表,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、水平分割1、水平分库1)、概念:以字段为依据,按照一定策略,将一个库中的数据
2023-06-02

C语言数据结构之算法的时间复杂度实例分析

这篇文章主要讲解了“C语言数据结构之算法的时间复杂度实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言数据结构之算法的时间复杂度实例分析”吧!1、算法的复杂度算法在编写成可执行程序
2023-06-30

ShardingSphere x Seata,一致性更强的分布式数据库中间件

日前,分布式数据库中间件 ShardingSphere 将 Seata 分布式事务能力进行整合,旨在打造一致性更强的分布式数据库中间件。背景数据库领域,分布式事务的实现主要包含:两阶段的 XA 和 BASE 柔性事务。XA 事务底层,依赖于
2023-06-05

DDM实践系列丨分布式数据库中间件使用经验分享

最近公司新项目使用了华为云的DDM分布式数据库中间件服务,通过一段的时间的使用感觉还不错。近段时间发现有许多小伙伴也准备去使用这个服务,所以为大家分享一下使用创建DDM服务的经验,帮助小伙伴们少走弯路。首先在使用创建DDM实例的时候小伙伴们会遇到的第一个问题应

	DDM实践系列丨分布式数据库中间件使用经验分享
2021-05-23

编程热搜

目录