前言

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

分片规则

这几天有人问我,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>

分区算法定义

如下所示,使用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进行取模。 同时将划分如下的分区:

注意事项

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

最后:

上面都是自己整理好的!我就把资料贡献出来给有需要的人!顺便求一波关注。

学习我们是认真的,拿大厂offer是势在必得的。java(想了解更多点一下哦)

作者:Buddyyuan
链接:https://juejin.im/post/5e0a2b16518825495a1e78f6

hash算法_数据库中间件分片算法之hash相关推荐

  1. java 哈希一致算法_一致哈希算法Java实现

    一致哈希算法(Consistent Hashing Algorithms)是一个分布式系统中常用的算法.传统的Hash算法当槽位(Slot)增减时,面临所有数据重新部署的问题,而一致哈希算法确可以保证 ...

  2. 文本聚类分析算法_常用的聚类分析算法综述

    聚类分析定义 所谓聚类就是按照事物的某些属性,把事物聚集成类,使类间的相似性尽可能小,类内相似性尽可能大.聚类是一个无监督的学习过程,它同分类的根本区别在于分类是需要事先知道所依据的数据特征,而聚类是 ...

  3. 人工智能算法_人工智能的灵魂——算法

    人工智能有三驾马车:数据.算法.算力.本文重点介绍算法相关的知识. 本文将介绍算法在人工智能里的概念,算法的4个特征.6个通用方法.以及在选择算法时需要注意的3个点. 什么是算法? 简单的说,算法就是 ...

  4. kmeans算法_实战 | KMeans 聚类算法

    1. 写在前面 如果想从事数据挖掘或者机器学习的工作,掌握常用的机器学习算法是非常有必要的,常见的机器学习算法: 监督学习算法:逻辑回归,线性回归,决策树,朴素贝叶斯,K近邻,支持向量机,集成算法Ad ...

  5. 麻雀优化算法_多种智能优化算法应用案例分享-附代码

    1.智能优化算法应用:基于灰狼算法的Otsu图像多阈值分割 智能优化算法应用:基于灰狼算法的Otsu图像多阈值分割-附代码_Jack旭的博客-CSDN博客​blog.csdn.net 2.智能优化算法 ...

  6. java中间件是什么意思_数据库中间件漫谈

    1.前言 随着业务的发展,MySQL数据库中的表会越来越多,表中的数据量也会越来越大,相应地,数据操作的开销也会越来越大:另外,无论怎样升级硬件资源,单台服务器的资源(CPU.磁盘.内存.网络IO.事 ...

  7. python的数据库中间件_数据库中间件设计方案

    数据库中间件的主要作用是向应用程序开发人员屏蔽读写分离和分库分表面临的挑战,并隐藏底层实现细节,使得开发人员可以像操作单库单表那样去操作数据.在介绍分库分表的主流设计方案前,我们首先回顾一下在单个库的 ...

  8. 机器学习算法_机器学习之EM算法和概率图模型

    [晓白]今天我准备更新Machine Learning系列文章希望对机器学习复习和准备面试的同学有帮助!之前更新了感知机和SVM,决策树&代码实战,关注我的专栏可以的文章哦!今天继续更新EM算 ...

  9. etc的常见算法_几个常用算法的适应场景及其优缺点(非常好)

    本文主要回顾下几个常用算法的适应场景及其优缺点! 机器学习算法太多了,分类.回归.聚类.推荐.图像识别领域等等,要想找到一个合适算法真的不容易,所以在实际应用中,我们一般都是采用启发式学习方式来实验. ...

最新文章

  1. php中访问控制关键字,PHP 关于访问控制和运算符优先级简介
  2. 关于SAP的“Sort key 排序码”
  3. 做时间序列预测有必要用深度学习吗?梯度提升回归树媲美甚至超越多个DNN模型...
  4. CentOS7 安装 MySQL 和简单优化
  5. shiro java配置,InI 配置 - 跟我学 Apache Shiro_教程_Java开发社区
  6. js距离单位换算_英语中常用的度量衡等单位,与我们用的不一样,这些差异点快收藏...
  7. java.util.concurrent.*下的常见类你了解多少?
  8. 《深入浅出WPF》学习笔记之一
  9. 转载的 matlab破解版下载与安装教程
  10. kali系统的部分查看命令
  11. 故意伤害罪具体会有什么处罚
  12. c纳秒级计时器_C#中的高精度计时方法(纳秒级别计时)
  13. 智慧城市建设主要包括哪些方面
  14. python画网络图 可拖动结点_Python networks画网络图(转)
  15. 从小镇到北大!再到阿里达摩院,「AI萝莉」的“升级打怪”之路...
  16. 如何做一个基于微信校园二手书交易小程序系统毕业设计毕设作品
  17. springboot基于微信小程序的在线考试系统-计算机毕业设计
  18. MAL-Gold NanoparticleAu nanoparticles纳米金颗粒金纳米粒子50nm浓度:0.5mgml
  19. 必读2022年最新西藏水利水电施工安全员模拟试题及答案
  20. linux 命令行检测鼠标事件

热门文章

  1. ajax删除成功后的回调,Ajax成功回调'删除'不触发在Firefox中
  2. oracle+connect+by+level,oracle connect by用法篇
  3. mysql tags_mysql tags table解决方法
  4. win10弹不出密码输入框_电脑互访提示输入网络密码,怎么办?
  5. 从python开始学编程pdf 解压密码_从Python开始学编程PDF高清完整版网盘免费分享...
  6. sed 中如何替换换行符
  7. 大熊猫“认脸”神器!扫一扫,人脸识别认证卖萌大熊猫
  8. python正则表达式在线_python正则表达式
  9. python easygui_极客养成记/Python一点也不难/第四节
  10. httpd开启status模块_Nginx高并发系列之二——Nginx开启ssl模块