Mysql系列六:Mycat分片路由原理、Mycat常用分片规则及对应源码介绍

 一、Mycat分片路由原理

我们先来看下面的一个SQL在Mycat里面是如何执行的:

travelrecord id (,);

有3个分片dn1,dn2,dn3,id=5000001

查询时可能有出现的问题:

dn1  dn2  dn3

2)只扫描某个片。漏掉数据的情况。

那么Mycat是如何解决上面的问题的呢?

Mycat解析的过程主要有Visitor和Statement两个阶段

1)Visitor过程,解析出如下属性:

              哪一张表

              字段列表

              条件信息

              什么样的SQL

通过查询条件可以知道要查询的数据都在哪些分片上

travelrecord id travelrecord id ;(dn3执行)

4)分别在分片dn2,dn3上执行第 3)步改写的SQL,然后把从dn2,dn3上得到的结果进行拼装就是最终的结果了

visitor

确定分片的过程:首先看where

二、Mycat常用分片规则

1. 时间类:按天分片、自然月分片、单月小时分片

2. 哈希类:Hash固定分片、日期范围Hash分片、截取数字Hash求模范围分片、截取数字Hash分片、一致性Hash分片

3. 取模类:取模分片、取模范围分片、范围求模分片

4. 其他类:枚举分片、范围约定分片、应用指定分片、冷热数据分片

下面基于源码来介绍Mycat的常用分片规则,

三、Mycat常用分片规则介绍

分片规则都定义在rule.xml文件里面

id func1 1,1,2,3,1 128,128,128

1. 自动范围分片

在rule.xml里面的配置:

id rang-long

<span style="color: #0000ff"><<span style="color: #800000">function <span style="color: #ff0000">name<span style="color: #0000ff">="rang-long"<span style="color: #ff0000">
class<span style="color: #0000ff">="io.mycat.route.function.AutoPartitionByLong"<span style="color: #0000ff">>
<span style="color: #0000ff"><<span style="color: #800000">property <span style="color: #ff0000">name<span style="color: #0000ff">="mapFile"<span style="color: #0000ff">>autopartition-long.txt<span style="color: #0000ff"></<span style="color: #800000">property<span style="color: #0000ff">>
<span style="color: #0000ff"></<span style="color: #800000">function<span style="color: #0000ff">>

说明:

有3个分片,第1个分片存储的是1-500000的数据,第2个分片存储的是500001-1000000的数据,第3个分片存储的是1000001-1500000的数据

insert into employee(id,name) value(1,Tom);在第1个分片

insert into employee(id,name) value(500002,Jack);在第2个分片

insert into employee(id,name) value(1000002,Lucy);在第3个分片

对应代码:

2. 枚举分片

把数据分类存储

在rule.xml里面的配置:

sharding_id hash-int partition-hash-int.txt 0

说明:0

对应代码:

3. Hash固定分片(固定分片Hash算法)

Hash

在rule.xml里面的配置:

id func1 1,128

说明:

1) partitionCount.length

2) sum((partitionCount[i]*partitionLength[j])) === 1024——>partitionCount[0]*partitionLength[0]+partitionCount[1]*partitionLength[1] === 1024

1*128+1*128+2*128+3*128+1*128 === 1024

eg:

8

1

2

...................

8

id

id%1024 = 128

4. 求模分片

id%

在rule.xml里面的配置:

id mod-long 3

对应代码:

5. 自然月分片

按照自然月的方式进行分片

在rule.xml里面的配置:

create_time partbymonth yyyy-MM-dd 2015-01-01

说明:

sEndDated

3

分片

分片

分片

1

5

9

2

6

10

3

7

11

4

8

12

对应代码:

6. 匹配求模分片

prefixLengthcharAt(i)

在rule.xml里面的配置:

id partitionbyprefixpattern 3 6

有下面这种类型的数据

+

201801 01   10001

columns6

对应代码:

7. 冷热数据分片

根据日期查询日志数据冷热数据分布 ,最近 n 个月的到实时交易库查询,超过 n 个月的按照 m 天分片

在rule.xml里面的配置:

create_time sharding-by-hotdate

<span style="color: #0000ff"><<span style="color: #800000">function <span style="color: #ff0000">name<span style="color: #0000ff">="sharding-by-hotdate"<span style="color: #ff0000"> class<span style="color: #0000ff">="org.opencloudb.route.function.PartitionByHotDate"<span style="color: #0000ff">>
<span style="color: #0000ff"><<span style="color: #800000">property <span style="color: #ff0000">name<span style="color: #0000ff">="dateFormat"<span style="color: #0000ff">>yyyy-MM-dd<span style="color: #0000ff"></<span style="color: #800000">property<span style="color: #0000ff">> <span style="color: #008000">
<span style="color: #0000ff"><<span style="color: #800000">property <span style="color: #ff0000">name<span style="color: #0000ff">="sLastDay"<span style="color: #0000ff">>30<span style="color: #0000ff"></<span style="color: #800000">property<span style="color: #0000ff">> <span style="color: #008000">
<span style="color: #0000ff"><<span style="color: #800000">property <span style="color: #ff0000">name<span style="color: #0000ff">="sPartionDay"<span style="color: #0000ff">>30<span style="color: #0000ff"></<span style="color: #800000">property<span style="color: #0000ff">> <span style="color: #008000">
<span style="color: #0000ff"></<span style="color: #800000">function<span style="color: #0000ff">>

对应代码:

8. 一致性哈希分片

1)首先求出mysql服务器(节点)的哈希值,并将其配置到0~2^32的圆(continuum)上。

2)为每台mysql服务器物理节点虚拟出多个虚拟节点,并计算hash值映射到相同的圆上。

3)然后从数据映射到的mysql服务器虚拟节点的位置开始顺时针查找,将数据保存到找到的第一个mysql服务器上。如果超过232仍然找不到服务器,就会保存到第一台mysql服务器上。

 

特点:解决数据均匀分布

在rule.xml里面的配置:

id murmur 0 2 160 节点的权重,没有指定权重的节点默认是1。以properties文件的格式填写,以从0开始到count-1的整数值也就是节点索引为key,以节点权重值为值。所有权重值必须是正整数,否则以1代替 用于测试时观察各物理节点与虚拟节点的分布情况,如果指定了这个属性,会把虚拟节点的murmur hash值与物理节点的映射按行输出到这个文件,没有默认值,如果不指定,就不会输出任何东西

对应代码:

相关文章

Mycat是什么?MyCat是一个开源的分布式数据库系统,是一个实...
转自:https://www.cnblogs.com/ivictor/p/5111495.html参考...
1.在数据库做好主从同步的情况下搭建mycat。下载mycat,解压...
集群的服务器列表在10.11.0.210和10.11.0.216中部署mycat和h...
Mycat是什么?·一个彻底开源的,面向企业应用开发的大数据库...
<system>配置Mycat系统参数 <system>  <p...