short_link模块需要进行分库分表
短链码生成解决方案
进行62位进制转换,得到需要的数字+大小写字母的短链码
分库分表实操
,生成一个新的短链码用于精准选择分库分表。
这样分库分表的优点:
甚至可以避免数据迁移和数据扩容等问题解决。
实操如下
application.yml
spring:
shardingsphere:
tables:
short_link:
database-strategy:
standard:
sharding-column: code
precise-algorithm-class-name: net.xdclass.strategy.CostomDBPreciesShardingAlgorithm
# 真实数据表节点
actual-data-nodes: ds0.short_link,ds1.short_link,dsa.short_link
# 水平分表策略、自定义策略 真实库、逻辑表
table-strategy:
standard:
sharding-column: code
precise-algorithm-class-name: net.xdclass.strategy.CostomTablePreciesShardingAlgorithm
CostomDBPreciesShardingAlgorithm
package net.xdclass.strategy;
import net.xdclass.enums.BizCodeEnum;
import net.xdclass.exception.BizException;
import org.apache.shardingsphere.api.sharding.standard.PreciseShardingAlgorithm;
import org.apache.shardingsphere.api.sharding.standard.PreciseShardingValue;
import java.util.Collection;
public class CostomDBPreciesShardingAlgorithm implements PreciseShardingAlgorithm<String> {
/**
*
* @param availableTargetNames 数据源集合
* 在分库时值为分片库的集合 databaseNames
* 分表时对应分片库中所有分片表的集合 tablesNames
*
* @param shardingValue sharding value 分片属性,包括
* logicTableName 为逻辑表
* cloumnName 分片键(字段)
* * value 为从SQL中解析出的分片键的值
* @return
*/
@Override
public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<String> shardingValue) {
/**
* 获取短链码第一位,即库位
*/
String codePrefix = shardingValue.getValue().substring(0,1);
for (String targetName : availableTargetNames) {
//获取库名的最后一位,真正配置的ds
String targetNameSuffix = targetName.substring(targetName.length()-1);
if (codePrefix.equals(targetNameSuffix)){
return targetName;
}
}
//抛异常
throw new BizException(BizCodeEnum.DB_ROUTE_NOT_FOUND);
}
}
CostomTablePreciesShardingAlgorithm
package net.xdclass.strategy;
import org.apache.shardingsphere.api.sharding.standard.PreciseShardingAlgorithm;
import org.apache.shardingsphere.api.sharding.standard.PreciseShardingValue;
import java.util.Collection;
public class CostomTablePreciesShardingAlgorithm implements PreciseShardingAlgorithm<String> {
@Override
public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<String> shardingValue) {
//获取逻辑表
String targetName = availableTargetNames.iterator().next();
//短链码 Asdag1
String code = shardingValue.getValue().toString();
//获取短链码最后一位
String codeSuffix = code.substring(code.length() - 1);
return targetName+"_"+codeSuffix;
}
}
缺点:
无法保证是数据分布不均衡问题,产生新库数据<旧库数据。
解决方案
类似于nginx的加权负载均衡。