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 一致,两者复用同一内核。
notion image
ShardingSphere-Proxy 既然对应用无侵入,而且两者复用同一内核,那为什么大家还要用 ShardingSphere-JDBC 呢?
  1. 应用通过 ShardingSphere-JDBC 是直接操作数据库,相当于只有一次网络 IO;而应用连接 ShardingSphere-Proxy 是一次网络 IO,ShardingSphere-Proxy 再操作数据库,又会发生一次网络 IO;
  1. 应用调用链路多了一层,容易形成流量瓶颈,对应用增加了潜在的风险;一般来说,应用程序会搭配 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_idcreate_time 两个分片键确认分库分表),支持包含 ><INBETWEENAND 等操作符的 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.html
1、自定义 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使用

 
领域驱动(DDD)简介Feign调用原理及源码深度解析
Loading...