Mycat学习实战-Mycat分片

作者: ygqygq2 分类: 数据库 发布时间: 2017-10-30 10:58

Mycat学习实战-Mycat分片

1. 分片规则配置文件

分片规则配置文件rule.xml位于$MYCAT_HOME/conf目录,它定义了所有拆分表的规则。在使用过程中可以灵活使用不同的分片算法,或者对同一个分片算法使用不同的参数,它让分片过程可配置化,只需要简单的几步就可以让运维人员及数据库管理员轻松将数据拆分到不同的物理库中。该文件包含两个重要的标签,分别是Funcation和tableRule。

1.1 Funcation标签

  • name属性指定算法的名称,在该文件中唯一。
  • class属性对应具体的分片算法,需要指定算法的具体类。
  • property属性根据算法的要求指定。

1.2 tableRule标签

  • name属性指定分片规则的名称,在该文件中唯一。
  • rule属性指定分片算法的具体内容,包含columnsalgorithm两个属性。
  • columns属性指定对应的表中用于分片的列名。
  • algorithm属性对应function中指定的算法的名称。

2. 连续分片和离散分片

分片优缺点

分片 连续分片 离散分片
优点 扩容无需迁移数据
范围条件查询消耗资源少
并发访问能力增强
范围条件查询性能提升
缺点 存在数据热点的可能性
并发访问能力受限于单一或少量DataNode
数据扩容比较困难,涉及到数据迁移问题
数据库连接消耗比较多

特殊分片

2.1 连续分片

连续分片规则
* 自定义数字范围分片
* 按日期(天)分片
* 按单月小时分片
* 自然月分片

2.1.1 自定义数字范围分片

适用于明确知道分片字段的某个范围属于哪个分片,其字段为数字类型。

vim conf/schema.xml

vim conf/rule.xml

配置说明:
* columns指定分片的表列名。
* algorithm指定分片函数与function对应。
* rang-long函数中的mapFile代表规则配置文件的路径,可在$MYCAT_HOME/conf下新建目录作好规范,比如将autopartition-long.txt放在$MYCAT_HOME/conf/func中,则用<property name="mapFile">func/autopartition-long.txt</property>来引用。
* defaultNode为超过范围后的默认节点。

vim conf/autopartition-long.txt

测试sql:

测试结果:

注意
schema里的table的dataNode节点个数必须 大于等于 autopartition-long.txt里的配置个数
dataNode节点从0开始

2.1.2 按日期(天)分片

根据时间类型字段,按天分片。

vim conf/schema.xml

vim conf/rule.xml

配置说明:
* columns标识将要分片的表字段。
* algorithm为分片函数。
* dateFormat为日期格式。
* sBeginDate为开始日期。
* sEndDate为结束日期,如果配置了这个属性,则代表数据达到了这个日期的分片后会重复从开始分片插入。
* sPartionDay为分区天数,默认从开始日期算起,每隔10天一个分区。

测试SQL:

测试结果:

注意
以上测试结果中有个错误,因为配置的dataNode节点数为3,而2017-10-31为2017-10-01后的第四个10天中的第一天,因此需要至少4个dataNode,节点不够就报如上错误了。

2.1.3 按单月小时分片

单月内按照小时拆分,最小粒度是小时,一天最多可以有24个分片,最少1个分片,下个月从头开始循环,每个月末需要手工清理数据。

字段为字符串类型,yyyymmddHH 10位。

vim conf/schema.xml

vim conf/rule.xml

配置说明:
* columns标识将要分片的表字段,字符串类型(yyyymmddHH),格式需要符合Java标准。
* algorithm为分片函数。
* splitOneDay为一天切分的分片数。

测试SQL:

测试结果:

注意
* 分片数必须跟dataNode节点数一致
* 最大分24个分片
* 分片字段的值必须是字符串,如:2017103112.(即为2017年10月31日12点)

2.1.4 按自然月分片

使用场景为按月份列分区,每个自然月一个分片,查询条件时使用between and。
字段为时间类型。

vim conf/schema.xml

vim conf/rule.xml

配置说明:
* columns标识将要分片的表字段,字符串类型,与dateFormat格式一致。
* algorithm为分片函数。
* dateFormat为日期字符串格式。
* sBeginDate为开始日期。
* sEndDate为结束日期

测试SQL:

测试结果:

注意
* schema里的table的dataNode节点数必须:大于rule的开始时间按照分片数计算到现在的个数
* 按照自然月计算(无论是28、30、31天都是一个月的)
* 分片节点个数可以后增加,但是必须符合第一点说明。

2.2 离散分片

离散分片规则
* 枚举分片
* 程序指定分区的分片
* 十进制求模分片
* 字符串hash解析分片
* 一致性哈希分片

2.2.1 枚举分片

通过在配置文件中配置可能的枚举id,指定数据分布到不同的物理节点上,本规则适用于按照省份或区县来拆分数据类业务。

vim conf/schema.xml

vim conf/rule.xml

配置说明:
* columns标识将要分片的表字段,字符串类型,与dateFormat格式一致。
* algorithm为分片函数。
* dateFormat为日期字符串格式。
* sBeginDate为开始日期。
* sEndDate为结束日期

vim conf/partition-hash-int.txt

测试SQL:

测试结果:

注意
* schema里的table的dataNode节点个数必须:大于等于 partition-hash-int.txt里的配置个数

2.2.2 程序指定分区分片

在程序运行阶段,由程序自主决定路由到哪个分片。

vim conf/schema.xml

vim conf/rule.xml

配置说明:
* columns标识将要分片的表字段。
* algorithm为分片函数。
* startIndex为字符串开始截取位,从0开始。
* size为截取的位数。
* partitionCount为分片个数
* defaultPartition为默认节点

测试SQL:

测试结果:

注意
* 直接根据字符子串(必须是数字)计算分区号(由应用传递参数,指定分区号)。
例如user_id=05-10000,其中user_id是从startIndex=0开始的,截取长度为两位数字,即05,05就是获取的分区,默认分配到defaultPartition

2.2.3 十进制求模分片

对分片字段十进制取模运算,其数据分布最均匀。

vim conf/schema.xml

vim conf/rule.xml

配置说明:
* columns标识将要分片的表字段。
* algorithm为分片函数。
* startIndex为字符串开始截取位,从0开始。
* size为截取的位数。
* partitionCount为分片个数
* defaultPartition为默认节点

测试SQL:

测试结果:

注意
* 对分片字段十进制取模运算,dataNode=id%count
* 数据分布最均匀。
* 扩容需要重新计算分片,数据迁移繁琐。
* 尽量的提前计算出来增量,创建足够多的分片数。但是也不宜太多,给运维造成负担。平衡点自己掌控。

2.2.4 字符串hash解析分片

此规则是截取字符串中的int数值的hash分片。

vim conf/schema.xml

vim conf/rule.xml

配置说明:
* columns标识将要分片的表字段。
* algorithm为分片函数。
* partitionLength为字符串hash的求模基数。
* partitionCount为分区数。其中partitionLength*partitionCount=1024
* hashSlice为预算位,即根据子字符串中的int值进行hash运算。
0 代表 str.length(), -1 代表 str.length()-1,大于0只代表数字自身
可以理解为substring(start,end),start为0则只表示0
例1:值“45abc”,hash预算位0:2 ,取其中45进行计算
例2:值“aaaabbb2345”,hash预算位-4:0 ,取其中2345进行计算

测试SQL:

测试结果:

注意
* 分片数量必须小于等于dataNode数

2.2.5 一致性hash分片

一致性hash算法有效解决了分布式数据的扩容问题。因为此规则优点在于扩容时迁移数据量比较少,前提是分片节点比较多,虚拟节点分配多些。虚拟节点分配的少就会造成数据分布不够均匀。但如果实际分片数据比较少,迁移量也会比较多。

vim conf/schema.xml

vim conf/rule.xml

测试SQL:

测试结果:

注意
* 分片数量必须小于等于dataNode数

3. 综合类分片规则

  • 范围求模分片
  • 日期范围hash分片
  • 取模范围约束分片
  • ASCII码求模范围约束(字符串)
  • 固定分片hash(二进制)

3.1 范围求模分片

该算法先进行范围分片,计算出分片组,组内再求模,综合了范围分片和求模分片的优点。分片组内使用求模可以保证组内的数据分布比较均匀,分片组之间采用范围分片可以兼顾范围分片的特点。事先规定好分片的数量,数据扩容时按分片组扩容,则原有分片组的数据不需要迁移。由于分片组内的数据分布比较均匀,所以分片组内可以避免热点数据问题。

vim conf/schema.xml

vim conf/rule.xml

vim conf/partition-range-mod.txt

配置说明:
* columns标识将要分片的表字段。
* algorithm为分片函数。
* mapFile为指定分片规则的配置文件。
* defaultNode为未包含以上规则的数据存储节点,节点从0开始。

测试SQL:

测试结果:

注意
* 分片数量必须小于等于dataNode数

3.2 日期范围hash分片

其思想与范围求模一致,由于日期取模方法会出现数据热点问题,所以先根据日期分组,再根据时间hash使得短期内数据分布得更均匀。其优点是可以避免扩容时的数据迁移,又可以在一定程度上避免范围分片的热点问题,要求日期格式尽量精确,不然达不到局部均匀的目的。

vim conf/schema.xml

vim conf/rule.xml

配置说明:
* columns标识将要分片的表字段。
* algorithm为分片函数。
* mapFile为指定分片规则的配置文件。
* defaultNode为未包含以上规则的数据存储节点,节点从0开始。

vim conf/partition-range-mod.txt

测试SQL:

测试结果:

注意
* 分片数量必须小于等于dataNode数

3.3 取模范围约束分片

取模运算与范围约束的结合,主要为了后续数据迁移做准备,即可以自主决定取模后数据的节点分布。

vim conf/schema.xml

vim conf/rule.xml

配置说明:
* columns标识将要分片的表字段。
* algorithm为分片函数。
* mapFile为指定分片规则的配置文件。
* defaultNode为未包含以上规则的数据存储节点,节点从0开始。
* patternValue为求模基数。

vim conf/partition-pattern.txt

配置说明:
* 1-32即代表id%256后分布的范围,如果在1-32则分区在0,其他类推。
* 如果id非数字,则会分配在defaultNode默认节点。

测试SQL:

测试结果:

注意
* 分片数量必须小于等于dataNode数

3.4 ASCII码求模范围约束分片(字符串)

此种规则类似于取模范围约束,此规则支持数据符号字母取模。

vim conf/schema.xml

vim conf/rule.xml

配置说明:
* columns标识将要分片的表字段。
* algorithm为分片函数。
* mapFile为指定分片规则的配置文件。
* defaultNode为未包含以上规则的数据存储节点,节点从0开始。
* patternValue为求模基数。

vim conf/partition-pattern.txt

配置说明:
* 1-32即代表id%256后分布的范围,如果在1-32则分区在0,其他类推。
* 如果id非数字,则会分配在defaultNode默认节点。

测试SQL: