ShardingSphere 使用指南

一、介绍

Apache ShardingSphere 是一个开源的 分布式数据库中间件生态,支持 分库分表、读写分离、数据加密、影子库 等功能。它的定位是 数据库增强计算层,让你在不修改(或少量修改)应用代码的情况下,实现复杂的数据分片与治理。

核心组件:

  • ShardingSphere-JDBC:客户端 SDK,直接在应用中引入。
  • ShardingSphere-Proxy:中间件代理层,应用通过 MySQL 协议访问,无需修改业务代码。
  • ShardingSphere-Sidecar:面向 K8s 的云原生数据库 Mesh。

二、适用场景

  • 分库分表:数据量过大,单表行数超过 1千万~1亿,单库容量超限时。

  • 读写分离:主库写、从库读,提升查询性能。

  • 柔性事务:分布式场景下保证一致性(支持 Seata、XA)。

  • 数据加密:对敏感字段(手机号、身份证号)自动加密存储,解密查询。

  • 影子库:A/B 测试或灰度发布。

三、 配置方式

以 ShardingSphere-Proxy 为例(最常用于 PHP 项目)。

3.1 部署 Proxy

wget https://downloads.apache.org/shardingsphere/5.4.2/apache-shardingsphere-5.4.2-shardingsphere-proxy-bin.tar.gz
tar -zxvf apache-shardingsphere-5.4.2-shardingsphere-proxy-bin.tar.gz
cd apache-shardingsphere-5.4.2-shardingsphere-proxy-bin

配置文件路径:

conf/server.yaml    # 全局配置(身份认证、元数据)
conf/config-sharding.yaml  # 分库分表配置

3.2 示例配置(分库分表 + 读写分离)

  • server.yaml (全局配置)
authentication:
  users:
    root:
      password: root123              # 设置登录 ShardingSphere-Proxy 的账号和密码
      authorizedSchemas: ds_sharding # 指定该用户可访问的逻辑库(schema)

props:
  sql-show: true   # 开启 SQL 打印,方便调试时查看 Proxy 最终路由后的真实 SQL
  • config-sharding.yaml (分库分表 + 读写分离配置)
schemaName: ds_sharding   # 定义逻辑库名称,PHP / Java / MySQL 客户端连接时用这个库名

# -----------------------------
# 数据源配置(物理数据库连接)
# -----------------------------
dataSources:
  ds0:                                    # 数据源1(对应一个物理数据库)
    url: jdbc:mysql://127.0.0.1:3306/order_db0?serverTimezone=UTC&useSSL=false
    username: root
    password: root
  ds1:                                    # 数据源2(对应另一个物理数据库)
    url: jdbc:mysql://127.0.0.1:3306/order_db1?serverTimezone=UTC&useSSL=false
    username: root
    password: root

# -----------------------------
# 分片规则配置
# -----------------------------
rules:
- !SHARDING
  tables:
    t_order:                              # 定义逻辑表名:t_order
      actualDataNodes: ds$->{0..1}.t_order_$->{0..3}  
      # 表示实际的数据节点:  
      #  - 数据库范围是 ds0、ds1(0..1)
      #  - 每个库里有 4 个分表(t_order_0, t_order_1, t_order_2, t_order_3)
      #  最终生成的物理表结构:
      #    ds0.t_order_0 ~ ds0.t_order_3
      #    ds1.t_order_0 ~ ds1.t_order_3

      tableStrategy:                      # 表级分片策略
        standard:                         # 标准分片(根据单一分片键)
          shardingColumn: order_id        # 分片字段(根据 order_id 来决定落在哪个分表)
          shardingAlgorithmName: t_order_inline  # 使用下面定义的分片算法

  shardingAlgorithms:                     # 定义分片算法
    t_order_inline:                       # 算法名(和上面引用的保持一致)
      type: INLINE                        # 类型为 INLINE(内联表达式分片)
      props:
        algorithm-expression: t_order_$->{order_id % 4}
        # 分片规则:根据 order_id 取模 4
        # 比如 order_id=10001 → 10001%4=1 → 路由到 t_order_1

# -----------------------------
# (可选)读写分离配置
# -----------------------------
- !READWRITE_SPLITTING
  dataSources:
    pr_ds:                                # 定义一个逻辑数据源 pr_ds(Proxy 会将它当成读写分离的数据源)
      staticStrategy:
        writeDataSourceName: ds0          # 指定主库(写库),这里用 ds0
        readDataSourceNames: [ds1]        # 指定从库(读库),这里用 ds1
      loadBalancerName: round_robin       # 多个从库时的负载均衡策略(这里用轮询)

  loadBalancers:
    round_robin:                          # 定义负载均衡器
      type: ROUND_ROBIN                   # 类型:轮询

配置说明

  • 数据源 (dataSources)

    • 定义了两个物理数据库:order_db0order_db1

    • 后面会用 ds0ds1 来引用它们。

  • 分库分表规则 (!SHARDING)

    • 逻辑表:t_order

    • 每个数据库有 4 张分表(t_order_0t_order_3)。

    • 分片字段:order_id

    • 分片算法:order_id % 4,决定路由到哪个分表。

  • 读写分离规则 (!READWRITE_SPLITTING)

    • 定义逻辑数据源 pr_ds,它是一个读写分离组合。

    • 主库写操作走 ds0,读操作走 ds1

    • 读请求分配策略是轮询(ROUND_ROBIN

启动 Proxy

bin/start.sh

此时 Proxy 会监听 3307(默认),你可以用 mysql -h127.0.0.1 -P3307 -uroot -proot123 登录。

四、使用方式

4.1 建表

在 Proxy 中执行建表语句:

CREATE TABLE t_order (
  order_id BIGINT NOT NULL,
  user_id BIGINT NOT NULL,
  status VARCHAR(50),
  PRIMARY KEY(order_id)
);

Proxy 会自动在 每个分库分表 中创建对应的物理表。

4.2 插入数据

INSERT INTO t_order (order_id, user_id, status) VALUES (10001, 20001, 'NEW');
INSERT INTO t_order (order_id, user_id, status) VALUES (10002, 20002, 'PAID');

ShardingSphere 根据分片规则自动路由到不同的分库分表。

4.3 查询

SELECT * FROM t_order WHERE order_id = 10001;

ShardingSphere 自动定位到具体的表(例如 order_db0.t_order_1)。

五、 PHP 项目中的应用

5.1 连接方式

PHP 不需要额外 SDK,直接连接 ShardingSphere-Proxy,就像连接 MySQL 一样:

$dsn = "mysql:host=127.0.0.1;port=3307;dbname=ds_sharding";
$pdo = new PDO($dsn, "root", "root123");

$stmt = $pdo->prepare("INSERT INTO t_order (order_id, user_id, status) VALUES (?, ?, ?)");
$stmt->execute([10003, 20003, 'PENDING']);

PDO / mysqli / Laravel Eloquent / ThinkPHP Db 都能无缝兼容。