前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >数据库中间件分片算法之patternrange

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

原创
作者头像
BuddyYuan
修改2020-01-07 09:54:23
1.3K0
修改2020-01-07 09:54:23
举报
文章被收录于专栏:数据库中间件
前言

加油,奥利给!。这是励志网红冬泳怪鸽的口头禅。这位怪蜀黍喜欢冬泳,照顾一个智力障碍的弟弟。但是他并没有烦恼,而是坚持在凌晨4点起来做直播。这位正能量大叔面对生活的艰辛和困苦,没有被打败,给我们传递了正能量。我们现在只是吃点学习的苦算不了什么。今天我们继续来介绍patternrange分区算法。

1.hash分区算法

2.stringhash分区算法

3.enum分区算法

4.numberrange分区算法

5.patternrange分区算法

6.date分区算法

7.jumpstringhash算法

patternrange分区算法的配置
代码语言:txt
复制
<tableRule name="rule_pattern">
    <rule>
        <columns>id</columns>
        <algorithm>func_pattern</algorithm>
    </rule>
</tableRule>

<!-- pattern partition -->
<!--mapFile must contains all value of 0~patternValue-1,key and value must be Continuous increase-->
<function name="func_pattern" class="PatternRange">
    <property name="mapFile">partition-pattern.txt</property>
    <property name="patternValue">1024</property>
    <property name="defaultNode">0</property><!--contains string which is not number,router to default node-->
</function>

和之前的算法一样。需要在rule.xml中配置tableRule和function。

  • tableRule标签,name对应的是规则的名字,而rule标签中的columns则对应的分片字段,这个字段必须和表中的字段一致。algorithm则代表了执行分片函数的名字。
  • function标签,name代表分片算法的名字,算法的名字要和上面的tableRule中的<algorithm>标签相对应。class:指定分片算法实现类。此处需要填写为“patternrange”或者“com.actiontech.dble.route.function.PartitionByPattern"的分区规则,property指定了对应分片算法的参数。不同的算法参数不同。
  • mapFile:指定配置文件名。其格式将在下面做详细说明。
  • patternValue:指定模值, 默认为1024。
  • defaultNode:指定默认节点号。默认值为-1,不指定默认节点。

配置文件格式如下:

start1-end1=node1

start1-end2=node2

这个算法定义的是区间,比如start1-end1就是第一个区间,该区间的数据就落到node1分片里面。而start2-end2是第二个区间,这个区间的数据就落到node2分片里面。

注意事项:这里有个注意的地方,上面配置文件已经写到了mapFile must contains all value of 0~patternValue-1。就是mapFile文件的这个区间里面必须包含0-patternValue-1。假设你的patternValue=1024,那么文件里面区间就必须设置0-1023范围,如果不设置就会报错ERROR 1064 (HY000): can't find any valid data node :test_patternvalue -> ID -> 1023

1.启动加载配置

当启动的时候,会根据rule.xml中定义去读取mapfile。然后将文件中定义的各个范围加载到内存中形成映射表。例如下面的配置:

root@mycat ~# cat partition-pattern.txt

0-255=0

256-511=1

512-1023=2

2.运行过程

如果有用户通过where查询id=2060的时候,就会访问这个patternrange算法。该算法就会把id这个分片字段的值2068拿出来求模,它是对patternValue设置的值取模。

3.根据取模的值,对应映射表,得到物理分片号

通过2060这个值对patternValue取模,得到的值为12,然后根据映射表,12是在区间11-20之间的,因此数据将存放在物理分片dn2上面。

4.我们建表来测试一下
4.1 在rule.xml配置下列内容
代码语言:txt
复制
<tableRule name="rule_pattern">
      <rule>
      <columns>id</columns>
      <algorithm>func_pattern</algorithm>
      </rule>
</tableRule>

<function name="func_pattern" class="patternrange">
        <property name="mapFile">partition-pattern.txt</property>
        <property name="patternValue">1024</property>
        <property name="defaultNode">0</property>
</function>
4.2 修改partition-pattern.txt文件,增加映射区间。
代码语言:txt
复制
[root@mycat ~]# cat partition-pattern.txt
0-255=0
256-511=1
512-1023=2
4.3 修改schema.xml配置下列内容
代码语言:txt
复制
<table name="test_patternvalue" primaryKey="id" rule="rule_pattern" dataNode="dn1,dn2,dn3"/>
4.4 然后使用服务端口登录到dble上执行建表测试语句。

我们插入了三条数据,分别是id=500,3000,-2。他们分别对1024进行求模。前面2个数字很简单,求模运算后得到500和952,然后根据配置的映射表,可以看到分别存放在dn2和dn3分片上面。最后一个是-2,-2取模在java中采用了truncate除法,计算的结果就是-2。而-2这个结果不在映射表中任何一个区间内,但是因为我们配置了defaultNode,因此,它会存放到dn1上。而如果我们不配置defaultNode的话,这里插入就会报错。

分区重合的情况

和上一篇《数据库中间件分片算法之numberrange》一样,当在map-file中配置区间出现重合的情况下,只会根据配置文件中最先定义的区间相对应的分片节点作为选择。

注意事项:
  1. 不包含“=”的行将被跳过。
  2. 如果区间存在重合,在对重合部分的分片字段值进行分片查找时在配置文件中最先定义的区间对应的数据节点为目的节点。
  3. 分片字段的内容必须可以转化为整数。如果不能转化为整数:如果配置了defaultNode, 目的数据节点为defaultNode; 否则, 出错。
  4. 分片字段为NULL时,数据落在defaultNode节点上,若此时defaultNode没有配置,则会报错;当真实存在于mysql的字段值为not null的时候,报错 "Sharding column can't be null when the table in MySQL column is not null"
后记

今天就介绍到这儿,今天的算法和numberrange相似,不同点在于是多了一个取模。而java的取模采用了truncate除法。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • patternrange分区算法的配置
  • 1.启动加载配置
  • 2.运行过程
  • 3.根据取模的值,对应映射表,得到物理分片号
  • 4.我们建表来测试一下
    • 4.1 在rule.xml配置下列内容
      • 4.2 修改partition-pattern.txt文件,增加映射区间。
        • 4.3 修改schema.xml配置下列内容
          • 4.4 然后使用服务端口登录到dble上执行建表测试语句。
          • 分区重合的情况
          • 注意事项:
          • 后记
          相关产品与服务
          云数据库 MySQL
          腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档