ShardingSphere功能简介

ShardingSphere 是一款由 Apache 基金会主导的分布式数据库生态项目(Database Plus)。简单来说,它不是一个全新的数据库,而是一套让现有数据库(如 MySQL, PostgreSQL 等)具备分布式能力的中间件。

它的核心理念是"异构数据库上层的标准和生态"。它通过在数据库的上层进行拦截和处理,为数据库提供了分片、读写分离、加密等原本数据库不具备或难以实现的能力。

ShardingSphere 主要有两种产品形态:

  1. ShardingSphere-JDBC:轻量级 Java 框架,直接嵌入应用中(JAR 包形式)。
  2. ShardingSphere-Proxy:透明化的数据库代理端,独立部署,对应用无侵入。

🚀 核心功能与 SQL 执行示例

为了让你更直观地理解,我将通过几个核心功能场景,展示"你输入的 SQL"与"最终数据库实际执行的 SQL"之间的区别。

  1. 数据分片 (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 查;如果你查询所有订单(不带分片键),它会去所有分片执行查询(广播),然后将结果合并返回给你。

  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;

  1. 强制路由 (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 语句,也强制路由到主库执行。
  1. 数据加密 (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' 返回给应用。

  1. 影子库压测 (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 的同时,享受分布式架构带来的高性能和高可用性。

相关推荐
J_bean2 分钟前
MySQL InnoDB 如何检测死锁、判定死锁、处理死锁
数据库·mysql·死锁·死锁检测·处理死锁·死锁判定
浪子明X36 分钟前
从 MongoDB 文档到关系模型:构建可重跑、可对账的数据迁移流水线
数据库·mongodb·oracle
杜子不疼.39 分钟前
国产数据库撑起固井软件自主化:金仓 × 中海油服「海恒 Cemsol」落地解析
数据库
隔窗听雨眠1 小时前
GBase 8s并发控制深度解析:封锁机制、隔离级别与死锁处理全攻略
服务器·数据库·oracle
刀客Doc1 小时前
即时零售不只是多一个渠道,品牌开始重做终端生意
大数据·数据库
就叫飞六吧1 小时前
防抖、幂等、唯一约束三件套 ;
数据库
神奇霸王龙2 小时前
Agent 准入门控屠夫:5 旗舰 4 维度评估
linux·运维·数据库·ai·ai作画·agent·ai编程
鲸采云SRM采购管理系统2 小时前
采购管理系统哪家好?2026最新测评对比
java·服务器·数据库
cfm_29142 小时前
基于Binlog实现不停机数据库平滑迁移技术
运维·数据库·架构
Full Stack Developme2 小时前
SQL 注入 的历史及设计工作原理
数据库·sql