什么是复合分片算法?
作者:程序员马丁
在线博客:https://open8gu.com
note
大话面试,技术同学面试必备的八股文小册,以精彩回答应对深度问题,助力你在面试中拿个offer。
回答话术
复合分片算法指的就是,用于处理使用多键作为分片键进行分片的场景。适用于多维度的分片需求,可以更灵活地满足业务场景的复杂性。
ShardingSphere 本身提供开箱即用的复合分片算法,但大部分情况下,因为业务复杂性,需要开发人员在项目中进行自定义分片算法实现类。
如果项目中使用到了复合分片算法,绝大多数场景下用于基因法对业务进行查询便利性扩展。
分库分表基因法扩展知识:✅ 什么是分库分表基因法?
问题详解
1. 和单分片键的区别
- 维度复杂性: 单分片键算法适用于单一维度的分片需求,而复合分片算法适用于多维度的分片需求。复合分片算法更灵活,可以根据多个字段的组合来进行分片。
- 配置难易度: 单分片键算法的配置相对简单,而复合分片算法的配置可能会更加复杂,需要考虑多个分片键的组合关系。
- 业务场景: 单分片键算法通常适用于简单的业务场景,而复合分片算法适用于复杂的业务场景,例如需要考虑多个业务维度的分片策略。
2. 复合分片算法实战
以 ShardingSphere 5.3.2 版本举例说明复合分片算法使用方式。
2.1. 定义规则配置
代码中创建自定义分片算法,首先需要继承 ComplexKeysShardingAlgorithm
接口并实现 doSharding
分片算法方法。
package org.opengoofy.index12306.biz.orderservice.dao.algorithm;
import lombok.Getter;
import org.apache.shardingsphere.sharding.api.sharding.complex.ComplexKeysShardingAlgorithm;
import org.apache.shardingsphere.sharding.api.sharding.complex.ComplexKeysShardingValue;
import java.util.Properties;
/**
* 订单表相关复合分片算法配置
*/
public class OrderCommonTableComplexAlgorithm implements ComplexKeysShardingAlgorithm {
@Getter
private Properties props;
@Override
public Collection<String> doSharding(Collection availableTargetNames, ComplexKeysShardingValue shardingValue) {
// 省略查询分片表的逻辑
return null;
}
@Override
public void init(Properties props) {
this.props = props;
}
}
在 resources
目录下创建 shardingsphere-config.yaml
规则文件,自定义分片规则。
# 省略数据源配置
rules:
- !SHARDING
# 分表配置
tables:
# 订单表分片
t_order:
# 真实的订单表集合
actualDataNodes: t_order_${0..15}
# 分片策略
tableStrategy:
# complex 代表复合分片,相对应还有一个值是 standard,代表单字段分片
complex:
# 分片字段
shardingColumns: user_id,order_sn
# 分片算法名称,对应下面的 shardingAlgorithms[0]
shardingAlgorithmName: order_table_complex_mod
# 分片算法配置
shardingAlgorithms:
# 订单复合分片算法
order_table_complex_mod:
# CLASS_BASED 代表通过类加载的形式,加载复合分片算法实现类
type: CLASS_BASED
props:
# 复合分片算法实现类全限定名
algorithmClassName: org.opengoofy.index12306.biz.orderservice.dao.algorithm.OrderCommonTableComplexAlgorithm
# 分片算法类型,complex 代表复合分片,相对应还有一个值是 standard,代表单字段分片
strategy: complex
2.2. 指定 SpringBoot 配置文件
SpringBoot 配置文件 application.yaml
中指定 ShardingSphere 规则文件。
spring:
datasource:
driver-class-name: org.apache.shardingsphere.driver.ShardingSphereDriver
url: jdbc:shardingsphere:classpath:shardingsphere-config.yaml