type
status
date
slug
summary
tags
category
icon
password
1、ShardingSphere简介
ShardingSphere 是一款开源的分布式数据库中间件,由 Apache 软件基金会孵化。它提供了一系列强大的数据分片、分布式事务和数据库治理功能。
ShardingSphere 包含以下组件:
- ShardingSphere-JDBC:一个轻量级的 Java 框架,以 jar 包形式提供,直接集成在应用中,在 JDBC 层提供数据分片、读写分离、分布式事务等功能。
- ShardingSphere-Proxy:透明化的数据库代理端,是一个独立运行的进程,从客户端程序连接来说,它和 MySQL 数据库没有什么区别。
- ShardingSphere-Sidecar(规划中):面向云原生的数据库治理组件。
ShardingSphere-Proxy 和 ShardingSphere-JDBC 的区别
ㅤ | ShardingSphere-JDBC | ShardingSphere-Proxy |
数据库 | 任意 | 基于 MySQL / PostgreSQL 协议的数据库 |
连接消耗数 | 高 | 低 |
异构语言 | 支持 Java 等基于 JVM 语言 | 任意 |
性能 | 损耗低 | 损耗略高 |
无中心化 | 是 | 否 |
静态入口 | 无 | 有 |
- ShardingSphere-JDBC 是一个 Jar 包,底层通过重写 JDBC 组件完成 SQL 解析、路由、改写、执行等流程;需要在项目中添加对应功能的配置文件,对应用有一定侵入性;
- ShardingSphere-Proxy 是一个进程服务,大部分情况下定位为辅助开发运维的效率工具。它将自己伪装为数据库,应用对接后对代码是无侵入的;对 SQL 的执行逻辑同 ShardingSphere-JDBC 一致,两者复用同一内核。

ShardingSphere-Proxy 既然对应用无侵入,而且两者复用同一内核,那为什么大家还要用 ShardingSphere-JDBC 呢?
- 应用通过 ShardingSphere-JDBC 是直接操作数据库,相当于只有一次网络 IO;而应用连接 ShardingSphere-Proxy 是一次网络 IO,ShardingSphere-Proxy 再操作数据库,又会发生一次网络 IO;
- 应用调用链路多了一层,容易形成流量瓶颈,对应用增加了潜在的风险;一般来说,应用程序会搭配 ShardingSphere-JDBC 使用。
ShardingSphere-JDBC 和 ShardingSphere-Proxy 技术选型
- ShardingSphere-JDBC 适用的场景:Java 项目,对性能要求高,希望有一套轻量级解决方案,降低运维成本。
- ShardingSphere-Proxy 适用的场景:支持异构语言(非 Java 语言),对应用完全透明(无需修改应用代码),更好数据库治理和运维能力。
在实际应用中,两者也可以混合部署使用,以获得更好的灵活性和性能。
2、ShardingSphere-JDBC使用
本文示例基于 ShardingSphere 5.2.1 版本。ShardingSphere 5.X 和 4.X 版本配置差异较大,注意所使用的版本。
ShardingSphere-JDBC 常用的功能
- 数据分片(分库分表)
- 读写分离
- 分布式事务(结合Seata)
第一步,引入核心依赖
其他数据库相关的依赖,按需引入
第二步,配置
application.yml
。2.1 数据分片功能
1、配置
application-sharding.yml
2、在
application.yml
里面激活。2.2 数据分片算法
可以通过下面的方式定义数据分片算法:
分片算法类型(type)有三种类型:
INLINE
:结合 Groovy 表达式,直接在配置中编写分片逻辑表达式,无需单独定义分片算法类,可以实现简单的分片策略(仅支持 SQL 的分片键使用=
和IN
操作符)。
CLASS_BASED
:用户自定义分片算法类,算法类需要实现特定的接口,接口分为三种分片策略类型:STANDARD
:标准路由策略,需要实现StandardShardingAlgorithm<T>
接口,适用于单一分片键场景,可以实现精准分片(SQL 的分片键使用IN
、=
等操作符)和范围分片(SQL 的分片键使用>
、≥
、<
、≤
等范围操作符)。COMPLEX
:复杂路由策略,需要实现ComplexKeysShardingAlgorithm<T>
接口,适用于复杂的多分片键场景(比如需要同时使用user_id
和create_time
两个分片键确认分库分表),支持包含>
、≥
、<
、≤
、IN
、BETWEEN
和AND
等操作符的 SQL。HINT
:强制路由策略,需要实现HintShardingAlgorithm<T>
接口,适用于 SQL 里面没有分片键的场景,可以自由定制分库分表逻辑。
- 用户自定义类型:和
CLASS_BASED
类似,区别在于CLASS_BASED
是在配置文件里面指定用户自定义的算法类名,而用户自定义类型是基于 SPI 机制 加载用户自定义的算法类。
2.2.1 INLINE
类型
无需编写算法类,直接在
application.yml
配置2.2.2 CLASS_BASED
类型
以标准类型
STANDARD
为例,其他类型参考 https://www.51cto.com/article/785078.html1、自定义
CustomShardingAlgorithm
算法类,实现 StandardShardingAlgorithm<T>
接口,需要实现两个核心 doSharding()
方法:doSharding(availableTargetNames,preciseShardingValue)
:精准分片算法,处理含有 = 、in 等操作符的 SQL。
doSharding(availableTargetNames,rangeShardingValue)
:范围分片算法,处理含有 >、<、between and 等操作符的 SQL
2、配置
application.yml
2.2.3 用户自定义类型
用户自定义类型基于 SPI 机制加载用户自定义的算法类,下面步骤可以实现和上面
CLASS_BASED
类型算法相同的效果。还是以 CustomShardingAlgorithm
算法类为例1、在 resources 目录下,创建
META-INF/services
文件夹,新建文件 org.apache.shardingsphere.sharding.spi.ShardingAlgorithm
,写入以下内容(注意一定要按照以上步骤执行,才能通过 Java 的 SPI 机制加载我们自定义的算法类)。2、
CustomShardingAlgorithm
类重载 getType()
方法。3、配置
application.yml
2.3 读写分离功能
1、配置
application-readwrite-splitting.yml
。2、在
applicaiton.yml
里面激活3、ShardingSphere-Proxy使用
- Author:mcbilla
- URL:http://mcbilla.com/article/1ee85c7d-7c1d-8052-92d5-e385d966bd74
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!