在实际应用中,需要根据业务的特点和需求选择合适的分片策略,以实现数据的高效存储和查询。
苍穹标准产品中提供了几种不同的分片策略,这些分片策略能达到什么效果?我们在分表的过程中,该如何选择这些分片策略?
通过这篇文章,一一揭晓~
功能简介
对分片属性列数据的值按一定的算法计算出分片表标识,这种规则算法叫“分片策略”。系统提供了四类分片策略,如下表:
分片策略 | 使用场景 | 自定义参数 | 备注 |
日期策略 | 日期列类型,单属性分片 | 无 | 按日分片 按月分片 按年分片 日期求模分片 |
ID时序策略 | Long类型主键,属性值为分布式id生成 | 无 | 从ID中获取创建时间,做日期分片用 |
哈希取模策略 | 任意列类型,单、多属性分片 | mod.extra:例外配置 | 数据分布在预设的N张表中 |
映射策略 | 任意列类型 单、多属性分片 | p1.valueMapper:自定义单个属性的算法规则 | 万能的分片策略 |
适用版本
V4.0.009以上版本
功能详情
日期策略
单属性日期类型适配的分片策略,提供了如下四种不同场景分片策略:
1) 按日分片:单属性日期每天一张表;
2) 按月分片:单属性日期每月一张表;
3) 按年分片:单属性日期每年一张表;
4) 日期求模分片:先格式化单属性日期值再取模,根据日期属性计算预先分布在几张表中。
ID时序策略
ID时序策略为单属性Long类型分布式主键适配的分片策略,使用场景为:单据 ID 值为通过苍穹分布式ID生成的(ID 值里包含了创建时间,可作为日期类型进行分片),用作没有日期属性的单据但又期望分表具有时序性。达到的分片效果为:根据ID创建时间按日分片、按月分片或按年分片。
哈希取模策略
哈希取模策略为单、多属性,任意列类型适配的分片策略,使用场景为:数据分布在预设的N张表中。如预设在6张表中,则设置分片数量为6。
哈希取模策略可通过自定义参数支持例外分片:
参数:mod.extra,把特殊值指定到特定的分片表;
格式:值1|值N:分片表;值2|值3|值M:分片表。分片表索引可以在模数内,也可以在模数外。
示例:
某个单据配置分片属性为组织,分片策略为哈希取模策略,分片数量为3,即数据预设在3张表中。但是该张单据有几个组织的数据量庞大,其中ID为1278736336030892032的组织占表单数据量约百分之十五,ID为1188193147310571520、1188193147587395584 两家组织占表单数据量约百分之十五。
如果希望将这几个组织单独对应一张表中,可以通过自定义参数进行配置,如下所示:
mod.extra=1278736336030892032:7;188193147310571520:1188193147587395584:8
上例配置达到的效果为,ID为1278736336030892032组织单独一张表$7,ID为188193147310571520、1188193147587395584的两家组织数据存一张表$8,剩下的组织的数据分布在$0、$1、$2的三张表中,总共分6张表。
映射策略
单、多属性,任意列类型适配的分片策略。映射策略可以单独定义某个属性使用什么策略,比如组织使用哈希取莫,日期使用按月分片,最终实现的效果就是每月6张表。
通过自定义参数对各属性定义算法规则,提供了复杂业务场景下可组装分片策略的万能算法,基本上所有的策略都可以通过这个实现。
使用场景为复杂业务场景下可组装分片策略,在不能通过具体日期策略、哈希取模等策略适配时,优先考虑此策略,该策略通过自定义参数定位每个属性使用的分片算法。
参数valueMapper:定义某个分片属性的算法规则;
格式:pN.valueMapper,如定义多个分片属性中第一个分片属性的算法规则,则写法为:p1.valueMapper=kd.bos.xdb.sharding.strategy.map.mapper.HashModMapper 。
其中p1表示,第一个分片属性的值的映射规则采用 HashMod ,若对第二个分片属性的值算法规则进行设置,则写法为:p2.valueMapper=kd.bos.xdb.sharding.strategy.map.mapper.HashModMapper 。
系统内置两个常用的 valueMapper,分别为
1)kd.bos.xdb.sharding.strategy.map.mapper.HashModMapper,哈希取模:目的在于均摊数据,支持例外分片,如把数据量特别大的某个单据特别存储到指定分片表。该策略效果与哈希取模策略效果类同。
参数:p1.valueMapper.mod:预设分片数量,如p1.valueMapper.mod=6 ;
例外配置:p1.valueMapper.mod.extra:,即把特殊值指定到特定的分片表,格式为“值 1|值 2|值 N:分片表;值 3|值 4|值 M:分片表;”。该分片表索引可以在 mod 内,也可以在mod外,如p1.valueMapper.mod.extra =123456:7;987654:654321:8。
2)kd.bos.xdb.sharding.strategy.map.mapper.IDCreateTimeMapper,ID 值取创建时间,然后按时间格式化分布,该策略效果与ID时序策略效果类同。
参数:p1.valueMapper.pattern:日期格式,默认值为 yyyyMM,也可进行自定义如:p1.valueMapper.pattern=yyyyMMdd 。
为了方便大家理解映射策略,在此举例进行说明。
为了方便理解映射策略,在此举例进行说明。
示例一:
分片属性:组织org
分片策略:映射策略
此示例达到的效果为每个组织对应一张分片表,在组织数量庞大时,分表数巨大,是很不合理的,不建议进行此项配置。
示例二:
分片属性:组织org
分片策略:映射策略
自定义参数:p1.valueMapper= kd.bos.xdb.sharding.strategy.map.mapper.HashModMapper
p1.valueMapper.mod=6
此示例达到的效果为按组织org哈希取模,模数为6,数据分布在6张表中,这个效果与哈希取模策略一致,建议直接通过设置分片策略为哈希取模策略实现。
示例三:
分片属性:业务日期bizdate
分片策略:映射策略
日期格式:yyyy-MM
此示例达到的效果为按业务日期bizdate按月分表,这个效果与日期策略按月分片一致,建议直接通过设置分片策略为按月分片实现。
示例四:
分片属性:组织org+业务日期bizdate
分片策略:映射策略
日期格式:yyyy-MM
此示例达到的效果为每个组织每个月对应一张分片表,在组织数量庞大时,存在分表数巨大的风险,不建议进行此项配置。
示例五:
分片属性:组织org+业务日期bizdate
分片策略:映射策略
日期格式:yyyy-MM
自定义参数:p1.valueMapper= kd.bos.xdb.sharding.strategy.map.mapper.HashModMapper
p1.valueMapper.mod=6
此示例达到的效果为按月进行分表,且每月的分表数按组织org哈希取模,模数为6张表,即每月的数据分布在6张表中,是这个策略最通用的用法,达到了按属性组装分片策略的效果。
示例六:
分片属性:组织org+业务日期bizdate
分片策略:映射策略
日期格式:yyyy-MM
自定义参数:p1.valueMapper= kd.bos.xdb.sharding.strategy.map.mapper.HashModMapper
p1.valueMapper.mod=6
p1.valueMapper.mod.extra=1278736336030892032:7;188193147310571520:1188193147587395584:8
此示例达到的效果为按月进行分表,且id为1278736336030892032组织单独一张表$7中,id为188193147310571520、1188193147587395584的两家组织数据存一张表$8中,剩下的组织的数据分布在6张表中,每月总共8张表。
划重点
本文介绍了苍穹水平分表内置的四类分片策略的使用场景及达到的预期效果。分别包括:
• 日期策略:根据日期属性将数据分散到不同的表中,包括按日、月、年分片,以及日期求模分片。
• ID时序策略:利用包含时间信息的分布式ID值,将数据按照ID创建时间分散到不同的表中,以模拟时序性分片。
• 哈希取模策略:通过哈希函数和取模运算将数据分散到预设的表中,支持通过自定义参数对特殊值进行例外处理。
• 映射策略:允许用户为不同属性定义不同的分片策略,并通过自定义参数组合这些策略以满足复杂的业务需求。
文章特别对分片映射策略进行了详细的举例说明,在不能通过具体日期策略、哈希取模等策略适配时,优先考虑此策略,该策略通过自定义参数定位每个属性使用的分片算法,提供了复杂业务场景下可组装分片策略的万能算法。