ShardingSphere 是一款由 Apache 基金会主导的分布式数据库生态项目(Database Plus)。简单来说,它不是一个全新的数据库,而是一套让现有数据库(如 MySQL, PostgreSQL 等)具备分布式能力的中间件。
它的核心理念是"异构数据库上层的标准和生态"。它通过在数据库的上层进行拦截和处理,为数据库提供了分片、读写分离、加密等原本数据库不具备或难以实现的能力。
ShardingSphere 主要有两种产品形态:
- ShardingSphere-JDBC:轻量级 Java 框架,直接嵌入应用中(JAR 包形式)。
- ShardingSphere-Proxy:透明化的数据库代理端,独立部署,对应用无侵入。
🚀 核心功能与 SQL 执行示例
为了让你更直观地理解,我将通过几个核心功能场景,展示"你输入的 SQL"与"最终数据库实际执行的 SQL"之间的区别。
- 数据分片 (Sharding)
这是 ShardingSphere 最核心的功能。它能将一张大表水平拆分到多个数据库或多个表中。
-
场景:假设你有一张 t_order 订单表,按 order_id 取模分成了 2 张表 (t_order_0, t_order_1),并分库存储。
-
你的输入 (逻辑 SQL) :
INSERT INTO t_order (order_id, user_id, content) VALUES (1001, 2001, 'book');
-
执行的 SQL (真实 SQL):
-
系统根据分片算法计算 order_id=1001 应该落在 ds_0 库的 t_order_1 表中。
-
最终在数据库中执行:
INSERT INTO t_order_1 (order_id, user_id, content) VALUES (1001, 2001, 'book');
-
查询时同理:如果你查询 order_id=1001 的数据,它只会去 t_order_1 查;如果你查询所有订单(不带分片键),它会去所有分片执行查询(广播),然后将结果合并返回给你。
-
- 读写分离 (Read-Write Splitting)
它能将写操作路由到主库,读操作路由到从库,从而减轻主库压力。
-
场景:一主(ds_master)两从(ds_slave_0, ds_slave_1)架构。
-
你的输入 :
-- 写操作
UPDATE t_order SET content = 'pen' WHERE order_id = 1001;
-- 读操作
SELECT * FROM t_order WHERE order_id = 1001;
-
执行的 SQL:
-
写操作 :强制路由到主库执行。
/* 在 ds_master 上执行 */
UPDATE t_order SET content = 'pen' WHERE order_id = 1001;
-
读操作 :根据负载均衡策略(如轮询),随机路由到某一个从库执行。
/* 可能路由到 ds_slave_0 或 ds_slave_1 上执行 */
SELECT * FROM t_order WHERE order_id = 1001;
-
- 强制路由 (Hint)
有时候你想绕过分片算法,或者强制走主库,可以使用 Hint。
-
场景:强制查询某个特定分片,或强制读主库。
-
你的输入 :
/* SHARDINGSPHERE_HINT: t_order.SHARDING_TABLE_VALUE=10 */
SELECT * FROM t_order WHERE order_id = 999;
/* SHARDINGSPHERE_HINT: WRITE_ROUTE_ONLY=true */
SELECT * FROM t_order WHERE order_id = 1001;
-
执行的 SQL:
- 第一条:无视 SQL 中的 order_id,强制去 t_order_10 表查询。
- 第二条:即使这是 SELECT 语句,也强制路由到主库执行。
- 数据加密 (Data Masking)
它在写入时自动加密,读取时自动解密,业务代码无需改动。
-
场景:t_user 表中的 password 字段需要加密存储。
-
你的输入 :
INSERT INTO t_user (user_id, password) VALUES (1, '123456');
SELECT user_id, password FROM t_user WHERE user_id = 1;
-
执行的 SQL / 结果:
-
写入时 :ShardingSphere 拦截 SQL,将明文 '123456' 加密成密文(如 '25f9e794323b453885f5181f1b624d0b')存入数据库。
INSERT INTO t_user (user_id, password) VALUES (1, '25f9e794323b453885f5181f1b624d0b');
-
读取时:从数据库查出密文,ShardingSphere 自动解密成 '123456' 返回给应用。
-
- 影子库压测 (Shadow)
在不影响生产数据的情况下,通过一套影子规则将流量镜像到影子库。
-
场景:对下单接口进行压测。
-
你的输入 :
/* SHARDINGSPHERE_HINT: SHADOW=true */
INSERT INTO t_order (order_id, user_id) VALUES (999, 888);
-
执行的 SQL:
- 系统识别到 SHADOW=true,根据影子规则,将这条 SQL 路由到配置好的影子数据库中执行,完全隔离了对生产库的影响。
📊 总结:逻辑 SQL 与 真实 SQL 对比
为了方便记忆,我为你整理了一个简单的对比表:
功能 你写的 SQL (逻辑视图) 数据库实际执行的 SQL (物理视图) 作用
分片 SELECT * FROM t_order SELECT * FROM t_order_1 (或广播到所有节点) 拆分大表,突破单机性能瓶颈
读写分离 SELECT ... 在 ds_slave_0 上执行 SELECT ... 减轻主库压力,提升查询吞吐量
加密 INSERT INTO t_user(pwd) VALUES('123') INSERT INTO t_user(pwd) VALUES('加密串') 保护敏感数据,业务无感加解密
影子库 INSERT INTO t_order ... 在影子数据源执行 INSERT INTO t_order ... 压测验证,不影响生产数据
💡 其他重要特性
除了上述核心功能,ShardingSphere 还支持:
- 分布式事务:基于 XA 或 BASE 理论(如 Seata),保证跨库事务的一致性。
- 联邦查询 (Federate):支持跨数据源的 JOIN 查询(例如 MySQL 表关联 PostgreSQL 表)。
- 数据迁移:支持在不停机的情况下,进行数据的迁移和重分片。
总的来说,ShardingSphere 就像一个**"数据库的增强器"**,让你在使用标准 SQL 的同时,享受分布式架构带来的高性能和高可用性。