当前位置: 首页 > backend >正文

Java-114 深入浅出 MySQL 开源分布式中间件 ShardingSphere 深度解读

点一下关注吧!!!非常感谢!!持续更新!!!

🚀 AI篇持续更新中!(长期更新)

AI炼丹日志-31- 千呼万唤始出来 GPT-5 发布!“快的模型 + 深度思考模型 + 实时路由”,持续打造实用AI工具指南!📐🤖

💻 Java篇正式开启!(300篇)

目前2025年09月01日更新到:
Java-113 深入浅出 MySQL 扩容全攻略:触发条件、迁移方案与性能优化
MyBatis 已完结,Spring 已完结,Nginx已完结,Tomcat已完结,分布式服务正在更新!深入浅出助你打牢基础!

📊 大数据板块已完成多项干货更新(300篇):

包括 Hadoop、Hive、Kafka、Flink、ClickHouse、Elasticsearch 等二十余项核心组件,覆盖离线+实时数仓全栈!
大数据-278 Spark MLib - 基础介绍 机器学习算法 梯度提升树 GBDT案例 详解

请添加图片描述

基本介绍

Apache ShardingSphere 是一款开源的分布式数据库中间件组成的生态圈,旨在为关系型数据库提供分布式能力的增强解决方案。它采用插件化架构设计,可以无缝对接各类业务系统,帮助企业应对海量数据存储和高并发访问的挑战。

ShardingSphere 生态系统由三个独立的产品组件构成:

  1. Sharding-JDBC
    定位为轻量级 Java 框架,以 JDBC 驱动形式提供服务。它直接在应用的 JDBC 层实现数据分片、读写分离等能力,无需额外部署,具有性能损耗低、接入简单等特点。适用于 Java 应用开发,支持 Spring Boot、MyBatis 等主流框架集成。

  2. Sharding-Proxy
    提供透明化的数据库代理服务,以独立进程方式运行。Proxy 支持 MySQL/PostgreSQL 协议,使得任何兼容这些协议的客户端工具(如 Navicat、Workbench)都能直接连接使用。它特别适合需要对数据库操作进行统一管控的场景,如多租户SaaS系统。

  3. Sharding-Sidecar
    作为云原生环境下的解决方案,以 Sidecar 模式部署在服务网格中。它结合 Service Mesh 技术,为微服务架构提供数据库治理能力,包括流量控制、熔断降级等特性,适用于 Kubernetes 等容器化环境。

这三个产品既可独立使用,也可混合部署形成完整解决方案。例如在微服务架构中,可以组合使用 Sharding-JDBC 处理应用层分片,同时通过 Sharding-Proxy 提供统一的SQL审计功能。项目采用 Apache 2.0 开源协议,已在国内多家大型互联网公司(如京东、美团)的生产环境中得到验证。

项目状态

SharingSphere 项目状态如下:
在这里插入图片描述

ShardingSphere 是一个开源的分布式数据库中间件生态系统,其核心定位是作为关系型数据库的增强层,而非替代品。它专注于在分布式场景下最大化利用传统关系型数据库(如 MySQL、PostgreSQL、Oracle 等)的固有能力,通过中间件的方式提供水平扩展方案。

具体而言,ShardingSphere 通过以下方式实现其定位:

  1. 计算能力增强:提供 SQL 路由、重写、执行结果归并等分布式计算功能
  2. 存储能力扩展:支持数据分片(Sharding)机制,将数据分散存储在多个数据库节点
  3. 分布式事务支持:在保持原有数据库事务特性的基础上,提供跨库事务能力
  4. 兼容性保证:完全兼容原生 SQL 语法,支持主流数据库协议(如 JDBC)

典型应用场景包括:

  • 电商平台的订单库水平拆分
  • 金融系统的账户数据分片存储
  • 物联网海量设备数据的分布式存储

与 NewSQL 数据库不同,ShardingSphere 不重新实现存储引擎和查询引擎,而是通过对现有数据库的"增强"来获得分布式能力,这使得用户既可以利用已有数据库的成熟功能,又能获得分布式系统所需的扩展性。

在这里插入图片描述
● Sharding-JDBC:被定位为轻量级的Java框架,在Java的JDBC层提供的额外服务,以Jar包形式使用。它通过重写JDBC规范实现了数据库分片、读写分离、分布式事务等功能,开发者只需引入依赖即可快速集成。例如在Spring Boot项目中,仅需配置数据源规则和分片策略就能实现水平分表。其优势在于无中心化架构,兼容所有基于JDBC的ORM框架如MyBatis、Hibernate等。

● Sharding-Proxy:被定位为透明化的数据库代理端,提供封装了数据库二进制协议的服务端版本,用于完成对异构语言的支持。它模拟MySQL/PostgreSQL协议,任何兼容这些协议的客户端(如PHP、Python、Go等应用)都可以直接连接。典型部署场景包括:为遗留系统提供分片能力而无需改造代码,或在混合技术栈的微服务架构中统一数据访问层。支持通过Admin UI进行动态配置管理,相比JDBC版本更便于运维监控。

● Sharding-SideCar:被定位为Kubernetes或Mesos的云原生数据库代理,以DaemonSet形式运行在每个计算节点上,自动代理所有对数据库的访问。其设计遵循Service Mesh模式,通过sidecar容器与服务实例共同调度,实现流量拦截、SQL路由、熔断等治理能力。特别适合在容器化环境中为无状态服务提供透明的数据库接入,例如在K8s集群中自动为Deployment注入分片能力,同时与Istio等服务网格方案深度集成。

在这里插入图片描述
Sharding-JDBC、Sharding-Proxy、Sharding-SideCar 三者的区别如下:
在这里插入图片描述

ShardingSphere 的访问地址:
https://shardingsphere.apache.org/document/current/cn/downloads/

在这里插入图片描述

Sharding-JDBC

概述

Sharding-JDBC 是 Apache ShardingSphere 项目下的一个轻量级 Java 框架,提供了数据库分片(Sharding)、读写分离、分布式事务等功能。它通过 JDBC 层对应用程序透明地实现了数据库的水平扩展能力,无需修改业务代码即可实现数据分片。

核心特性

1. 分库分表

Sharding-JDBC 支持多种分片策略:

  • 精确分片(=,IN)
  • 范围分片(BETWEEN)
  • 复合分片(多个条件组合)
  • 强制路由(Hint)

示例场景:订单表按用户ID分片,用户ID为奇数的订单存储在db0,偶数的存储在db1。

2. 读写分离

支持一主多从的读写分离架构:

  • 自动路由写操作到主库
  • 读操作根据负载均衡策略分配到从库
  • 支持权重负载均衡和轮询负载均衡

3. 分布式事务

提供多种分布式事务解决方案:

  • XA强一致性事务
  • SAGA柔性事务
  • 本地事务(适用于非跨库操作)

配置方式

1. Java API配置

// 创建数据分片规则配置
ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration();// 配置分表规则
TableRuleConfiguration orderTableRuleConfig = new TableRuleConfiguration("t_order", "ds${0..1}.t_order${0..1}");
shardingRuleConfig.getTableRuleConfigs().add(orderTableRuleConfig);// 配置分片算法
StandardShardingStrategyConfiguration shardingStrategy = new StandardShardingStrategyConfiguration("user_id", new PreciseShardingAlgorithm() {...});
orderTableRuleConfig.setTableShardingStrategyConfig(shardingStrategy);// 创建数据源
DataSource dataSource = ShardingDataSourceFactory.createDataSource(createDataSourceMap(), shardingRuleConfig, new Properties());

2. YAML配置

dataSources:ds0: !!com.zaxxer.hikari.HikariDataSourcedriverClassName: com.mysql.jdbc.DriverjdbcUrl: jdbc:mysql://localhost:3306/ds0username: rootpassword: ds1: !!com.zaxxer.hikari.HikariDataSourcedriverClassName: com.mysql.jdbc.DriverjdbcUrl: jdbc:mysql://localhost:3306/ds1username: rootpassword: shardingRule:tables:t_order:actualDataNodes: ds${0..1}.t_order${0..1}tableStrategy:standard:shardingColumn: user_idpreciseAlgorithmClassName: com.example.MyPreciseShardingAlgorithm

最佳实践

  1. 分片键选择

    • 选择高基数列作为分片键
    • 避免频繁更新的列作为分片键
    • 考虑业务查询模式
  2. 分片策略优化

    • 避免数据倾斜
    • 预留扩容空间
    • 考虑热点数据问题
  3. 事务处理

    • 尽量减少跨分片事务
    • 合理设置事务超时时间
    • 考虑使用最终一致性方案

性能调优

  1. 连接池配置

    • 合理设置最大连接数
    • 配置连接存活时间
    • 启用连接泄漏检测
  2. SQL优化

    • 避免全表扫描
    • 减少跨库JOIN
    • 使用绑定变量
  3. 监控指标

    • SQL执行时间
    • 连接池使用情况
    • 分片命中率

适用场景

  1. 单表数据量超过500万
  2. 数据库成为系统性能瓶颈
  3. 需要水平扩展数据库能力
  4. 需要实现读写分离架构

限制与注意事项

  1. 不支持跨库外键约束
  2. 分页查询性能可能下降
  3. 分布式事务性能开销较大
  4. 需要仔细设计分片策略

Sharding-Proxy 是 Apache ShardingSphere 生态中的一个独立组件,它定位为透明化的数据库代理,通过代理层对数据库进行分片、读写分离等操作,对应用程序完全透明。

核心功能

  1. SQL 解析与路由

    • 支持标准 SQL 语法解析
    • 根据配置的分片规则自动路由到正确的数据节点
    • 例如:SELECT * FROM t_order WHERE user_id = 100 会被路由到 user_id 分片为 100 的节点
  2. 分布式事务支持

    • 提供 XA 分布式事务
    • 支持柔性事务(Saga)
    • 可配置的事务隔离级别
  3. 读写分离

    • 自动将写操作路由到主库
    • 读操作可配置负载均衡策略
    • 支持基于 Hint 的强制主库路由
  4. 数据加密

    • 透明化字段级加密
    • 支持多种加密算法
    • 加密字段在数据库中存储为密文

架构设计

Sharding-Proxy 采用模块化设计:

  • 前端(Frontend)实现 MySQL/PostgreSQL 协议
  • 核心模块处理 SQL 解析、路由和改写
  • 后端(Backend)与真实数据库交互
SQL
Valid
Invalid
Client
Sharding-Proxy
SQL Parser
SQL Router
Error Response
SQL Rewriter
Execute Engine
Database 1
Database 2
Database N

典型应用场景

  1. 数据库水平扩展

    • 单表数据量超过 500 万时
    • 需要线性扩展写能力
    • 示例:电商订单表按用户 ID 分片
  2. 多租户 SaaS 系统

    • 每个租户数据独立存储
    • 共享同一套应用代码
    • 通过分片键自动路由
  3. 合规性要求高的系统

    • 需要字段级加密
    • 审计日志要求
    • 例如金融行业的客户信息表

性能优化建议

  1. 连接池配置

    • 建议最大连接数不超过 500
    • 空闲连接超时设置为 5-10 分钟
    • 使用连接预热
  2. SQL 改写优化

    • 避免全表扫描的改写
    • 优先使用分片键查询
    • 批处理操作合并
  3. 缓存策略

    • 元数据缓存 5-10 分钟
    • 路由结果缓存
    • 查询结果缓存(对实时性要求不高的场景)

与 Sharding-JDBC 对比

特性Sharding-ProxySharding-JDBC
部署方式独立进程Jar 包集成
协议支持MySQL/PGJDBC
性能中等
适用场景多语言/遗留系统Java 新项目
运维复杂度较高

版本兼容性

当前稳定版本 5.3.2 支持:

  • MySQL 5.7/8.0
  • PostgreSQL 9.6+
  • OpenJDK 8/11/17
  • 建议生产环境使用 CentOS 7+ 或同等 Linux 发行版

注意:Sharding-Proxy 5.x 版本配置与 4.x 不兼容,升级需谨慎。

概述

Sharding-SideCar 是一种数据库中间件架构模式,它通过独立的代理服务(SideCar)来实现数据库分片(Sharding)功能。这种架构将分片逻辑从应用层解耦出来,使应用程序无需关心底层数据分布细节。

核心特点

  1. 透明化分片

    • 应用程序像访问单库一样访问数据库集群
    • 所有分片路由、SQL改写、结果归并等操作由SideCar代理完成
    • 支持JDBC协议,兼容大多数ORM框架
  2. 独立部署

    • 作为独立进程运行,与应用服务隔离
    • 可采用容器化部署方式(如Docker)
    • 支持横向扩展以应对高并发场景
  3. 功能丰富

    • 完整的分片功能(库分片、表分片)
    • 分布式事务支持(XA、SAGA等)
    • 读写分离、数据加密等增强功能

典型架构

[Application] │▼
[Sharding-SideCar] ←→ [Registry Center]│├─→ [Database Shard 1]├─→ [Database Shard 2]└─→ [Database Shard N]

组件说明:

  • Registry Center:存储分片规则和拓扑信息(常用Zookeeper/Etcd)
  • Sharding-SideCar:执行实际的分片操作,通常以集群方式部署
  • Database Shards:物理数据库节点,可以是主从架构

实现方案

1. 开源实现

  • ShardingSphere-Proxy:Apache顶级项目,功能完善

    • 支持MySQL/PostgreSQL协议
    • 提供Admin控制台
    • 完善的监控指标
  • Vitess:CNCF毕业项目,针对大规模场景

    • 原生支持K8s部署
    • 内置VTTablet管理组件
    • 特别适合云原生环境

2. 云服务商方案

  • AWS RDS Proxy:托管式数据库代理服务
  • 阿里云PolarDB-Proxy:针对PolarDB优化的代理层
  • 腾讯云TDSQL-C:分布式数据库的代理组件

配置示例(YAML格式)

# 数据源配置
dataSources:ds_0:url: jdbc:mysql://db-host-0:3306/dbusername: rootpassword: 123456ds_1:url: jdbc:mysql://db-host-1:3306/dbusername: rootpassword: 123456# 分片规则
rules:
- !SHARDINGtables:t_order:actualDataNodes: ds_${0..1}.t_order_${0..15}databaseStrategy:standard:shardingColumn: user_idpreciseAlgorithmClassName: com.example.HashMod2AlgorithmtableStrategy:standard:shardingColumn: order_idpreciseAlgorithmClassName: com.example.HashMod16Algorithm

性能优化建议

  1. 连接池配置

    • 合理设置最大连接数(建议100-500)
    • 启用连接复用(如HikariCP的connectionTestQuery)
    • 监控连接泄漏情况
  2. 缓存策略

    • 启用SQL解析缓存(建议大小1000-5000)
    • 对热点查询配置结果缓存
    • 考虑本地缓存与Redis多级缓存
  3. 批量操作

    • 使用批量插入代替单条插入
    • 对于大批量操作考虑分批次执行
    • 启用批量操作的并行执行

适用场景

  1. 传统架构改造

    • 单库性能达到瓶颈
    • 需要平滑迁移到分片架构
    • 不能修改应用代码的情况
  2. 微服务环境

    • 多语言服务需要统一数据访问层
    • 服务网格(Service Mesh)架构
    • K8s环境下的SideCar模式部署
  3. 云迁移项目

    • 上云过程中的数据库架构调整
    • 混合云场景的统一数据访问
    • 需要数据库层弹性的场景

监控指标

  1. 基础指标

    • QPS/TPS
    • 平均响应时间
    • 错误率
  2. 资源指标

    • CPU/Memory使用率
    • 网络IO
    • 连接数统计
  3. 业务指标

    • 分片均衡度
    • 热点分片检测
    • 慢查询统计

演进路线

  1. 初级阶段

    • 单节点部署
    • 静态分片规则
    • 基础监控
  2. 中级阶段

    • 集群化部署
    • 动态规则配置
    • 完善的高可用机制
  3. 高级阶段

    • 弹性伸缩能力
    • 智能化路由
    • 与Service Mesh深度集成

注意事项

  1. 分布式事务

    • 评估业务对一致性的要求
    • XA协议可能影响性能
    • 考虑最终一致性方案
  2. 跨分片查询

    • 避免多表JOIN
    • 大数据量查询可能内存溢出
    • 考虑使用Elasticsearch等辅助查询
  3. 扩容挑战

    • 分片数变更需要数据迁移
    • 评估扩容过程中的服务影响
    • 制定完善的迁移方案
http://www.xdnf.cn/news/19563.html

相关文章:

  • Linux 文本处理实战手册
  • 销售事业十年规划,并附上一套能帮助销售成长的「软件工具组合」
  • 爬虫实战练习
  • C 基础(1) - 初识C语言
  • 2025年数字化转型关键证书分析与选择指南
  • compile_commands.json 文件详解
  • Linux基础2
  • (3dnr)多帧视频图像去噪 (一)
  • GDAL 简介
  • C++ multiset数据结构的使用情况说明
  • 基于单片机智能饮水机/智能热水壶
  • 正式发布!2025AI SEO公司哪家专业?
  • 【数据分享】多份土地利用矢量shp数据分享-澳门
  • C# FlaUI win 自动化框架,介绍
  • 员工自愿放弃社保,企业给补贴合法吗?
  • Vue3 中 Proxy 在组件封装中的妙用
  • Windows 使用 Compass 访问MongoDb
  • 【HarmonyOS】一步解决弹框集成-快速弹框QuickDialog使用详解
  • 笔记:现代操作系统:原理与实现(1)
  • 卷积神经网络中的两个重要概念——感受野receptive filed和损失函数loss function
  • 【Element Plus `el-select` 下拉菜单响应式定位问题深度解析】
  • 刘洋洋《一笔相思绘红妆》上线,献给当代痴心人的一封情书
  • CUDA编程11 - CUDA异步执行介绍
  • Java 不支持在非静态内部类中声明静态 Static declarations in inner classes are not supported异常处理
  • elasticsearch中文分词器analysis-ik使用
  • Uniapp 生命周期详解:页面生命周期 vs 应用生命周期(附实战示例)
  • 大模型应用开发面试实录:LLM原理、RAG工程与多Agent场景化落地解析
  • gh-pages部署github page项目
  • DAY 20 奇异值SVD分解-2025.9.1
  • 计组(2)CPU与指令