ShardingSphere 是 Apache 下的一个开源分布式数据库中间件,提供了 分库分表、读写分离 和 数据治理 的统一解决方案。它支持透明化的数据库分片、动态扩展能力以及与原有应用程序的无缝集成。
ShardingSphere 核心模块
ShardingSphere 主要包括三个核心模块:
-
Sharding-JDBC:
- 类似于 JDBC 驱动,嵌入到应用程序中,与 ORM 框架(如 MyBatis、Hibernate)兼容。
- 提供数据库分片、读写分离等功能,适用于轻量级场景。
- 运行在 Java 应用程序内。
-
Sharding-Proxy:
- 独立部署的数据库代理,客户端通过标准 MySQL/PostgreSQL 协议与其通信。
- 提供统一入口,无需改动应用程序代码。
- 适用于多语言环境和集中式管理。
-
Sharding-Sidecar (Scaling) :
- Kubernetes 环境下的云原生数据库代理。
- 提供服务治理和流量分发功能。
ShardingSphere 的功能
1. 数据分片
-
水平分片:
- 将一张大表拆分成多张小表分布在不同的数据库中。
- 支持 范围分片(Range Sharding) 、哈希分片(Hash Sharding) 、复合分片 等策略。
-
分片策略:
- 标准分片:通过分片键的规则决定目标库和表。
- 绑定分片:对关联表采用相同分片规则,减少跨库 JOIN。
- 广播表:表数据全量复制到每个库,适合全局配置表。
2. 读写分离
- 配置主库和从库,自动将写请求路由到主库,读请求路由到从库。
- 支持多从库负载均衡(如轮询、权重分配)。
3. 分布式事务
- 支持两阶段提交(XA 事务)和柔性事务(最佳努力通知、TCC 模型)。
- 保证跨库操作的数据一致性。
4. 数据脱敏
- 提供敏感数据(如手机号、身份证号)的脱敏支持,提升数据安全性。
5. 动态扩展
- 允许动态添加或删除分片节点,支持在线扩展。
6. 数据治理
- 提供 SQL 解析、性能监控和限流能力,提升数据库治理能力。
ShardingSphere 配置示例
1. Sharding-JDBC 配置
示例:分库分表配置
sharding:
tables:
order:
actual-data-nodes: ds${0..1}.order_${0..3} # 数据分片规则
table-strategy:
standard:
sharding-column: order_id
sharding-algorithm-name: order-id-algorithm
order_item:
actual-data-nodes: ds${0..1}.order_item_${0..3}
table-strategy:
standard:
sharding-column: order_id
sharding-algorithm-name: order-id-algorithm
binding-tables:
- order, order_item # 绑定表配置
default-database-strategy:
standard:
sharding-column: user_id
sharding-algorithm-name: user-id-algorithm
sharding-algorithms:
order-id-algorithm:
type: INLINE
props:
algorithm-expression: order_${order_id % 4}
user-id-algorithm:
type: INLINE
props:
algorithm-expression: ds${user_id % 2}
解释:
-
actual-data-nodes:- 定义实际的数据节点。
ds${0..1}表示两库(ds0和ds1)。order_${0..3}表示每个库中包含 4 张表(order_0到order_3)。
-
table-strategy:- 定义表分片策略。
sharding-column:分片键(如order_id)。sharding-algorithm-name:指定分片算法。
例:根据
order_id % 4的值确定目标表,例如:
order_id = 5,分片结果:order_1order_id = 9,分片结果:order_3
sharding-algorithms:-
算法类型:
INLINE表示基于表达式进行分片计算。 -
算法表达式:
order_${order_id % 4}:确定表名。ds${user_id % 2}:确定库名。
-
支持的算法类型:
- INLINE:基于表达式计算。
- RANGE:基于范围分片。
- HASH:基于哈希算法分片。
- 自定义:实现
PreciseShardingAlgorithm或RangeShardingAlgorithm接口。
2. Sharding-Proxy 配置
配置主从读写分离
server.yaml:
authentication:
users:
root:
password: root
sharding:
password: sharding
authorizedSchemas: sharding_db
mode:
type: Standalone
repository:
type: Memory
props:
sql-show: true
query-with-cipher-column: true
config-sharding.yaml:
schemaName: sharding_db
dataSources:
master_ds:
url: jdbc:mysql://localhost:3306/master_db
username: root
password: root
type: com.zaxxer.hikari.HikariDataSource
slave_ds_0:
url: jdbc:mysql://localhost:3306/slave_db_0
username: root
password: root
type: com.zaxxer.hikari.HikariDataSource
slave_ds_1:
url: jdbc:mysql://localhost:3306/slave_db_1
username: root
password: root
type: com.zaxxer.hikari.HikariDataSource
rules:
- !SHARDING
tables:
t_order:
actualDataNodes: master_ds.t_order_${0..1}
tableStrategy:
standard:
shardingColumn: order_id
shardingAlgorithmName: t_order_inline
shardingAlgorithms:
t_order_inline:
type: INLINE
props:
algorithm-expression: t_order_${order_id % 2}
- !READWRITE_SPLITTING
dataSources:
readwrite_ds:
writeDataSourceName: master_ds
readDataSourceNames:
- slave_ds_0
- slave_ds_1
loadBalancerName: round_robin
loadBalancers:
round_robin:
type: ROUND_ROBIN
解析:
-
主数据源(
master_ds):用于写操作。- 指向
master_db数据库。
- 指向
-
从数据源(
slave_ds_0和slave_ds_1):用于读操作。- 指向
slave_db_0和slave_db_1数据库。
- 指向
-
数据源池类型:
- 配置了 HikariCP(高性能连接池)。
-
分片算法
t_order_inline:-
算法类型:
INLINE,基于表达式计算分片。 -
表达式:
t_order_${order_id % 2}。-
根据
order_id的值取模,确定目标表。例如:order_id = 1,落到t_order_1。order_id = 2,落到t_order_0。
-
-
-
逻辑数据源
readwrite_ds:-
writeDataSourceName:主库(master_ds)处理写操作。 -
readDataSourceNames:从库(slave_ds_0和slave_ds_1)处理读操作。 -
负载均衡器:
- 配置了
round_robin(轮询算法)用于分配读请求。
- 配置了
-
-
负载均衡策略:
-
类型:
ROUND_ROBIN,将读请求轮流分配给多个从库。 -
优点:
- 提升读操作的吞吐量。
- 减轻主库的压力。
-
ShardingSphere 的优势
-
透明化:
- 应用层无需感知底层数据库分片、读写分离等逻辑。
-
多种功能整合:
- 分库分表、读写分离、分布式事务一站式解决。
-
高性能:
- 采用轻量级架构,特别是 Sharding-JDBC 的性能接近原生数据库。
-
生态完善:
- 支持 MySQL、PostgreSQL 等主流数据库。
- 与 Kubernetes 等云原生技术集成良好。
ShardingSphere 与 MyCAT 对比
ShardingSphere 和 MyCAT 是两种常见的分布式数据库中间件解决方案,它们都能实现分库分表、读写分离等功能,但在架构设计、适用场景和社区活跃度等方面存在显著差异。
1. 项目背景
| 特性 | ShardingSphere | MyCAT |
|---|---|---|
| 开源组织 | Apache 基金会 | 国内社区发起(基于阿里的 Cobar 改进) |
| 最新动态 | 活跃,社区贡献者多,更新频繁 | 更新缓慢,社区活跃度逐年下降 |
| 成熟度 | 高,支持多种功能(分片、读写分离、分布式事务、数据治理等) | 功能较少,主要集中在分库分表和读写分离 |
2. 核心架构对比
| 特性 | ShardingSphere | MyCAT |
|---|---|---|
| 运行模式 | 多模式:Sharding-JDBC、Sharding-Proxy、Sharding-Sidecar | 独立代理模式(类似数据库代理) |
| 耦合性 | - Sharding-JDBC 嵌入应用程序,低耦合,高性能 - Sharding-Proxy 独立运行,支持多语言 | 独立运行,类似 MySQL Proxy,应用需通过其访问数据库 |
| 扩展性 | 支持云原生环境(如 Kubernetes 的 Sidecar 模式) | 静态配置扩展较复杂,动态扩展能力较弱 |
| 对数据库的支持 | 支持多种数据库(MySQL、PostgreSQL、Oracle、SQL Server 等) | 主要支持 MySQL |
| 功能丰富度 | 除分库分表、读写分离外,还支持分布式事务、数据脱敏、性能监控等 | 主要提供分库分表和读写分离功能 |
3. 功能对比
| 功能 | ShardingSphere | MyCAT |
|---|---|---|
| 分库分表 | 支持灵活的分片规则(标准分片、绑定表、广播表等),内置多种算法 | 提供简单的分片规则,扩展性有限 |
| 读写分离 | 内置多种读写分离策略,支持主从负载均衡 | 支持读写分离,但负载均衡策略有限 |
| 分布式事务 | 支持两阶段提交(XA)、柔性事务(TCC、最佳努力通知) | 不支持分布式事务 |
| 数据脱敏 | 支持脱敏规则(如掩码、替换等) | 不支持 |
| 动态扩展 | 支持在线扩容,自动路由 | 扩展能力较弱,需手动配置 |
| SQL 支持 | 支持完整的 SQL 功能(包括复杂查询、子查询、分页等) | 对复杂 SQL 支持较差,部分场景需要业务代码调整 |
| 多租户支持 | 支持 | 不支持 |
| 监控和治理 | 提供 SQL 跟踪、性能监控和限流功能 | 无专门的监控功能 |