ShardingSphere
→ 返回分布式
Apache ShardingSphere 是分布式数据库生态系统,提供数据分片、读写分离、分布式事务、数据加密等能力。
主要产品:
- ShardingSphere-JDBC:客户端分片,以 jar 包嵌入应用,无需额外部署
- ShardingSphere-Proxy:代理端分片,对应用透明,支持任何语言连接
核心功能
| 功能 | 说明 |
|---|
| 数据分片 | 水平拆分,将数据分散到多个库/表 |
| 读写分离 | 写主库,读从库,降低主库压力 |
| 分布式事务 | 支持 XA、Seata AT 模式 |
| 数据加密 | 对敏感字段透明加密存储 |
| 影子库 | 生产流量复制到测试库,用于压测 |
分片核心概念
| 概念 | 说明 |
|---|
| 逻辑表 | 应用操作的表名,如 order |
| 真实表 | 实际存储的表,如 order_0、order_1 |
| 数据源 | 实际的数据库连接,如 ds_0、ds_1 |
| 分片键 | 用于路由的字段,如 user_id |
| 分片算法 | 决定数据路由到哪个库/表 |
常用分片算法
| 算法 | 说明 |
|---|
| MOD(取模) | sharding_key % 分片数 |
| HASH_MOD | 对非数值字段哈希后取模 |
| RANGE | 按值范围路由 |
| 自定义 | 实现 StandardShardingAlgorithm |
YAML 配置示例(JDBC 模式)
dataSources:
ds_0:
dataSourceClassName: com.zaxxer.hikari.HikariDataSource
jdbcUrl: jdbc:mysql://localhost:3306/db_0
username: root
password: 123456
ds_1:
dataSourceClassName: com.zaxxer.hikari.HikariDataSource
jdbcUrl: jdbc:mysql://localhost:3306/db_1
username: root
password: 123456
rules:
- !SHARDING
tables:
order:
actualDataNodes: ds_${0..1}.order_${0..1} # 2库 × 2表
databaseStrategy:
standard:
shardingColumn: user_id
shardingAlgorithmName: db_mod
tableStrategy:
standard:
shardingColumn: order_id
shardingAlgorithmName: table_mod
shardingAlgorithms:
db_mod:
type: MOD
props:
sharding-count: 2
table_mod:
type: MOD
props:
sharding-count: 2
读写分离配置
rules:
- !READWRITE_SPLITTING
dataSources:
rw_ds:
writeDataSourceName: master
readDataSourceNames:
- slave_0
- slave_1
loadBalancerName: round_robin
loadBalancers:
round_robin:
type: ROUND_ROBIN
Spring Boot 集成
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>shardingsphere-jdbc</artifactId>
<version>5.4.1</version>
</dependency>
spring:
datasource:
driver-class-name: org.apache.shardingsphere.driver.ShardingSphereDriver
url: jdbc:shardingsphere:classpath:sharding.yaml
分布式事务
| 模式 | 说明 |
|---|
| LOCAL | 本地事务,不支持跨库 |
| XA | 两阶段提交,强一致性,性能较低 |
| BASE | 柔性事务,集成 Seata AT 模式 |
@ShardingTransactionType(TransactionType.BASE)
@Transactional
public void placeOrder() { ... }
→ 查看 Seata 分布式事务
注意事项
- 避免全表扫描:查询尽量带分片键,否则会广播到所有分片
- 分片键选择:选择区分度高、查询频繁的字段
- 提前规划分片数:扩容需要数据迁移,成本高
- SQL 限制:部分跨库 JOIN、子查询有限制,需改写
相关文档
Spring Cloud 实战