Apache ShardingSphere 内置的分片算法按照其设计目标和适用场景,确实可以清晰地划分为以下四大类型: 自动分片算法、标准分片算法、复合分片算法和 Hint 分片算法
1. 自动分片算法 (AUTO_SHARDING)
- 定位: 自动化分片,无需手动指定分片键和算法。
- 核心思想: 基于分布式主键生成器(如
Snowflake,CosId) 的前缀或特定规则自动计算分片位置。 - 代表算法:
MOD(取模):根据主键值直接取模分片。HASH_MOD(哈希取模):先对主键哈希,再取模分片。VOLUME_RANGE(基于容量的范围分片):根据预设的range-lower和range-upper范围分片。BOUNDARY_RANGE(基于边界的分片):根据预设的精确边界值列表分片。AUTO_INTERVAL(自动时间段分片):最常用。根据时间戳主键自动按固定时间间隔分片(如按天、月、年)。
- 优势:
- 配置极简: 只需定义分片数量和主键生成策略。
- 自动路由: 开发无需关心分片键值如何计算路由。
- 劣势:
- 灵活性受限: 路由规则完全绑定主键生成策略。
- 查询依赖: 非主键查询(尤其是非分片键)可能引发全路由。
- 适用场景: 主键为分布式ID且查询主要依赖主键的场景。
- YAML 配置示例 (AUTO_INTERVAL):
shardingAlgorithms: table_auto_interval: type: AUTO_INTERVAL props: datetime-lower: '2023-01-01 00:00:00' # 时间下限 datetime-upper: '2025-12-31 00:00:00' # 时间上限 sharding-seconds: 86400 # 分片间隔秒数 (86400秒=1天)
2. 标准分片算法 (STANDARD)
- 定位: 最常用、最核心的分片算法类型,处理单一分片键的精确分片和范围分片。
- 核心思想: 开发者显式配置分片键和路由算法。
- 算法组合:
StandardShardingAlgorithm(必需): 处理=和IN查询。RangeShardingAlgorithm(可选): 处理BETWEEN,>,<等范围查询。
- 代表算法:
INLINE:最推荐。基于 Groovy 表达式的轻量级算法 (如ds${order_id % 8})。MOD/HASH_MOD:简单或哈希取模。INTERVAL:强大。处理时间范围分片,可自动处理日期格式化、溢出。CLASS_BASED:终极灵活。自定义实现分片逻辑。
- 优势:
- 精准控制: 自由选择分片键和算法。
- 高性能: 路由计算高效。
- 组合能力强: 精确+范围算法覆盖大部分场景。
- 适用场景: 绝大多数需要明确分片键的场景。
- YAML 配置示例 (INLINE + 范围支持):
shardingAlgorithms: user_id_hash_mod: # 标准精确分片 (MOD) type: MOD props: sharding-count: 4 # 分成4片 tables: t_user: actualDataNodes: ds${0..3}.t_user databaseStrategy: standard: shardingColumn: user_id shardingAlgorithmName: user_id_hash_mod
3. 复合分片算法 (COMPLEX)
- 定位: 处理多个分片键组合路由的复杂场景。
- 核心思想: 使用多个分片键共同决定数据位置。
- 代表算法:
CLASS_BASED:唯一选择。必须自定义实现ComplexKeysShardingAlgorithm接口。
- 工作流程:
- 获取 SQL 中涉及的多个分片键的值 (
ShardingValue)。 - 开发者编写逻辑,综合所有分片键值计算目标数据源/表。
- 获取 SQL 中涉及的多个分片键的值 (
- 优势: 解决单分片键无法满足的复杂业务路由需求。
- 劣势:
- 开发复杂: 需手写路由逻辑。
- 维护成本高: 业务变更需同步修改算法。
- 适用场景: 需要同时按多个维度分片(如
tenant_id+region_id)。 - YAML 配置示例:
shardingAlgorithms: custom_complex_algo: # 指向自定义实现类 type: CLASS_BASED props: strategy: COMPLEX algorithmClassName: com.example.algos.MyComplexShardingAlgo tables: t_biz_data: databaseStrategy: complex: shardingColumns: tenant_id, region_code # 指定两个分片键 shardingAlgorithmName: custom_complex_algo
4. Hint 分片算法 (HINT)
- 定位: 强制路由,完全绕过 SQL 解析,通过编程方式指定分片位置。
- 核心思想: 使用
HintManagerAPI 在代码中硬编码分片信息。 - 代表算法:
CLASS_BASED:必须自定义实现HintShardingAlgorithm接口。VALUE:简单值匹配(较少用)。
- 使用步骤:
- 实现
HintShardingAlgorithm接口,定义如何解析 Hint 值。 - 代码中通过
HintManager设置分片值或直接分片目标。
- 实现
- 优势:
- 绝对控制: 无视 SQL 内容强制路由。
- 解决极端场景: 如无分片键的查询、跨分片复杂操作。
- 劣势:
- 完全侵入式: 业务代码需耦合 ShardingSphere API。
- 破坏透明性: 背离分库分表对应用透明的初衷。
- 适用场景:
- 执行跨分片笛卡尔积查询(如全量统计)。
- 数据迁移/修复工具。
- 特殊管理操作。
- Java 代码示例:
try (HintManager hintManager = HintManager.getInstance()) { // 强制设置分库分表值 hintManager.addDatabaseShardingValue("t_order", 1); // 路由到库分片值=1 hintManager.addTableShardingValue("t_order", 2); // 路由到表分片值=2 // 执行SQL (SELECT * FROM t_order) 将被强制路由到 ds1.t_order_2 orderDao.selectAll(); }
总结对比表
| 算法类型 | 核心特点 | 分片键数量 | 主要算法实现 | 适用场景 | 侵入性 |
|---|---|---|---|---|---|
| 自动分片算法 | 主键自动路由 | 0 (隐式) | AUTO_INTERVAL, MOD, VOLUME | 主键驱动型业务 | 低 (配置) |
| 标准分片算法 | 单分片键 + 精确/范围路由 | 1 | INLINE, INTERVAL, CLASS | 绝大多数常规分片 | 中 (配置键) |
| 复合分片算法 | 多分片键组合路由 | ≥2 | CLASS_BASED (自定义) | 多维度分片 | 高 (需编码) |
| Hint分片算法 | 编程强制指定路由 | N/A | CLASS_BASED (自定义) | 特殊操作、无分片键查询 | 极高 (API) |
选型建议
- 优先标准分片: 绝大多数场景用
INLINE或INTERVAL满足。 - 时间驱动选自动: 日志、流水类数据用
AUTO_INTERVAL最省心。 - 复杂逻辑用复合: 多维度分片不可避免时才上复合分片。
- Hint 是最后手段: 除非运维/工具类需求,否则避免使用 Hint。
📌 重要提示: 无论选择哪种算法,都应通过
shardingAlgorithms定义并在分片策略中引用。充分理解业务查询模式和数据分布是选择合适算法的前提。
913

被折叠的 条评论
为什么被折叠?



