基本介绍

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

适用场景

  1. 单表数据量超过 500 万
  2. 数据库成为系统性能瓶颈
  3. 需要水平扩展数据库能力
  4. 需要实现读写分离架构

最佳实践

1. 分片键选择

  • 选择高基数列作为分片键
  • 避免频繁更新的列作为分片键
  • 考虑业务查询模式

2. 分片策略优化

  • 避免数据倾斜
  • 预留扩容空间
  • 考虑热点数据问题

3. 事务处理

  • 尽量减少跨分片事务
  • 合理设置事务超时时间
  • 考虑使用最终一致性方案

Sharding-JDBC 与 Sharding-Proxy 对比

特性Sharding-ProxySharding-JDBC
部署方式独立进程Jar 包集成
协议支持MySQL/PGJDBC
性能中等
适用场景多语言/遗留系统Java 新项目
运维复杂度较高

注意事项

  1. 不支持跨库外键约束
  2. 分页查询性能可能下降
  3. 分布式事务性能开销较大
  4. 需要仔细设计分片策略