基本介绍
Apache 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 支持多种分片策略:
- 精确分片(=,IN)
- 范围分片(BETWEEN)
- 复合分片(多个条件组合)
- 强制路由(Hint)
读写分离
支持一主多从的读写分离架构:
- 自动路由写操作到主库
- 读操作根据负载均衡策略分配到从库
- 支持权重负载均衡和轮询负载均衡
分布式事务
提供多种分布式事务解决方案:
- XA 强一致性事务
- SAGA 柔性事务
- 本地事务(适用于非跨库操作)
配置示例(YAML格式)
dataSources:
ds0: !!com.zaxxer.hikari.HikariDataSource
driverClassName: com.mysql.jdbc.Driver
jdbcUrl: jdbc:mysql://localhost:3306/ds0
username: root
password:
ds1: !!com.zaxxer.hikari.HikariDataSource
driverClassName: com.mysql.jdbc.Driver
jdbcUrl: jdbc:mysql://localhost:3306/ds1
username: root
password:
shardingRule:
tables:
t_order:
actualDataNodes: ds${0..1}.t_order${0..1}
tableStrategy:
standard:
shardingColumn: user_id
preciseAlgorithmClassName: com.example.MyPreciseShardingAlgorithm
适用场景
- 单表数据量超过 500 万
- 数据库成为系统性能瓶颈
- 需要水平扩展数据库能力
- 需要实现读写分离架构
最佳实践
1. 分片键选择
- 选择高基数列作为分片键
- 避免频繁更新的列作为分片键
- 考虑业务查询模式
2. 分片策略优化
- 避免数据倾斜
- 预留扩容空间
- 考虑热点数据问题
3. 事务处理
- 尽量减少跨分片事务
- 合理设置事务超时时间
- 考虑使用最终一致性方案
Sharding-JDBC 与 Sharding-Proxy 对比
| 特性 | Sharding-Proxy | Sharding-JDBC |
|---|---|---|
| 部署方式 | 独立进程 | Jar 包集成 |
| 协议支持 | MySQL/PG | JDBC |
| 性能 | 中等 | 高 |
| 适用场景 | 多语言/遗留系统 | Java 新项目 |
| 运维复杂度 | 较高 | 低 |
注意事项
- 不支持跨库外键约束
- 分页查询性能可能下降
- 分布式事务性能开销较大
- 需要仔细设计分片策略