ShardingSphere

返回分布式

Apache ShardingSphere 是分布式数据库生态系统,提供数据分片、读写分离、分布式事务、数据加密等能力。

主要产品:

  • ShardingSphere-JDBC:客户端分片,以 jar 包嵌入应用,无需额外部署
  • ShardingSphere-Proxy:代理端分片,对应用透明,支持任何语言连接

核心功能

功能说明
数据分片水平拆分,将数据分散到多个库/表
读写分离写主库,读从库,降低主库压力
分布式事务支持 XA、Seata AT 模式
数据加密对敏感字段透明加密存储
影子库生产流量复制到测试库,用于压测

分片核心概念

概念说明
逻辑表应用操作的表名,如 order
真实表实际存储的表,如 order_0order_1
数据源实际的数据库连接,如 ds_0ds_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 实战