ShardingSphere 分布式数据库中间件生态

shard 碎片

sphere 生态圈

  • ShardingSphere-JDBC
    轻量级Java框架,在Java的JDBC层提供额外服务。
  • ShardingSphere-Proxy
    数据库代理,对异构语言的支持
  • ShardingSphere-Sidecar
    Kubernetes的云原生数据库代理

文章目录

ShardingSphere

Apache ShardingSphere 是一个开源的 分布式数据库中间件生态

集群环境需要通过独立部署的注册中心(Zookeeper或Etcd)来存储元数据和协调节点状态。

三层可插拔架构

ShardingSphere 5.x版本开始致力于可插拔架构,项目的功能组件能够灵活地以可插拔的方式进行扩展。

  • L1内核层是数据库基本能力的抽象,主要包括查询优化器、分布式事务引擎、分布式执行引擎、权限引擎和调度引擎等组件。所有组件都必须存在,但具体实现可通过可插拔的方式更换。

  • L2功能层用于提供增量能力,主要包括数据分片、读写分离、数据库高可用、数据加密、影子库 等组件。所有组件均是可选的,可以包含零至多个组件。组件之间完全隔离,互无感知,多组件可通过叠加的方式相互配合使用。用户自定义功能可完全面向ShardingSphere定义的顶层接口进行定制化扩展,而无需改动内核代码。

  • L3生态层用于对接和融入现有数据库生态,包括数据库协议、SQL解析器和存储适配器,分别对应于ShardingSphere以数据库协议提供服务的方式、SQL方言操作数据的方式以及对接存储节点的数据库类型。

集群管控

  • 面对超负荷流量,针对某一节点进行熔断(阻断ShardingSphere和数据库的连接)和限流,以保证整个数据库集群得以继续运行

  • 分布式主键

    ShardingSphere不仅提供了内置的分布式主键生成器 ,例如UUID、SNOWFLAKE,还抽离出分布式主键生成器的接口,方便用户实现自定义的自增主键生成器。

读写分离

把写请求发到主库,读请求发到从库,自动管理路由和连接,减少应用端逻辑。

传统做法是应用端自己判断走主库或从库,代码复杂且容易出错。

数据分片

ShardingSphere 重点做水平分片。

  • 水平分片:同一个表按照某个分片键(如 user_id、order_id)拆到多个物理表或库。
  • 垂直分片:按业务模块拆分到不同库,例如用户、订单、支付表放到不同库。

过程:

1.SQL解析

2.路由计算

根据分片规则决定应该访问哪些库、哪些表。

3.改写SQL:

sql 复制代码
SELECT * FROM t_order WHERE order_id = 123;

改写为

sql 复制代码
SELECT * FROM ds_1.t_order_3 WHERE order_id = 123;

(如果是多表分片,可能生成多个子 SQL 并行发出。)

4.结果归并

弹性伸缩

数据库直扩很麻烦,手动迁移容易出错且需要停机;希望对应用透明。

ShardingSphere 提供统一的伸缩工具和规则,让迁移自动化、可观测、不中断

ShardingSphere-Scaling 弹性伸缩过程:

  • 捕获增量数据
    用数据订阅(如 MySQL Binlog、PostgreSQL WAL)实时获取迁移过程中的新增/更新/删除。
  • 迁移全量数据
    先把老分片的存量数据同步到新分片。
  • 切换路由配置
    全量+增量同步完成后,更新 ShardingSphere 的分片规则,应用自动路由到新分库/分表。

过程对应用透明,应用只用一个逻辑库表名,不关心底层库表变化。

影子库压测

在生产环境做压测时,业务代码走的是真实链路,但 数据必须不要污染生产库。

ShardingSphere 做了一个"影子库路由":

  • 如果是压测流量 → SQL 自动路由到影子库(Shadow DB)。
  • 如果是正常流量 → 继续走生产库。

关键是要识别哪些 SQL 是压测流量,所以就有了 影子算法。

Hint 影子算法

Hint 在数据库里指的是 SQL 里的 注释式指令,例如 /*+ something */,可以携带一些控制信息。

ShardingSphere 借助这种能力,让应用在 SQL 或上下文中插入标记,来告诉路由逻辑:"这是压测流量"。

sql 复制代码
/* shadow:true */
INSERT INTO t_order (id, user_id, status) VALUES (1, 123, 'init');

分布式事务

CAP 定理

  • Consistency 一致性
  • Availability 可用性
  • Partition tolerance 分区容错

分布式系统必须在 C 与 A 之间权衡,P 是必须要支持的。

两阶段提交(2PC)

Two-Phase Commit

  • Prepare:协调者(Transaction Manager)向各参与者发送准备命令,每个参与者写入预提交日志并返回"可以提交/不可以提交"。

  • Commit/Rollback:如果全部准备成功,协调者发 commit,否则 rollback。

优点:实现简单,强一致性。

缺点:同步阻塞;协调者单点故障,性能差。

应用:XA 协议(eXtended Architecture接口标准。MySQL InnoDB、Oracle 都支持 XA)。

场景:

核心金融、支付、账户转账等需要强一致性的小型高价值事务。

数据量不大,但对一致性要求极高的系统。

柔性事务(BASE)

Basically Available(基本可用)

Soft state(软状态)

Eventually consistent(最终一致)

工业界很多系统都不是强一致,而是最终一致。

全局提交时先写日志再异步执行提交,如果部分失败可以根据日志进行恢复或补偿。

特点:

✅性能好:不会长时间持锁,不强制同步阻塞。

✅高可用:即使协调者或网络临时异常,也能恢复。

❌ 只保证最终一致,提交后短时间内各库状态可能不一致

场景:

电商下单、库存更新、用户积分、日志类数据。

对实时强一致要求不高,但必须保证数据最终收敛一致。


参考:

https://cloud.tencent.com/developer/article/2010830

相关推荐
JeffreyGu.2 小时前
clickhouse-backup备份
数据库·clickhouse
koping_wu2 小时前
【分布式】分布式事务方案:两阶段、TCC、SEATA
分布式
小王努力学编程2 小时前
brpc远程过程调用
linux·服务器·c++·分布式·rpc·protobuf·brpc
想你依然心痛2 小时前
Spark大数据分析与实战笔记(第五章 HBase分布式数据库-05)
数据库·分布式·spark
煎蛋学姐2 小时前
SSM宠物领养平台16e63(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·ssm·宠物·宠物领养·宠物种类·领养人
煎蛋学姐2 小时前
SSM宠物托运网站8m8iz(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·ssm·宠物·宠物百科·上门取件·收件人信息
Flash Dog3 小时前
【Redis原理】缓存的内部逻辑
数据库·redis·缓存
muren4 小时前
DuckDB客户端API之ADBC官方文档翻译
数据库·duckdb·adbc
zcz16071278214 小时前
从 ZooKeeper 到 ELK:分布式中间件与日志分析系统全解析
分布式·elk·zookeeper