按 Enter 键跳转到正文

ShardingSphere 使用指南

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

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

配置文件路径:

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

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

  • server.yaml (全局配置)
1authentication:
2  users:
3    root:
4      password: root123              # 设置登录 ShardingSphere-Proxy 的账号和密码
5      authorizedSchemas: ds_sharding # 指定该用户可访问的逻辑库(schema)
6
7props:
8  sql-show: true   # 开启 SQL 打印,方便调试时查看 Proxy 最终路由后的真实 SQL
  • config-sharding.yaml (分库分表 + 读写分离配置)
 1schemaName: ds_sharding   # 定义逻辑库名称,PHP / Java / MySQL 客户端连接时用这个库名
 2
 3# -----------------------------
 4# 数据源配置(物理数据库连接)
 5# -----------------------------
 6dataSources:
 7  ds0:                                    # 数据源1(对应一个物理数据库)
 8    url: jdbc:mysql://127.0.0.1:3306/order_db0?serverTimezone=UTC&useSSL=false
 9    username: root
10    password: root
11  ds1:                                    # 数据源2(对应另一个物理数据库)
12    url: jdbc:mysql://127.0.0.1:3306/order_db1?serverTimezone=UTC&useSSL=false
13    username: root
14    password: root
15
16# -----------------------------
17# 分片规则配置
18# -----------------------------
19rules:
20- !SHARDING
21  tables:
22    t_order:                              # 定义逻辑表名:t_order
23      actualDataNodes: ds$->{0..1}.t_order_$->{0..3}  
24      # 表示实际的数据节点:  
25      #  - 数据库范围是 ds0、ds1(0..1)
26      #  - 每个库里有 4 个分表(t_order_0, t_order_1, t_order_2, t_order_3)
27      #  最终生成的物理表结构:
28      #    ds0.t_order_0 ~ ds0.t_order_3
29      #    ds1.t_order_0 ~ ds1.t_order_3
30
31      tableStrategy:                      # 表级分片策略
32        standard:                         # 标准分片(根据单一分片键)
33          shardingColumn: order_id        # 分片字段(根据 order_id 来决定落在哪个分表)
34          shardingAlgorithmName: t_order_inline  # 使用下面定义的分片算法
35
36  shardingAlgorithms:                     # 定义分片算法
37    t_order_inline:                       # 算法名(和上面引用的保持一致)
38      type: INLINE                        # 类型为 INLINE(内联表达式分片)
39      props:
40        algorithm-expression: t_order_$->{order_id % 4}
41        # 分片规则:根据 order_id 取模 4
42        # 比如 order_id=10001 → 10001%4=1 → 路由到 t_order_1
43
44# -----------------------------
45# (可选)读写分离配置
46# -----------------------------
47- !READWRITE_SPLITTING
48  dataSources:
49    pr_ds:                                # 定义一个逻辑数据源 pr_ds(Proxy 会将它当成读写分离的数据源)
50      staticStrategy:
51        writeDataSourceName: ds0          # 指定主库(写库),这里用 ds0
52        readDataSourceNames: [ds1]        # 指定从库(读库),这里用 ds1
53      loadBalancerName: round_robin       # 多个从库时的负载均衡策略(这里用轮询)
54
55  loadBalancers:
56    round_robin:                          # 定义负载均衡器
57      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

1bin/start.sh

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

四、使用方式

4.1 建表

在 Proxy 中执行建表语句:

1CREATE TABLE t_order (
2  order_id BIGINT NOT NULL,
3  user_id BIGINT NOT NULL,
4  status VARCHAR(50),
5  PRIMARY KEY(order_id)
6);

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

4.2 插入数据

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

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

4.3 查询

1SELECT * FROM t_order WHERE order_id = 10001;

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

五、 PHP 项目中的应用

5.1 连接方式

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

1$dsn = "mysql:host=127.0.0.1;port=3307;dbname=ds_sharding";
2$pdo = new PDO($dsn, "root", "root123");
3
4$stmt = $pdo->prepare("INSERT INTO t_order (order_id, user_id, status) VALUES (?, ?, ?)");
5$stmt->execute([10003, 20003, 'PENDING']);

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

发表评论