ComplexKeysShardingAlgorithm 是 Apache ShardingSphere 中的一种分片算法实现,用于处理基于多个分片键的复合分片场景。
ComplexKeysShardingAlgorithm 允许您:
public interface ComplexKeysShardingAlgorithm<T extends Comparable<?>> extends ShardingAlgorithm {
Collection<String> doSharding(Collection<String> availableTargetNames,
ComplexKeysShardingValue<T> shardingValue);
}
public interface ComplexKeysShardingAlgorithm<T extends Comparable<?>> extends ShardingAlgorithm {
Collection<String> doSharding(Collection<String> availableTargetNames,
ComplexKeysShardingValue<T> shardingValue);
}
availableTargetNames
:所有可选的分片目标(如表名或数据源名)shardingValue
:包含多个分片键及其值的容器对象public final class ComplexKeysShardingValue<T extends Comparable<?>> {
private final String logicTableName;
private final Map<String, Collection<T>> columnNameAndShardingValuesMap;
private final Map<String, Range<T>> columnNameAndRangeValuesMap;
}
public final class ComplexKeysShardingValue<T extends Comparable<?>> {
private final String logicTableName;
private final Map<String, Collection<T>> columnNameAndShardingValuesMap;
private final Map<String, Range<T>> columnNameAndRangeValuesMap;
}
rules:
- !SHARDING
tables:
t_order:
actualDataNodes: ds_${0..1}.t_order_${0..15}
tableStrategy:
complex:
shardingColumns: user_id,order_date
algorithmClassName: com.example.MyComplexKeysShardingAlgorithm
rules:
- !SHARDING
tables:
t_order:
actualDataNodes: ds_${0..1}.t_order_${0..15}
tableStrategy:
complex:
shardingColumns: user_id,order_date
algorithmClassName: com.example.MyComplexKeysShardingAlgorithm
public class MyComplexKeysShardingAlgorithm implements ComplexKeysShardingAlgorithm<Long> {
@Override
public Collection<String> doSharding(Collection<String> availableTargetNames,
ComplexKeysShardingValue<Long> shardingValue) {
// 获取分片键值
Map<String, Collection<Long>> columnValues = shardingValue.getColumnNameAndShardingValuesMap();
Collection<Long> userIds = columnValues.get("user_id");
Collection<Long> orderDates = columnValues.get("order_date");
// 自定义分片逻辑
Long userId = userIds.iterator().next();
Long orderDate = orderDates.iterator().next();
// 示例:user_id后两位+年月取模
int suffix = (int)(userId % 100);
int monthValue = LocalDateTime.ofInstant(
Instant.ofEpochMilli(orderDate), ZoneId.systemDefault())
.getMonthValue();
int index = (suffix + monthValue) % availableTargetNames.size();
return Collections.singletonList("t_order_" + index);
}
}
算法类型 | 分片键数量 | 适用场景 | 特点 |
---|---|---|---|
ComplexKeysShardingAlgorithm | 多分片键 | 需要多个字段组合分片 | 灵活度高,逻辑可自定义 |
StandardShardingAlgorithm | 单分片键 | 简单分片场景 | 实现简单,性能好 |
HintShardingAlgorithm | 无固定分片键 | 强制路由场景 | 通过Hint指定分片 |
ComplexKeysShardingAlgorithm 提供了极大的灵活性,特别适合需要根据多个业务维度进行数据分片的复杂场景。正确使用可以显著提升分布式数据库系统的性能和可扩展性。