赞
踩
基于分片容量的范围分片算法
注意事项:
1、基于分片容量的范围分片可以支持分库又分表,但是要注意一个问题,如果分库分表的话
当设置分表策略的的时候要注意应该按照单库的策略去分否则就会报错。
2、基于分片容量的范围分片 分片字段要是一个long类型的数据,否则也不行
3、基于分片容量的范围分片 要预估数据的总量,相当于预估数据的上限,使用起来比较局限
下边举例:
共80个数据,分2个库,每个库分两张表,逻辑图如下:
共80个数据,分1个库,每个库分两张表,逻辑图如下:
根据上边说的设置表分片的时候应该按照如下的举例设置:
下边设置的意思是 [1-41)放在 d0和d1库中的m_user_0中 d0.m_user_0+d1.m_user_0=40条数据,表m_user_1道理一样
那么d0的m_user_0和d1的m_user_0各放多少数据取决于 分库的策略,总之要满足 d0.m_user_0+d1.m_user_0=40条数据
再说一下参数的含义
range-lower=41 表示分片字段的一个下限
range-upper= 81 表示分片字段的最大上限
sharding-volume= 40 表示分片的容量
[1-41) m_user_0 [41-81) m_user_1
#lcg_user表的分表的策略
spring.shardingsphere.rules.sharding.tables.m_user.actual-data-nodes=d$->{0..1}.m_user_$->{0..1}
#配置表的分片算法
spring.shardingsphere.rules.sharding.tables.m_user.table-strategy.standard.sharding-column=price
#这里的算法名称自己随便取
spring.shardingsphere.rules.sharding.tables.m_user.table-strategy.standard.sharding-algorithm-name=fan-wei
#配置具体的分表的算法-使用MOD,这时候一般是使用INLINE表达式
spring.shardingsphere.rules.sharding.sharding-algorithms.fan-wei.type=VOLUME_RANGE
#这里是开区间 [0-21)的意思 就是不包含21 设置数据的时候要注意 这里之所以不是
spring.shardingsphere.rules.sharding.sharding-algorithms.fan-wei.props.range-lower= 41
#范围分片的最大范围上限 这里是开区间 [0-81)的意思 就是不包含81 设置数据的时候要注意
spring.shardingsphere.rules.sharding.sharding-algorithms.fan-wei.props.range-upper= 81
#每个分片的容量(每个分片最多)
spring.shardingsphere.rules.sharding.sharding-algorithms.fan-wei.props.sharding-volume= 40
下边给出一个完整的基于分片容量的范围分片且分库分表配置案例:(如果是单个库的话去掉分库策略,修改actual-data-nodes数据节点是单个就可以了)
#打印sql spring.shardingsphere.props.sql-show=true #数据库的分库策略 spring.shardingsphere.rules.sharding.tables.m_user.database-strategy.complex.sharding-columns=buMen,sex spring.shardingsphere.rules.sharding.tables.m_user.database-strategy.complex.sharding-algorithm-name=complex-db spring.shardingsphere.rules.sharding.sharding-algorithms.complex-db.type=CLASS_BASED #策略的名称 complex 时必选 spring.shardingsphere.rules.sharding.sharding-algorithms.complex-db.props.strategy=complex #算法名称 complex 时必选 spring.shardingsphere.rules.sharding.sharding-algorithms.complex-db.props.algorithmClassName=com.shardings.selfdefined.MyComplexShardingAlgorithmDB #lcg_user表的分表的策略 spring.shardingsphere.rules.sharding.tables.m_user.actual-data-nodes=d$->{0..1}.m_user_$->{0..1} #配置表的分片算法 spring.shardingsphere.rules.sharding.tables.m_user.table-strategy.standard.sharding-column=price #这里的算法名称自己随便取 spring.shardingsphere.rules.sharding.tables.m_user.table-strategy.standard.sharding-algorithm-name=fan-wei #配置具体的分表的算法-使用MOD,这时候一般是使用INLINE表达式 spring.shardingsphere.rules.sharding.sharding-algorithms.fan-wei.type=VOLUME_RANGE #这里是闭区间 [0-21)的意思 就是包含21 设置数据的时候要注意 spring.shardingsphere.rules.sharding.sharding-algorithms.fan-wei.props.range-lower= 41 #范围分片的最大范围上限 这里是开区间 [0-81)的意思 就是不包含81 设置数据的时候要注意 spring.shardingsphere.rules.sharding.sharding-algorithms.fan-wei.props.range-upper= 81 #每个分片的容量(每个分片最多) spring.shardingsphere.rules.sharding.sharding-algorithms.fan-wei.props.sharding-volume= 40 # 配置lcg_user的id采用雪花算法生成全局id策略 spring.shardingsphere.rules.sharding.tables.m_user.key-generate-strategy.column=id spring.shardingsphere.rules.sharding.tables.m_user.key-generate-strategy.key-generator-name=SNOWFLAKE
数据库分片算法的实现:(下边的代码只是一个简单的示例,大家不要拘泥于这种数据库分片方式)
package com.shardings.selfdefined; import lombok.extern.slf4j.Slf4j; import org.apache.shardingsphere.sharding.api.sharding.complex.ComplexKeysShardingAlgorithm; import org.apache.shardingsphere.sharding.api.sharding.complex.ComplexKeysShardingValue; import java.util.Arrays; import java.util.Collection; import java.util.Map; import java.util.Optional; /** * @author: LCG * @date: 2022-11-12 18:52:43 * @description: 自定义 多字段分片算法 按照数据库划分 **/ @Slf4j public class MyComplexShardingAlgorithmDB implements ComplexKeysShardingAlgorithm<String> { private static final String column1="buMen"; private static final String column2="sex"; /** * @author: LCG * @date: 2022-11-12 23:19:16 * @description: collection 数据库的逻辑名称集合 * complexKeysShardingValue 复合分片字段的字段名和字段值 */ @Override public Collection<String> doSharding(Collection<String> collection, ComplexKeysShardingValue<String> complexKeysShardingValue) { String logicTableName = complexKeysShardingValue.getLogicTableName(); Map<String, Collection<String>> columnNameAndShardingValuesMap = complexKeysShardingValue.getColumnNameAndShardingValuesMap(); Collection<String> c1 = columnNameAndShardingValuesMap.get(column1); Collection<String> c2 = columnNameAndShardingValuesMap.get(column2); if(Optional.ofNullable(c1).isPresent()&&Optional.ofNullable(c2).isPresent()){ StringBuffer sb=new StringBuffer(c1.stream().findFirst().get()); sb.append(c2.stream().findFirst().get()); int i = sb.toString().hashCode() % collection.size(); String s = i == 0 ? "d0" : "d1"; return Arrays.asList(s); } return collection; } @Override public void init() { } @Override public String getType() { return "COMPLEX-DB"; } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。