数据库中间件分片算法之hash
前言
夜深人静的时候,打开云音乐
,点上一曲攀登
,带上真无线蓝牙耳机,瞬间燃到爆,键盘打字如飞倦意全无。
分片规则
这几天有人问我,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>
-
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
请原谅我作为一个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进行取模。
同时将划分如下的分区:
注意事项
- 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
- $C\_n$和$L\_n$的个数必须相等。
- 分区字段必须为整型字段,如果是其他类型,要求值可转化为数字。
- 当partitionLength为1时,hash分区算法退化为求模算法,M及N均为partitionCount的值。
- NULL作为分片列的值的时候数据的结果恒落在0号节点(第一个节点上),建议最好不要让这种情况出现,强制设置分片键为not null。
后记
今天学习了分片算法Hash。后续将继续分享其他的算法。谢谢支持!
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
查漏补缺:2020年搞定SpringCloud面试(含答案和思维导图)
前言 Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring Cloud并没有重复制造轮子,它只是将各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。 Spring Cloud有以下特点:约定优于配置;适用于各种环境。开发、部署PC Server或各种云环境(例如阿里云、AWS等)均可;隐藏了组件的复杂性,并提供声明式、无xml的配置方式;开箱即用,快速启动;轻量级的组件。Spring Cloud整合的组件大多比较轻量。例如Eureka、Zuul等,都是各自领域轻量级的实现;组件丰富,功能齐全。Spring Cloud 为微服务架构提供了非常完整的支持。例如、配置管理、服务发现、断路器、微服务网关等;选型中立、丰富。例如,Spring...
- 下一篇
达摩院2020十大科技趋势 | 完整白皮书下载来袭!
2020 是如此科幻年份,步入2020 年,仿佛回到久违的未来。科技浪潮新十年开启,蓄势已久的智能革命将迎来颠覆性的技术变局。达摩院今天发布2020 十大科技趋势,希望与你共同那些期待已久或从未料想的变化,并且循着技术演进的曲线,找到我们的来处和去向。 2020 十大科技趋势 抢先知!!! 快讯预览不过瘾,完整白皮书下载 >>立即下载<< 人工智能从感知智能向认知智能演进 计算存储一体化突破AI算力瓶颈 工业互联网的超融合 机器间大规模协作成为可能 模块化降低芯片设计门槛 规模化生产级区块链应用将走入大众 量子计算进入攻坚期 新材料推动半导体器件革新 保护数据隐私的AI技术将加速落地 云成为IT技术创新的中心 趋势一、人工智能从感知智能向认知智能演进 【趋势概要】 人工智能已经在“听、说、看”等感知智能领域已经达到或超越了人类水准,但在需要外部知识、逻辑推理或者领域迁移的认知智能领域还处于初级阶段。认知智能将从认知心理学、脑科学及人类社会历史中汲取灵感,并结合跨领域知识图谱、因果推理、持续学习等技术,建立稳定获取和表达知识的有效机制,让知识能够被机器理解和运用,...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Hadoop3单机部署,实现最简伪集群
- Windows10,CentOS7,CentOS8安装Nodejs环境