mycat分片规则

配置:schema文件rule字段,rule文件name字段

(1)分片枚举:sharding-by-intfile

(2)主键范围:auto-sharding-long

(3)一致性hash:sharding-by-murmur

(4)字符串hash解析:sharding-by-stringhash

(5)按日期(天)分片:sharding-by-date

(6)按单月小时拆分:sharding-by-hour

(6)自然月分片:sharding-by-month

--------常见的10种分片方法--------

1、枚举法

<tableRule name="sharding-by-intfile">

<rule>

<columns>user_id</columns>

<algorithm>hash-int</algorithm>

</rule>

</tableRule>

<function name="hash-int" class="io.mycat.route.function.PartitionByFileMap">

<property name="mapFile">partition-hash-int.txt</property>

<property name="type">0</property>

<property name="defaultNode">0</property>

</function>

理解:

切分规则根据文件(partition-hash-int.txt)。此种分片规则理解为枚举分区,会比较适合于取值固定的场合,比如说性别(0,1),省份(固定值)。

优点:

用逗号分隔可以把多个值放在一个分区里面。

缺点:

其他非枚举情况不适合。

枚举分区:sharding-by-intfile

2、范围约定

<tableRule name="auto-sharding-long">

<rule>

<columns>user_id</columns>

<algorithm>rang-long</algorithm>

</rule>

</tableRule>

<function name="rang-long" class="io.mycat.route.function.AutoPartitionByLong">

<property name="mapFile">autopartition-long.txt</property>

</function>

理解:

切分规则根据文件(autopartition-long.txt)。一种范围切分的方式,制定基准列的取值范围,然后把这一范围的所有数据都放到一个DN上面。

优点:

适用于整体数量可知或总数量为固定值的情况。

缺点:

dn划分节点是事先建好的,需要扩展时比较麻烦。

潜在的问题,如果在短时间发生海量的顺序插入操作,而每一个DN(分库)设定的数量比较高(比如说一个DN设定的放1000W条数据),那么在这个时候,会出现某一个DN(分库)IO压力非常高,而其他几个DN(分库)完全没有IO操作,就会出现类似于DB中常见的热块/热盘的现象。

3、求模法

<tableRule name="mod-long">

<rule>

<columns>user_id</columns>

<algorithm>mod-long</algorithm>

</rule>

</tableRule>

<function name="mod-long" class="io.mycat.route.function.PartitionByMod">

<!-- how many data nodes  -->

<property name="count">3</property>

</function>

理解:

切分规则根据配置中输入的数值n。此种分片规则将数据分成n份(通常dn节点也为n),从而将数据均匀的分布于各节点上。

优点:

这种策略可以很好的分散数据库写的压力。比较适合于单点查询的情景。

缺点:

一旦出现了范围查询,就需要MyCAT去合并结果,当数据量偏高的时候,这种跨库查询+合并结果消耗的时间有可能会增加很多,尤其是还出现了order by的时候。

4、固定分片hash算法

<tableRule name="rule1">

<rule>

<columns>user_id</columns>

<algorithm>func1</algorithm>

</rule>

</tableRule>

<function name="func1" class="io.mycat.route.function.PartitionByLong">

<property name="partitionCount">2,1</property>

<property name="partitionLength">256,512</property>

</function>

理解:

切分规则根据配置中输入的数值对。上面columns 标识将要分片的表字段,algorithm 分片函数,partitionCount 分片个数列表,partitionLength 分片范围列表。(均分时比求模法更灵活)

分区长度:默认为最大2^n=1024 ,即最大支持1024分区

约束 :count,length两个数组的长度必须是一致的。

优点:

这种策略比较灵活,可以均匀分配也可以非均匀分配,各节点的分配比例和容量大小由count,length两个参数决定。

缺点:

跟求模法类似。

5、日期列分区法

<tableRule name="sharding-by-date">

<rule>

<columns>create_time</columns>

<algorithm>sharding-by-date</algorithm>

</rule>

</tableRule>

<function name="sharding-by-date" class="io.mycat.route.function..PartitionByDate">

<property name="dateFormat">yyyy-MM-dd</property>

<property name="sBeginDate">2014-01-01</property>

<property name="sPartionDay">10</property>

</function>

理解:

切分规则根据配置中输入的各项值。配置中配置了格式,开始日期,分区天数,即默认从开始日期算起,分隔10天一个分区。

6、通配取模

<tableRule name="sharding-by-pattern">

<rule>

<columns>user_id</columns>

<algorithm>sharding-by-pattern</algorithm>

</rule>

</tableRule>

<function name="sharding-by-pattern" class="io.mycat.route.function.PartitionByPattern">

<property name="patternValue">256</property>

<property name="defaultNode">2</property>

<property name="mapFile">partition-pattern.txt</property>

</function>

理解:

切分规则根据配置中输入的数值以及文件(partition-pattern.txt)。patternValue 即求模基数,defaoultNode 默认节点,如果不配置了默认,则默认是0即第一个结点。配置文件中,1-32 即代表id%256后分布的范围,如果在1-32则在分区1,其他类推,如果id非数字数据,则会分配在defaoultNode 默认节点配置文件中,1-32 即代表id%256后分布的范围,如果在1-32则在分区1,其他类推,如果id非数字数据,则会分配在defaoultNode 默认节点。

优点:

这种策略可以很好的分散数据库写的压力。比较适合于单点查询的情景。

缺点:

一旦出现了范围查询,就需要MyCAT去合并结果,当数据量偏高的时候,这种跨库查询+合并结果消耗的时间有可能会增加很多,尤其是还出现了order by的时候。

7、ASCII求模通配

<tableRule name="sharding-by-prefixpattern">

<rule>

<columns>user_id</columns>

<algorithm>sharding-by-prefixpattern</algorithm>

</rule>

</tableRule>

<function name="sharding-by-pattern" class="io.mycat.route.function.PartitionByPrefixPattern">

<property name="patternValue">256</property>

<property name="prefixLength">5</property>

<property name="mapFile">partition-pattern.txt</property>

</function>

理解:

切分规则根据配置中输入的数值及文件(partition-pattern.txt)。patternValue 即求模基数,prefixLength ASCII 截取的位数。此种方式类似方式6通配取模只不过采取的是将列种获取前prefixLength位列所有ASCII码的和进行求模sum%patternValue ,获取的值,在通配范围内的也就是分片数。

8、编程指定

<tableRule name="sharding-by-substring">

<rule>

<columns>user_id</columns>

<algorithm>sharding-by-substring</algorithm>

</rule>

</tableRule>

<function name="sharding-by-substring" class="io.mycat.route.function.PartitionDirectBySubString">

<property name="startIndex">0</property> <!-- zero-based -->

<property name="size">2</property>

<property name="partitionCount">8</property>

<property name="defaultPartition">0</property>

</function>

理解:

此方法为直接根据字符子串(必须是数字)计算分区号(由应用传递参数,显式指定分区号)。

例如id=05-100000002在此配置中代表根据id中从startIndex=0,开始,截取siz=2位数字即05,05就是获取的分区,如果没传默认分配到defaultPartition。

9、字符串拆分hash解析

<tableRule name="sharding-by-stringhash">

<rule>

<columns>user_id</columns>

<algorithm>sharding-by-stringhash</algorithm>

</rule>

</tableRule>

<function name="sharding-by-substring" class="io.mycat.route.function.PartitionByString">

<property name=length>512</property> <!-- zero-based -->

<property name="count">2</property>

<property name="hashSlice">0:2</property>

</function>

理解:

函数中length代表字符串hash求模基数,count分区数,hashSlice hash预算位

即根据子字符串 hash运算。

10、一致性hash

<tableRule name="sharding-by-murmur">

<rule>

<columns>user_id</columns>

<algorithm>murmur</algorithm>

</rule>

</tableRule>

<function name="murmur" class="io.mycat.route.function.PartitionByMurmurHash">

<property name="seed">0</property><!-- 默认是0-->

<property name="count">2</property><!-- 要分片的数据库节点数量,必须指定,否则没法分片—>

<property name="virtualBucketTimes">160</property><!-- 一个实际的数据库节点被映射为这么多虚拟节点,默认是160倍,也就是虚拟节点数是物理节点数的160倍-->

<!--

<property name="weightMapFile">weightMapFile</property>

节点的权重,没有指定权重的节点默认是1。以properties文件的格式填写,以从0开始到count-1的整数值也就是节点索引为key,以节点权重值为值。所有权重值必须是正整数,否则以1代替 -->

<!--

<property name="bucketMapPath">/etc/mycat/bucketMapPath</property>

用于测试时观察各物理节点与虚拟节点的分布情况,如果指定了这个属性,会把虚拟节点的murmur hash值与物理节点的映射按行输出到这个文件,没有默认值,如果不指定,就不会输出任何东西 -->

</function>

优点:

一致性hash预算有效解决了分布式数据的扩容问题,前1-9中id规则都多少存在数据扩容难题,而10规则解决了数据扩容难点

上述整理的分片规则,部分验证、详细的理解以及优缺点信息还未补全,希望能与大家共同学习探讨填补空缺。

时间: 2024-08-08 13:52:23

mycat分片规则的相关文章

mysql 第二十篇文章~mycat 分片规则的初步讲解

一 简介:今天咱们来聊聊分片规则的初步理解 二 前沿:mycat的分片规则是十分丰富的,此外还可以根据java进行扩展 三 文件:rule.xml 四 具体分片规则: <tableRule name="rule1">  <tableRule name="rule2">  <tableRule name="sharding-by-intfile">  <tableRule name="auto-s

mycat分片规则之分片枚举(sharding-by-intinfile)

刚开始看教程资料的时候,看教程文档感觉模糊,完全没明白分片枚举是个什么样的概念.于是网上搜素别人做的 案例来看,终于让我搜索到一份完整的测试案例,见如下地址:   https://www.cnblogs.com/ivictor/archive/2016/01/25/5155123.html       看完这个案例,恍然大悟教程里说的按照省份区县保存的意思.谢谢网上无偿分享文档的人们. 好了.来开始测试. 在schema.xml里定义一个分片表,如下:         [[email prote

MyCAT常用分片规则之分片枚举

MyCAT支持多种分片规则,下面测试的这种是分片枚举.适用场景,列值的个数是固定的,譬如省份,月份等. 在这里,需定义三个值,规则均是在rule.xml中定义. 1. tableRule 2. function 3. mapFile 首先,定义tableRule, <tableRule name="sharding-by-intfile-test"> <rule> <columns>province</columns> <algor

MyCat 介绍、分片规则、调优的内容收集

一.MyCat的简介 MyCat高可用.负载均衡架构图: 详细知识点:  MySQL分布式集群之MyCAT(一)简介(修正) 二.MyCat的schema.xml讲解 详细知识点:MySQL分布式集群之MyCAT(二)schema详解(修正) 三.MyCat的分片规则 详细知识点:MySQL分布式集群之MyCAT(三)rule的分析 四.MyCat调优 详细知识点:MySQL分布式集群之MyCAT调优初探(四)

mysql+mycat分片环境部署

说明: 1.操作系统:64位CentOS Linux release 7.2.1511 (Core) 2.jdk版本:1.8.0_121 3.mysql版本: 5.7.17 本文假设以上或者类似环境已经配置成功. 准备压缩文件 1.下载网址:http://www.mycat.io/ 选择1.6版本,然后点击进入下载页面,如下图: 选择第一个,适合linux系统的 2.创建/soft目录: [[email protected] soft]# mkdir /soft 利用WinSCP将下载好的tar

mycat分片操作

mycat位于应用与数据库的中间层,可以灵活解耦应用与数据库,后端数据库可以位于不同的主机上.在mycat中将表分为两大类:对于数据量小且不需要做数据切片的表,称之为分片表:对于数据量大到单库性能,容量不足以支撑,数据通常需要通过水平切分均匀分布到不同的数据库中的表,称之为分片表.而中间件最终需要处理的数据是对数据切分,聚合. 在上一片博文中,详细说明了mycat的server.xml, schema.xml, rule.xml配置文件,下面通过具体的实例,来说明分片的用法及类型. 在说明myc

MyCat分片集群

数据库集群会产生的问题: 自增ID问题 数据关联查询问题(水平拆分) 数据同步问题 数据库集群 自动增长id产生重复的话,解决: UUID形式  (没有排序 不是自增) 设置数据库步长 其他方案: redis  或者雪花算法 数据库分库分表的策略: 数据库分表分库策略 数据库分表分库原则遵循 垂直拆分与水平拆分垂直拆分就是根据不同的业务,分为不同的数据库,比如会员数据库.订单数据库.支付数据库等,垂直拆分在大型电商系统中用的非常常见.优点: 拆分后业务清晰,拆分规则明确,系统之间整合或扩展容易.

mycat分片表全局自增主键测试

mycat分片表全局自增主键测试 一.全局序列号介绍 在实现分库分表的情况下,数据库自增主键已无法保证自增主键的全局唯一.为此,MyCat 提供了全局 sequence,并且提供了包含本地配置和数据库配置等多种实现方式. 1.本地文件方式 使用服务器本地磁盘文件的方式 2.数据库方式 使用专用数据库的方式 3.本地时间戳方式 使用时间戳算法方式 4.分布式ZK ID 生成器 基于ZK 与本地配置的分布式ID 生成器(可以通过ZK 获取集群(机房)唯一InstanceID,也可以通过配置文 件配置

mycat 分片

1  配置下面两种ER分片,并结合日志分析子表插入过程中的不同 (1).父表按照主键ID分片,子表的分片字段与主表ID关联,配置为ER分片 (2).父表的分片字段为其他字段,子表的分片字段与主表ID关联,配置为ER分片 答:(1)第一种分片:父表按照主键ID分片 表设计:父表student,子表selectcourse student(id,stu_id); selectcourse(id,stu_id,cou_id); 在schema.xml中增加父表.子表定义: <table name=&quo