Sharding-JDBC 系列专题 - 第三篇:分片策略与算法

Sharding-JDBC 系列专题 - 第三篇:分片策略与算法

本系列专题旨在帮助开发者全面掌握 Sharding-JDBC,一个轻量级的分布式数据库中间件。本篇作为系列的第三篇文章,将深入探讨 分片策略(Sharding Strategies)分片算法(Sharding Algorithms),包括其类型、配置方法、自定义算法实现以及适用场景。分片策略是 Sharding-JDBC 实现数据水平拆分的核心,决定了数据如何分布到不同的数据库和表。需要图形化展示的部分将使用 Mermaid 语法绘制图表。


1. 分片策略概述

在 Sharding-JDBC 中,分片策略定义了数据如何根据分片键(Sharding Key)分配到不同的数据库(分库)或表(分表)。分片策略分为 数据库分片策略表分片策略,分别控制数据在数据库和表级别的分布。

1.1 分片策略类型

Sharding-JDBC 提供以下五种分片策略:

  1. 标准分片策略(Standard Sharding Strategy)
    • 基于单一分片键,适合简单分片场景。
    • 包含精确分片(=IN)和范围分片(BETWEEN>< 等)。
  2. 复合分片策略(Complex Sharding Strategy)
    • 支持多个分片键,适合复杂业务逻辑。
    • 需要自定义分片算法处理多键组合。
  3. 内联分片策略(Inline Sharding Strategy)
    • 使用简单的表达式(如 Groovy 语法)定义分片规则。
    • 适合快速配置,无需编写复杂代码。
  4. Hint 分片策略(Hint Sharding Strategy)
    • 通过代码显式指定分片目标,绕过分片键。
    • 适合动态或临时分片场景。
  5. 无分片策略(None Sharding Strategy)
    • 不进行分片,数据直接路由到默认数据源。
    • 适用于不需要分片的表。

1.2 分片算法

每种分片策略都需要搭配分片算法来实现具体的分片逻辑。分片算法分为:

  • 内置算法:如模运算(Modulo)、哈希(Hash)、范围(Range)、时间(Interval)等。
  • 自定义算法:开发者实现 PreciseShardingAlgorithmRangeShardingAlgorithm 接口,满足复杂业务需求。

2. 分片策略配置

以下通过 YAML 配置展示不同分片策略的用法,基于一个订单表 t_order,按用户 ID 分库,按订单 ID 分表。

2.1 内联分片策略(Inline)

内联分片策略通过简单的表达式定义分片规则,适合快速上手。

dataSources:
  ds_0:
    url: jdbc:mysql://localhost:3306/db0?useSSL=false
    username: root
    password: 123456
  ds_1:
    url: jdbc:mysql://localhost:3306/db1?useSSL=false
    username: root
    password: 123456

shardingRule:
  tables:
    t_order:
      actualDataNodes: ds_${
   0..1}.t_order_${
   0..1}
      tableStrategy:
        inline:
          shardingColumn: order_id
          algorithmExpression: t_order_${
   order_id % 2}
      keyGenerateStrategy:
        column: order_id
        keyGeneratorName: snowflake
  defaultDatabaseStrategy:
    inline:
      shardingColumn: user_id
      algorithmExpression: ds_${
   user_id % 2}
  keyGenerators:
    snowflake:
      type: SNOWFLAKE

说明

  • 分库:按 user_id % 2 分配到 ds_0ds_1
  • 分表:按 order_id % 2 分配到 t_order_0t_order_1
  • 适用场景:分片逻辑简单,数据分布均匀。

2.2 标准分片策略(Standard)

标准分片策略需要搭配自定义分片算法,适合需要精确控制的场景。

shardingRule:
  tables:
    t_order:
      actualDataNodes: ds_${
   0..1}.t_order_${
   0..1}
      tableStrategy:
        standard:
          shardingColumn: order_id
          preciseAlgorithmClassName: com.example.MyPreciseShardingAlgorithm
          rangeAlgorithmClassName: com.example.MyRangeShardingAlgorithm
  defaultDatabaseStrategy:
    standard:
      shardingColumn: user_id
      preciseAlgorithmClassName: com.example.MyPreciseShardingAlgorithm
      rangeAlgorithmClassName: com.example.MyRangeShardingAlgorithm

自定义分片算法MyPreciseShardingAlgorithm):

package com.example;

import org.apache.shardingsphere.sharding.api.sharding.standard.PreciseShardingValue;
import org.apache.shardingsphere.sharding.api.sharding.standard.PreciseShardingAlgorithm;

import java.util.Collection;

public class MyPreciseShardingAlgorithm implements PreciseShardingAlgorithm<Long> {
   
    @Override
    public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<Long> shardingValue) {
   
        for (String targetName : availableTargetNames) {
   
            if (targetName.endsWith(String.valueOf(shardingValue.getValue() % 2))) {
   
                return targetName;
            }
        }
        throw new IllegalArgumentException("No target found for value: " + shardingValue.getValue());
    }
}

说明

  • preciseAlgorithmClassName:处理精确分片(如 =IN)。
  • rangeAlgorithmClassName:处理范围分片(如 BETWEEN)。
  • 适用场景:需要复杂分片逻辑或动态调整分片规则。

2.3 复合分片策略(Complex)

复合分片策略支持多个分片键,需自定义算法处理组合逻辑。

shardingRule:
  tables:
    t_order:
      actualDataNodes: ds_${
   0..1}.t_order_${
   0..1}
      tableStrategy:
        complex:
          shardingColumns: order_id, user_id
          algorithmClassName: com.example.MyComplexShardingAlgorithm

自定义复合分片算法

package com.example;

import org.

你可能感兴趣的:(算法)