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

前言

最近挺焦虑的,不知道将来该作什么,方向又是什么。只能用别慌,月亮也正在大海的某处迷茫。来安慰下本身。不过学习的初心我们仍是不要忘记。今天咱们学习的是enum分片算法。node

1.hash分区算法
2.stringhash分区算法
3.enum分区算法
4.numberrange分区算法
5.patternrange分区算法
6.date分区算法
7.jumpstringhash算法mysql

enum分区算法的配置

<tableRule name="rule_enum">
        <rule>
            <columns>code</columns>
            <algorithm>func_enum</algorithm>
        </rule>
    </tableRule>

<function name="enum" class="enum">
<property name="mapFile">partition.txt</property>
<property name="defaultNode">0</property>
<property name="type">0</property>
</function>

enum和以前的hash算法同样。须要在rule.xml中配置tableRule和function。算法

  • tableRule标签,name对应的是规则的名字,而rule标签中的columns则对应的分片字段,这个字段必须和表中的字段一致。algorithm则表明了执行分片函数的名字。
  • function标签,name表明分片算法的名字,算法的名字要和上面的tableRule中的<algorithm>标签相对应。class:指定分片算法实现类。property指定了对应分片算法的参数。不一样的算法参数不一样。
  • mapFile:指定配置文件名。其格式将在下面作详细说明。
  • defaultNode:指定默认节点号。默认值为-1,不指定默认节点。
  • type:指定配置文件中key的类型。0:整型; 其它:字符串。

mapfile文件格式配置以下:
a.type=0,
int1=node0
int2=node1sql

a.type=其余 string1=node0 string2=node1函数

1.启动加载配置

当启动的时候,会先根据type的值判断是字符串仍是数字。而后把mapfile中配置的值加载到内存中,造成一个映射表。 例如上面的配置中type=0,就能够判断是数字,而后查看mapFile对应的文件partition.txt,能够查到:
10000=0
10010=1
也就是枚举值10000,就存放在分片1上,而枚举值10010,就存放在分片2上。学习

2.运行过程

当在运行的过程当中,若是有用户经过查询code=10000或者是code=10001的时候,就会访问这个枚举算法。根据上面的映射表直接查询获得分片的编号。测试

3.咱们建表来测试一下。

经过建立test_enum表,咱们插入三条数据,分别是code=10000,10010,10020,能够看到10000被存放在分片1上,10010被存放在分片2上。这个和咱们在partition.txt中配置的文件同样。当咱们插入10020的时候,由于枚举值不存在,它会选择默认的分片节点dn1。这里不会由于错误而报错。
枚举在使用的时候,须要把已知的所有罗列出来。可是也有劣势,就是可能罗列不全,在这个时候把不在枚举定义范围的数字存放到默认节点是一个没有办法的办法,若是忽然由于某个新版本上线,出现一些新的枚举类型而没有及时更新,会致使默认节点数据快速膨胀。此时就须要进行扩容,而后实现局部数据迁移。code

注意事项

  1. mapfile文件不包含“=”的行将被跳过.
  2. 重复的枚举值的分区数据节点以最后一个配置为准。
  3. 分片字段为该枚举类型。
  4. 分片字段为NULL时,数据落在defaultNode节点上,若此时defaultNode没有配置,则会报错;当真实存在于mysql的字段值为not null的时候,报错 "Sharding column can't be null when the table in MySQL column is not null"

后记

今天介绍的枚举算法较为简单。后续将继续带来剩下几种算法,谢谢支持!xml

相关文章
相关标签/搜索