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_db0和order_db1。后面会用
ds0和ds1来引用它们。
分库分表规则 (
!SHARDING)逻辑表:
t_order。每个数据库有 4 张分表(
t_order_0到t_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 都能无缝兼容。