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 的同时,享受分布式架构带来的高性能和高可用性。

相关推荐
talenteddriver2 小时前
mysql: MySQL索引和排序相关名词概念汇总
数据库·mysql
武昌库里写JAVA2 小时前
iview-CRUD模板
vue.js·spring boot·sql·layui·课程设计
6极地诈唬2 小时前
【PG漫步】DELETE不会改变本地文件的大小,VACUUM也不会
linux·服务器·数据库
MZWeiei3 小时前
Redis持久化机制中的 AOF机制简单介绍
数据库·redis
Elastic 中国社区官方博客4 小时前
Elasticsearch:在 X-mas 吃一些更健康的东西
android·大数据·数据库·人工智能·elasticsearch·搜索引擎·全文检索
酷柚易汛4 小时前
酷柚易汛ERP 2025-12-26系统升级日志
java·前端·数据库·php
wang6021252184 小时前
阿里云存储的一些简要概述
数据库·阿里云·fastapi
小徐Chao努力5 小时前
【Langchain4j-Java AI开发】08-向量嵌入与向量数据库
java·数据库·人工智能
TG:@yunlaoda360 云老大5 小时前
华为云国际站代理商GSL主要有什么作用呢?
网络·数据库·华为云