开发者学堂课程【全面讲解开源数据库中间件MyCat使用及原理(二):MyCat - 分片 - 分片规则 - 日期时间相关分片算法】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/756/detail/13275
MyCat - 分片 - 分片规则 - 日期时间相关分片算法
内容介绍:
一、日期分片算法
二、单月小时算法
三、自然月分片算法
四、日期范围 hash 算法
一、日期分片算法
1、按照日期来分片
日期时间相关的分片算法。首先第一个日期分片算法,日期分片算法顾名思义,就是按照日期来进行分片。分片规则配置,要来指定按照哪一个字段进行分片,然后再指定分片算法。
<tableRu1e name="sharding-by-date">
<rule>
<columns>create time</columns>
<algorithm>sharding-by-date</algorithm>
</rule>
</tableRule>
下面是分片算法的一个处理类 PartitionByDate,主要来看一下里面的四个属性。这里面有四个属性,第一个 dataFormat,指的是日期的格式,接下来是 sBeginDate 和 sEndDate,这两个分别指的是日期的开始时间和日期的结束时间,接下来还有最后一个 sPartionDate,10 指的是多长时间或几天来做一个分片,所以他指的是从 2020 年 1 月 1 号到 2020 年 12 月 31 号,每十天为一个分片。
<function name="sharding-by-date"class="io. mycat. route. function. Partitionbydate">
<property name="dateFormat">yyyy-MM-dd</property>
<property name="sBeginDate">2020-01-01</property>
<property name="sEndDate">2020-12-31</property>
<property name="sPartionDay">10</property>
</function>
这是日期分片算法。
2、配置说明:
属性 描述
columns 标识将要分片的表字段
algorithm 指定分片函数与 function 的对应关系
class 指定该分片算法对应的类
dateFormat 日期格式
sBeginDate 开始日期
sEndDate 结束日期,如果配置了结束日期,则代码数据到达了这个日期的分片后,会重复从开始分片插入
sPartionDay 分区天数,默认值 10,从开始日期算起,每个 10 天一个分区
注意:配置规则的表的 dataNode 的分片,必须和分片规划数量一致,例如 2020-01-01 到 2020-12-31,每 10 天一个分片,一共需要 37 个分片。
二、单月小时算法
单月小时算法指的是在一个月内按照小时拆分,最小的力度是小时,一天最多可以有 24 个分片,最小一个分片。最小一个分片就是,将这行代码(<property name="sPlitOneDay">24</property>
)
中的数字 24 设置为 1,代表的就是 24小时为一个分片。下个月从头开始循环,每个月末需要手动清理数据。
1、分片规则的配置
<tableRule name="sharding-by-hour">
<rule>
<columns>create time</columns>
<algorithm>sharding-by-hour</algorithm>
</rule>
</tableRule>
<function name="sharding-by-hour"class="io. mycat. route. function.LatestMonthPartion">
<property name="split0neDay">24</property>
</function>
首先指定分片字段,根据 create_time 进行分片,在指定分片的算法 sharding-by-hour,下面需要指定分片的处理类,还有一个叫做 splitoneday,one day 是一天,Split 是分割,也就是说一天分割为多少片,24 片代表一小时几片。
三、自然月分片算法
自然月分片算法指的就是按月分片,使用场景就是按月份分片,每个自然月为一个分片。比如有些系统当中订单的数据量比较大,他会把每一个月的订单存放在一张表中,这个时候就可以使用自然月分片算法。
1、自然月分片算法配置
<tableRule name="sharding-by-month">
<rule>
<columns>create- time</columns>
<algorithm>sharding-by-month</algorithm>
</rule>
</tableRule>
对于自然月分片算法的配置再来看一下,第一个 create- time 分片字段,第二个 sharding-by-month 分片算法。主要来看下面的属性,第一个 dataFormat 指的是日期的格式,还有一个 sBeginData 和 sEndData 这两个分别指定的是开始时间和结束时间。他的意思也就是说,在这个时间范围内,每个月都会生成一个分片,这就是它的含义。
<function name="sharding-by-month"class="io. mycat. route. function. Partition ByMonth">
<property name="dateFormat">yyyy-MM-dd</property>
<property name="sBeginDate">2020-01-01</property>
<property name="sEndDate">2020-12-31</property>
</function>
四、日期范围 hash 算法
日期范围 hash 算法和范围求模算法比较类似,他也是先按照日期进行范围分片求出分片组,再根据日期时间直接进行 hash 算法,再进行分片组类均匀分布。它的优点是可以避免扩容时的数据迁移,又可以一定程度上避免范围分片的热点问题。
注意:要求日期格式尽量精确些,不然达不到局部均匀的目的。
1、日期范围 hash 算法配置
<tableRule name="range-date-hash">
<rule>
<columns>create- time</columns>
<algorithm>range-date-hash</algorithm>
</rule>
</tableRule>
第一个 create_time 指定分片字段,range-date-hash 指定分片算法。下面是分片函数的处理类,yyyy-MM-dd HH:mm:ss 是时间格式,时间格式是什么样的以及从每个时间点开始进行分片,从 2020-01-01 00:00:00 这个时间点进行分片。接下来还有一个叫做 groupPartionSize,它指的是分片组的大小,也就是说会将 2020-01-01 00:00:00 这个时间段之后要进行一个分片组,一共有 6 个组,接下来还有一个叫 sPartionDay,这个指的是具体多少天为一组,也就是说 10 他为一组,一共有 6 组,持续的时间为 60 天。
<function name="range-date-hash"class="io. mycat. route. function.PartitionByRangeDateHash">
<property name="dateFormat">yyyy-MM-dd HH:mm:ss</property>
<property name="sBeginDate">2020-01-01 00:00:00</property>
<property name="groupPartionSize">6</property>
<property name="sPartionDay">10</property>
</function>
当我们插入一条数据的时候,他先会根据时间以及分片组的大小,以及每一个分片所占用的天数计算出当前这个时间,应该归属于哪一个分片组。然后再根据时间的hash 算法,将这条记录再插入到分片组当中的某一个分片,这就是日期范围 hash 算法的含义。
2、配置说明:
属性 描述
Columns 标识将要分片的表字段
Algorithm 指定分片函数与 function 的对应关系
class 指定该分片算法对应的类
dateFormat 日期格式,符合 Java 标准
sBeginDate 开始日期 ,与 dateFormat 指定的格式一致
groupPartionS ize 每组的分片数量
spartion pay 代表多少天为一组