Skip to main content

什么是复合分片算法?

作者:程序员马丁

在线博客: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