前言

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

1.hash分区算法

2.stringhash分区算法

3.enum分区算法

4.numberrange分区算法

5.patternrange分区算法

6.date分区算法

7.jumpstringhash算法

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中的标签相对应。class:指定分片算法实现类。property指定了对应分片算法的参数。不同的算法参数不同。
  • mapFile:指定配置文件名。其格式将在下面做详细说明。
  • defaultNode:指定默认节点号。默认值为-1,不指定默认节点。
  • type:指定配置文件中key的类型。0:整型; 其它:字符串。

mapfile文件格式配置如下:

a.type=0,

int1=node0

int2=node1

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。这里不会因为错误而报错。

枚举在使用的时候,需要把已知的全部罗列出来。但是也有劣势,就是可能罗列不全,在这个时候把不在枚举定义范围的数字存放到默认节点是一个没有办法的办法,如果突然因为某个新版本上线,出现一些新的枚举类型而没有及时更新,会导致默认节点数据快速膨胀。此时就需要进行扩容,然后实现局部数据迁移。

注意事项

  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"

后记

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

数据库中间件分片算法之enum的更多相关文章

  1. 数据库中间件分片算法之stringhash

    前言 又是一个夜黑风高的晚上,带上无线耳机听一曲.突然很感慨一句话:生活就像心电图,一帆风顺就证明你挂了. 就如同我们干运维的,觉得很简单的事情,有时候能干出无限可能.还是言归正传吧,这一次我们来说说 ...

  2. 开源数据库中间件-MyCat

    开源数据库中间件-MyCat产生的背景 如今随着互联网的发展,数据的量级也是成指数的增长,从GB到TB到PB.对数据的各种操作也是愈加的困难,传统的关系型数据库已经无法满足快速查询与插入数据的需求.这 ...

  3. 数据库中间件MyCat学习总结(1)——MyCat入门简介

    为什么需要MyCat? 虽然云计算时代,传统数据库存在着先天性的弊端,但是NoSQL数据库又无法将其替代.如果传统数据易于扩展,可切分,就可以避免单机(单库)的性能缺陷. MyCat的目标就是:低成本 ...

  4. 对话DDM:分布式数据库中间件全解析

    进入云计算时代,传统的数据库在性能和容量等方面已无法满足企业的要求,随着数据量的不断骤增,易于扩展.拆分的数据库解决方案对于企业的云化转型更是显得尤为重要.为使企业应用上云更简单,分布式数据库中间件D ...

  5. 数据库中间件DBLE学习(二) 学习配置schema.xml

    前言 一边有一个经常引诱我让我"娱乐至死"的视频,还有一个不停"鞭策"我让我快点学习的大BOSS.正是有这两种极端的爱才让我常常在自信中明白自己努力的方向.嗯, ...

  6. 数据库中间件DBLE学习(一) 基础介绍和快速搭建

    dble基本架构简介 dble是上海爱可生信息技术股份有限公司基于mysql的高可用扩展性的分布式中间件.江湖人送外号MyCat Plus.开源地址 我们首先来看架构图,外部应用通过NIO/AIO进行 ...

  7. Apache ShardingSphere:由开源驱动的分布式数据库中间件生态

    2021 年 7 月 21 日 2021 亚马逊云科技中国峰会现场,SphereEx 联合创始人.Apache ShardingSphere PMC 潘娟受邀参与此次峰会,以<Apache Sh ...

  8. 数据库中间件ShardingSphere-Proxy(一)

    1.现实中的问题 我们知道数据库的数据,基本80%的业务是查询,20%的业务涵盖了增删改,经过长期的业务变更和积累数据库的数据到达了一定的数量之后,直接影响的是用户与系统的交互,查询时的速度,插入数据 ...

  9. MyCat:取代Cobar数据库中间件

    什么是MyCAT?简单的说,MyCAT就是: 一个彻底开源的,面向企业应用开发的“大数据库集群” 支持事务.ACID.可以替代Mysql的加强版数据库 ? 一个可以视为“Mysql”集群的企业级数据库 ...

随机推荐

  1. echarts细节的修改(2):矩形数图,柱状图,折线图,雷达图等

    1.矩形数图的配置,是直接拿饼图的配置 然后将type换成treemap. 修改类型 option.series.type = 'treemap'; 关闭面包屑导航 option.series.bre ...

  2. SuperSocket获取所有连接上的 Session

    你也可以从 AppServer 实例获取所有连接上的 session 然后推送数据到所有客户端: foreach(var session in appServer.GetAllSessions()) ...

  3. clone() 方法

    <html> <head> <script type="text/javascript" src="/jquery/jquery.js&qu ...

  4. -Bash: Unzip: Command Not Found解决方法 安装unzip

    利用unzip命令解压缩的时候,出现-bash: unzip: command not found的错误. unzip——命令没有找到,其原因肯定是没有安装unzip.利用一句命令就可以解决了. 命令 ...

  5. Appium + python 自动化测试环境配置

    -------------------------------------------------------------- 1. jdk-8u121-window(32位的就下载32位的,64位的就 ...

  6. Flex AIR应用的启动闪屏(必须)

    说明: 一款移动应用,它必须具有启动屏幕,这点可以从我们常见的手机应用观察知道(如,你启动一个QQ,开始大约10秒钟会停留在一个界面上,之后才跳转到登陆或者是主界面). 在air移动应用中,如果不添加 ...

  7. java 两种进程创建方式比较

    A extends Thread: 简单 不能再继承其他类了(Java单继承) 同份资源不共享 A implements Runnable:(推荐) 多个线程共享一个目标资源,适合多线程处理同一份资源 ...

  8. centos linux mysql 10060远程错误代码

    Navicat for MySQL远程连接数据错误代码10060 1.登陆远程linux服务器命令界面 vim /etc/sysconfig/iptables  进入防火墙配置修改 增加以下两条防火墙 ...

  9. Python--day60--jinjia2模块

  10. 【u228】圣诞树

    [问题描述] 圣诞特别礼物挂在一棵圣诞树上,这棵树有n层,每层有一件礼物,每件礼物都有一个价值,有的礼物还有一些连结线,与下层的礼物相连,领取礼物的规则如下:任选一件礼物,它的下面如果有连结线,则可以 ...