目录
分片枚举
固定分片hash算法
范围约定
取模
按日期(天)分片
取模范围约束
截取数字做hash求模范围约束
应用指定
截取数字hash解析
一致性hash
按单月小时拆分
范围取模分片
日期范围hash分片
冷热数据分片
自然月分片
通过在配置文件中配置可能的枚举id,自己配置分片,本规则适用于特定的场景,比如有些业务需要按照省 份或区县来做保存,而全国省份区县固定的,这类业务使用本条规则,配置如下:
sharding_id
hash-int
partition-hash-int.txt
0
0
partition-hash-int.txt 配置:
10000=0
10010=1
配置说明:
columns :标识将要分片的表字段
algorithm :分片函数
mapFile:切分配置文件名称
type:默认为0,0表示Integer,非零表示String
defaultNode:默认节点。节点配置从0开始,即0代表节点1
分片时如果没有识别到枚举值,就会路由到默认节点;如果不配置默认结点,识别不到枚举值时会报错
本条规则类似于十进制的求模运算,区别在于是二进制的操作,是取id的二进制低10位,即id二进制 &1111111111。
此算法的优点在于如果按照 10进制取模运算,在连续插入1-10 时候1-10会被分到1-10个分片,增 大了插入的事务控制难度,而此算法根据二进制则可能会分到连续的分片,减少插入事务事务控制难度。
id
func1
2,1
256,512
配置说明:
columns :标识将要分片的表字段
algorithm :分片函数
partitionCount:分片个数列表
partitionLength:分片范围列表
分区长度默认最大1024
1024 = sum((count[i]*length[i])). count 和length两个向量的点积恒等于1024
此分片适用于提前规划好分片字段某个范围属于哪个分片
id
rang-long
autopartition-long.txt
0
autopartition-long.txt文件配置
# range start-end ,data node index
# K=1000,M=10000.
0-500M=0
500M-1000M=1
1000M-1500M=2
配置说明:
columns :标识将要分片的表字段
algorithm :分片函数
mapFile:切分配置文件名称
defaultNode:超出范围后默认路由节点
对分片字段取模运算,根据分片字段进行十进制求模预算,相比固定分片hash,此种在批量插入时可能存在批量插入单 事务插入多数据分片,增大事务一致性难度。
id
mod-long
3
配置说明:
columns :标识将要分片的表字段
algorithm :分片函数
count:分片的数量
create_time
sharding-by-date
yyyy-MM-dd
2018-08-01
2018-08-31
15
配置说明:
columns :标识将要分片的表字段
algorithm :分片函数
dateFormat :日期格式
sBeginDate :开始日期
sEndDate:结束日期
sPartionDay :分区天数,即默认从开始日期算起,分隔 10天一个分区
注:
sEndDate代表数据达到了这个日期的分片后后循环从开始分片插入,若不配置数据到达分片时间范围后会报错
取模运算与范围约束的结合,先取模然后根据取模值范围分片,主要为了后续数据迁移做准备,即可以自主决定取模后数据的节点 分布
user_id
sharding-by-pattern
256
0
partition-pattern.txt
partition-pattern.txt文件配置
# id partition range start-end ,data node index
###### first host configuration
1-32=0
33-64=1
65-96=2
97-128=3
######## second host configuration
129-160=4
161-192=5
193-224=6
225-256=7
0-0=7
配置说明:
columns :标识将要分片的表字段
algorithm :分片函数
patternValue:取模基数
defaultNode:默认节点
mapFile:切分配置文件名称
则类似于取模范围约束,此规则支持数据符号字母取模。
user_id
sharding-by-prefixpattern
256
5
partition-pattern.txt
partition-pattern.txt文件配置
# range start-end ,data node index
# ASCII
# 8-57=0-9 阿拉伯数字
# 64、65-90=@、A-Z
# 97-122=a-z
###### first host configuration
1-4=0
5-8=1
9-12=2
13-16=3
###### second host configuration
17-20=4
21-24=5
25-28=6
29-32=7
0-0=7
配置说明:
columns :标识将要分片的表字段
algorithm :分片函数
patternValue:取模基数
prefixLength :ASCII 截取的位数 ,种获取前prefixLength位列所有ASCII 码的和进行求模 sum%patternValue
在运行阶段由应用自主决定路由到那个分片,直接根据字符子串(必须是数字)计算分区号(由应用传递参数,显式指定分区号)
user_id
sharding-by-substring
0
2
8
0
配置说明:
columns :标识将要分片的表字段
algorithm :分片函数
startIndex:截取开始位置
size:截取长度
partitionCount:分区数量
defaultPartition:默认分区号
例:id=05-100000002 在此配置中代表根据id中从 startIndex=0,开始,截取 siz=2位数字即05,05就是获取的分区,如果没传默认分配到defaultPartition
是截取字符串中的int数值hash 分片
user_id
sharding-by-stringhash
512
2
0:2
配置说明:
columns :标识将要分片的表字段
algorithm :分片函数
partitionLength:字符串hash求模基数
partitionCount:分区数
hashSlice:hash预算位,即根据子字符串中int值 hash运算,0 代表 str.length(), -1 代表 str.length()-1
例:值“45abc”,hash预算位0:2 ,取其中45进行计算
值“aaaabbb2345”,hash预算位-4:0 ,取其中2345进行计算
一致性hash预算有效解决了分布式数据的扩容问题
create_time
sharding-by-murmur
0
3
160
配置说明:
columns :标识将要分片的表字段
algorithm :分片函数
seed:hash 种子值
count: 要分片的数据库节点数量,必须指定,否则没法分片
virtualBucketTimes:一个实际的数据库节点被映射为多少虚拟节点,默认是 160 倍,也就是虚拟节点数是物理节点数的 160 倍
bucketMapPath:用于测试时观察各物理节点与虚拟节点的分布情况,如果指定了这个属性,会把虚拟节点的 murmur hash 值与物理节点的映射按行输出到这个文件,没有默认值,如果不指定,就不会输出任何东西
weightMapFile:节点的权重,没有指定权重的节点默认是 1。以 properties 文件的格式填写,以从 0 开始到 count-1 的整数值也就是节点索引为 key,以节点权重值为值。所有权重值必须是正整数,否则以 1 代
此规则是单月内按照小时拆分,最小粒度是小时,可以一天最多 24个分片,最少1个分片,一个月完后下月 从头开始循环。 每个月月尾,需要手工清理数据
create_time
sharding-by-hour
24
配置说明:
columns: 拆分字段,字符串类型(yyyymmddHH)
algorithm :分片函数
splitOneDay : 一天切分的分片数
id
rang-mod
partition-range-mod.txt
0
partition-range-mod.txt文件配置
# range start-end ,data node group size
0-200M=5
200M1-400M=1
400M1-600M=4
600M1-800M=4
800M1-1000M=6
配置说明:
columns :标识将要分片的表字段
algorithm :分片函数
mapFile:切分配置文件名称
defaultNode:默认节点
注:0-200M=5 表示在 0-200M范围中,有5个dataNode
思想与范围求模一致,当由于日期在取模会有数据集中问题,所以改成 hash方法。 先根据日期分组,再根据时间hash使得短期内数据分布的更均匀,可以避免扩容时的数据迁移,又可以一定程度上避免范围分片的热点问题
create_time
sharding-by-range-date-hash
yyyy-MM-dd HH:mm:ss
2018-08-01 00:00:00
3
6
配置说明:
columns :标识将要分片的表字段
algorithm :分片函数
dateFormat:日期格式
sBeginDate:开始日期,必须与dateFormat一致
sPartionDay:多少天分一个组
groupPartionSize:每组的分片数量
注:要求日期格式尽量精确些,不然达不到局部均匀的目的
根据日期查询日志数据 冷热数据分布 ,最近n个月的到实时交易库查询,超过n个月的按照m天分片
create_time
sharding-by-hotdate
yyyy-MM-dd
10
30
配置说明:
columns :标识将要分片的表字段
algorithm :分片函数
dataFormat:时间格式化
sLastDay:热数据的天数
sPartionDay:冷数据的分片天数(按照天数分片)
按照月份列分片,每个自然月一个分片
create_time
sharding-by-month
yyyy-MM-dd
2018-08-01
配置说明:
columns :标识将要分片的表字段
algorithm :分片函数
dataFormat:时间格式化
sBeginDate:开始日期