集成ShardingSphere
2025年4月21日大约 5 分钟
Apache ShardingSphere 是一款开源的关系型数据库中间件,提供分库分表、分布式事务、数据加密和弹性扩展等功能。通过 ShardingSphere,我们可以在不改变应用逻辑的情况下实现数据分片和微服务环境下的分布式数据治理。
本文将深入讲解如何在 Spring Boot 项目中集成 Apache ShardingSphere,包括配置步骤、基础使用和性能优化。
目录
1. 概述
Apache ShardingSphere 是针对关系型数据库的解决方案,主要用于分布式数据库管理,适合以下场景:
- 数据库垂直拆分与水平拆分(分库分表)
- 分布式事务处理
- 数据加密与脱敏
- 数据读写分离优化
- 提供弹性数据库扩展
ShardingSphere 提供三种模式:
- JDBC 模式:基于 JDBC 的轻量级 Java 客户端。
- 代理模式:作为独立数据库代理,提供支持多语言的能力。
- Sidecar(即将推出):用于云原生环境,提供资源隔离和弹性扩展。
2. 核心架构与概念
核心组件
- Sharding(分片):将数据逻辑上划分到多台物理数据库上。
- Read/Write Splitting(读写分离):主库负责写操作,从库负责读操作。
- Transaction(事务控制):支持分布式事务,包括 XA 事务和最佳事务(Best Effort Delivery)。
- Data Encrypt(数据加密):实现静态加密数据存储和动态解密查询。
- Governance(治理):提供集中式配置管理功能。
核心概念
- 逻辑表:应用层看到的表称为“逻辑表”,对用户透明。
- 分片键:用于控制数据如何分片的字段。
- 分片算法:通过自定义算法决定数据路由到具体的物理表和数据库。
- 元数据管理:集中式的配置管理和扩展能力。
3. 下载安装
Apache ShardingSphere 提供多种安装方式。以下是下载地址和安装步骤。
3.1 下载 ShardingSphere
官方地址:https://shardingsphere.apache.org/download/
3.2 安装步骤
通过 JDBC 模式集成
- 在 Spring Boot
pom.xml
中引入以下依赖:<dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId> <version>5.3.0</version> <!-- 请根据实际版本下载 --> </dependency>
通过 Proxy 模式集成
- 下载代理服务包(如
apache-shardingsphere-5.3.0-sharding-proxy-bin
)。 - 解压后,修改
conf/config-sharding.yaml
文件配置数据源和分片规则。 - 启动代理服务(参考运行配置部分)。
4. 运行配置
4.1 启动命令(Proxy 模式)
启动 Proxy 模式:
./bin/start.sh
停止服务:
./bin/stop.sh
重启 ShardingSphere Proxy 服务:
./bin/stop.sh && ./bin/start.sh
4.2 部署模式
单机部署
在单台服务器上运行 Proxy 服务:
- 配置一个逻辑数据源(单个数据库)。
- 启动 ShardingSphere Proxy。
集群部署
- 配置多个数据库作为数据源(水平扩展)。
dataSources: dataSource0: url: jdbc:mysql://db1:3306/demo_ds username: root password: root dataSource1: url: jdbc:mysql://db2:3306/demo_ds username: root password: root
- 使用 Nacos、Zookeeper 等作为注册中心同步元数据配置。
5. 基础操作
5.1 分库分表
在 application.yml
配置文件中定义分片规则:
spring:
shardingsphere:
rules:
sharding:
tables:
t_order:
actual-data-nodes: ds_${0..1}.t_order_${0..3}
table-strategy:
standard:
sharding-column: order_id
sharding-algorithm-name: table-inline
database-strategy:
standard:
sharding-column: user_id
sharding-algorithm-name: database-inline
sharding-algorithms:
table-inline:
type: INLINE
props:
algorithm-expression: t_order_${order_id % 4}
database-inline:
type: INLINE
props:
algorithm-expression: ds_${user_id % 2}
5.2 读写分离
为主从架构配置读写分离规则:
spring:
shardingsphere:
rules:
readwrite-splitting:
data-sources:
ds:
write-data-source-name: primary_ds
read-data-source-names:
- replica_ds1
- replica_ds2
load-balancer-name: round-robin
load-balancers:
round-robin:
type: ROUND_ROBIN
6. 高级功能
6.1 数据加密
可配置字段自动加密,在代码中透明解密:
spring:
shardingsphere:
rules:
encrypt:
tables:
t_user:
columns:
password:
plain-column: password
cipher-column: password_encrypted
encrypt-algorithm-name: aes
encrypt-algorithms:
aes:
type: AES
props:
key: your-secret-key
6.2 分布式事务
启用 XA 分布式事务:
spring:
shardingsphere:
rules:
transaction:
type: XA
编写事务代码:
@Transactional
public void updateTwoTables() {
// Perform operations across two or more logical databases
}
7. 性能调优
连接池优化:
- 使用 HikariCP 替代默认连接池。
- 配置连接池大小:
spring.datasource.hikari.maximum-pool-size: 50
分片算法优化:
自定义高效的分片算法以提升路由性能。慢查询分析:
启用 SQL 日志审计,分析慢 SQL 并优化:spring.shardingsphere.props.sql-show: true
8. 常见使用场景
- 分布式订单系统:电商平台订单数据分库分表。
- 高并发日志存储:分库提高写入效率。
- 读写分离的企业级应用:优化数据库性能。
- 数据安全与加密:保护用户隐私数据。
9. 常见问题
9.1 数据不均匀的问题
- 检查分片算法是否合理(如分片键选择,哈希算法分布是否均匀)。
9.2 查询性能较低
- 避免复杂的跨分片查询。
- 缓存热点数据,减少频繁访问。
9.3 数据源连接失败
- 确保数据源配置正确,数据库实例都已启动。
10. 总结
Apache ShardingSphere 是一款功能强大的数据库中间件,它通过分布式数据库治理大幅提升了现有数据库的扩展能力和适应性。通过与 Spring Boot 集成,开发者可以快速实现分库分表、读写分离、数据加密、分布式事务等企业级数据库解决方案。
合理的架构设计和分片策略可以帮助应用在高并发和大数据场景下保持高效运行,是构建微服务数据层的重要工具。