开发需要了解的知识:ShardingSphere

1,276 阅读6分钟

ShardingSphere 是 Apache 下的一个开源分布式数据库中间件,提供了 分库分表读写分离数据治理 的统一解决方案。它支持透明化的数据库分片、动态扩展能力以及与原有应用程序的无缝集成。


ShardingSphere 核心模块

ShardingSphere 主要包括三个核心模块:

  1. Sharding-JDBC

    • 类似于 JDBC 驱动,嵌入到应用程序中,与 ORM 框架(如 MyBatis、Hibernate)兼容。
    • 提供数据库分片、读写分离等功能,适用于轻量级场景。
    • 运行在 Java 应用程序内
  2. Sharding-Proxy

    • 独立部署的数据库代理,客户端通过标准 MySQL/PostgreSQL 协议与其通信。
    • 提供统一入口,无需改动应用程序代码。
    • 适用于多语言环境和集中式管理。
  3. 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} 表示两库(ds0ds1)。
    • order_${0..3} 表示每个库中包含 4 张表(order_0order_3)。
  • table-strategy

    • 定义表分片策略。
    • sharding-column:分片键(如 order_id)。
    • sharding-algorithm-name:指定分片算法。

:根据 order_id % 4 的值确定目标表,例如:

  • order_id = 5,分片结果:order_1
  • order_id = 9,分片结果:order_3
  • sharding-algorithms
    • 算法类型INLINE 表示基于表达式进行分片计算。

    • 算法表达式

      • order_${order_id % 4} :确定表名。
      • ds${user_id % 2} :确定库名。

支持的算法类型

  • INLINE:基于表达式计算。
  • RANGE:基于范围分片。
  • HASH:基于哈希算法分片。
  • 自定义:实现 PreciseShardingAlgorithmRangeShardingAlgorithm 接口。

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

解析

  1. 主数据源master_ds):用于写操作。

    • 指向 master_db 数据库。
  2. 从数据源slave_ds_0slave_ds_1):用于读操作。

    • 指向 slave_db_0slave_db_1 数据库。
  3. 数据源池类型

    • 配置了 HikariCP(高性能连接池)。
  4. 分片算法 t_order_inline

    • 算法类型INLINE,基于表达式计算分片。

    • 表达式t_order_${order_id % 2}

      • 根据 order_id 的值取模,确定目标表。例如:

        • order_id = 1,落到 t_order_1
        • order_id = 2,落到 t_order_0
  5. 逻辑数据源 readwrite_ds

    • writeDataSourceName:主库(master_ds)处理写操作。

    • readDataSourceNames:从库(slave_ds_0slave_ds_1)处理读操作。

    • 负载均衡器

      • 配置了 round_robin(轮询算法)用于分配读请求。
  6. 负载均衡策略

    • 类型ROUND_ROBIN,将读请求轮流分配给多个从库。

    • 优点

      • 提升读操作的吞吐量。
      • 减轻主库的压力。

ShardingSphere 的优势

  1. 透明化

    • 应用层无需感知底层数据库分片、读写分离等逻辑。
  2. 多种功能整合

    • 分库分表、读写分离、分布式事务一站式解决。
  3. 高性能

    • 采用轻量级架构,特别是 Sharding-JDBC 的性能接近原生数据库。
  4. 生态完善

    • 支持 MySQL、PostgreSQL 等主流数据库。
    • 与 Kubernetes 等云原生技术集成良好。

ShardingSphere 与 MyCAT 对比

ShardingSphere 和 MyCAT 是两种常见的分布式数据库中间件解决方案,它们都能实现分库分表、读写分离等功能,但在架构设计、适用场景和社区活跃度等方面存在显著差异。


1. 项目背景

特性ShardingSphereMyCAT
开源组织Apache 基金会国内社区发起(基于阿里的 Cobar 改进)
最新动态活跃,社区贡献者多,更新频繁更新缓慢,社区活跃度逐年下降
成熟度高,支持多种功能(分片、读写分离、分布式事务、数据治理等)功能较少,主要集中在分库分表和读写分离

2. 核心架构对比

特性ShardingSphereMyCAT
运行模式多模式:Sharding-JDBC、Sharding-Proxy、Sharding-Sidecar独立代理模式(类似数据库代理)
耦合性- Sharding-JDBC 嵌入应用程序,低耦合,高性能 - Sharding-Proxy 独立运行,支持多语言独立运行,类似 MySQL Proxy,应用需通过其访问数据库
扩展性支持云原生环境(如 Kubernetes 的 Sidecar 模式)静态配置扩展较复杂,动态扩展能力较弱
对数据库的支持支持多种数据库(MySQL、PostgreSQL、Oracle、SQL Server 等)主要支持 MySQL
功能丰富度除分库分表、读写分离外,还支持分布式事务、数据脱敏、性能监控等主要提供分库分表和读写分离功能

3. 功能对比

功能ShardingSphereMyCAT
分库分表支持灵活的分片规则(标准分片、绑定表、广播表等),内置多种算法提供简单的分片规则,扩展性有限
读写分离内置多种读写分离策略,支持主从负载均衡支持读写分离,但负载均衡策略有限
分布式事务支持两阶段提交(XA)、柔性事务(TCC、最佳努力通知)不支持分布式事务
数据脱敏支持脱敏规则(如掩码、替换等)不支持
动态扩展支持在线扩容,自动路由扩展能力较弱,需手动配置
SQL 支持支持完整的 SQL 功能(包括复杂查询、子查询、分页等)对复杂 SQL 支持较差,部分场景需要业务代码调整
多租户支持支持不支持
监控和治理提供 SQL 跟踪、性能监控和限流功能无专门的监控功能