• ShardingSphere分片算法(未完待续)


    一、背景信息

    ShardingSphere 内置提供了多种分片算法,按照类型可以划分为自动分片算法、标准分片算法、复合分片算法和 Hint 分片算法,能够满足用户绝大多数业务场景的需要。此外,考虑到业务场景的复杂性,内置算法也提供了自定义分片算法的方式,用户可以通过编写 Java 代码来完成复杂的分片逻辑。

    二、配置文件

    1、参数解释

    rules:
    - !SHARDING
      tables: # 数据分片规则配置
         (+): # 逻辑表名称
          actualDataNodes (?): # 由数据源名 + 表名组成(参考 Inline 语法规则)
          databaseStrategy (?): # 分库策略,缺省表示使用默认分库策略,以下的分片策略只能选其一
            standard: # 用于单分片键的标准分片场景
              shardingColumn: # 分片列名称
              shardingAlgorithmName: # 分片算法名称
            complex: # 用于多分片键的复合分片场景
              shardingColumns: # 分片列名称,多个列以逗号分隔
              shardingAlgorithmName: # 分片算法名称
            hint: # Hint 分片策略
              shardingAlgorithmName: # 分片算法名称
            none: # 不分片
          tableStrategy: # 分表策略,同分库策略
          keyGenerateStrategy: # 分布式序列策略
            column: # 自增列名称,缺省表示不使用自增主键生成器
            keyGeneratorName: # 分布式序列算法名称
          auditStrategy: # 分片审计策略
            auditorNames: # 分片审计算法名称
              - -name>
              - -name>
            allowHintDisable: true # 是否禁用分片审计hint
      autoTables: # 自动分片表规则配置
        t_order_auto: # 逻辑表名称
          actualDataSources (?): # 数据源名称
          shardingStrategy: # 切分策略
            standard: # 用于单分片键的标准分片场景
              shardingColumn: # 分片列名称
              shardingAlgorithmName: # 自动分片算法名称
      bindingTables (+): # 绑定表规则列表
        - , logic_table_name_2, ...> 
        - , logic_table_name_2, ...> 
      broadcastTables (+): # 广播表规则列表
        - -name>
        - -name>
      defaultDatabaseStrategy: # 默认数据库分片策略
      defaultTableStrategy: # 默认表分片策略
      defaultKeyGenerateStrategy: # 默认的分布式序列策略
      defaultShardingColumn: # 默认分片列名称
      
      # 分片算法配置
      shardingAlgorithms:
         (+): # 分片算法名称
          type: # 分片算法类型
          props: # 分片算法属性配置
          # ...
      
      # 分布式序列算法配置
      keyGenerators:
         (+): # 分布式序列算法名称
          type: # 分布式序列算法类型
          props: # 分布式序列算法属性配置
          # ...
      # 分片审计算法配置
      auditors:
         (+): # 分片审计算法名称
          type: # 分片审计算法类型
          props: # 分片审计算法属性配置
          # ...
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61

    2、配置示例

    dataSources:
      ds_0:
        dataSourceClassName: com.zaxxer.hikari.HikariDataSource
        driverClassName: com.mysql.jdbc.Driver
        jdbcUrl: jdbc:mysql://localhost:3306/demo_ds_0?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF-8
        username: root
        password:
      ds_1:
        dataSourceClassName: com.zaxxer.hikari.HikariDataSource
        driverClassName: com.mysql.jdbc.Driver
        jdbcUrl: jdbc:mysql://localhost:3306/demo_ds_1?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF-8
        username: root
        password:
    
    rules:
    - !SHARDING
      tables:
        t_order: 
          actualDataNodes: ds_${0..1}.t_order_${0..1}
          tableStrategy: 
            standard:
              shardingColumn: order_id
              shardingAlgorithmName: t-order-inline
          keyGenerateStrategy:
            column: order_id
            keyGeneratorName: snowflake
          auditStrategy:
            auditorNames:
              - sharding_key_required_auditor
            allowHintDisable: true
        t_order_item:
          actualDataNodes: ds_${0..1}.t_order_item_${0..1}
          tableStrategy:
            standard:
              shardingColumn: order_id
              shardingAlgorithmName: t_order-item-inline
          keyGenerateStrategy:
            column: order_item_id
            keyGeneratorName: snowflake
        t_account:
          actualDataNodes: ds_${0..1}.t_account_${0..1}
          tableStrategy:
            standard:
              shardingAlgorithmName: t-account-inline
          keyGenerateStrategy:
            column: account_id
            keyGeneratorName: snowflake
      defaultShardingColumn: account_id
      bindingTables:
        - t_order,t_order_item
      broadcastTables:
        - t_address
      defaultDatabaseStrategy:
        standard:
          shardingColumn: user_id
          shardingAlgorithmName: database-inline
      defaultTableStrategy:
        none:
      
      shardingAlgorithms:
        database-inline:
          type: INLINE
          props:
            algorithm-expression: ds_${user_id % 2}
        t-order-inline:
          type: INLINE
          props:
            algorithm-expression: t_order_${order_id % 2}
        t_order-item-inline:
          type: INLINE
          props:
            algorithm-expression: t_order_item_${order_id % 2}
        t-account-inline:
          type: INLINE
          props:
            algorithm-expression: t_account_${account_id % 2}
      keyGenerators:
        snowflake:
          type: SNOWFLAKE
      auditors:
        sharding_key_required_auditor:
          type: DML_SHARDING_CONDITIONS
    
    props:
      sql-show: false
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85

    三、分库策略,缺省表示使用默认分库策略,以下的分片策略只能选其一

    1、standard

    用于单分片键的标准分片场景

    2、complex

    用于多分片键的复合分片场景

    3、hint

    Hint 分片策略

    4、none

    不分片

    三、分表策略

    1、取模分片算法(MOD)

    #------------------------基本配置
    # 应用名称
    spring.application.name=sharging-jdbc-demo
    # 开发环境设置
    spring.profiles.active=dev
    # 内存模式
    spring.shardingsphere.mode.type=Memory
    # 打印SQl
    spring.shardingsphere.props.sql-show=true
    #------------------------数据源配置
    # 配置真实数据源
    spring.shardingsphere.datasource.names=server-order2,server-order0,server-order1
    # 配置第 1 个数据源
    spring.shardingsphere.datasource.server-order0.type=com.zaxxer.hikari.HikariDataSource
    spring.shardingsphere.datasource.server-order0.driver-class-name=com.mysql.jdbc.Driver
    spring.shardingsphere.datasource.server-order0.jdbc-url=jdbc:mysql://192.168.159.103:3307/test1
    spring.shardingsphere.datasource.server-order0.username=root
    spring.shardingsphere.datasource.server-order0.password=xxxx
    # 配置第 2 个数据源
    spring.shardingsphere.datasource.server-order1.type=com.zaxxer.hikari.HikariDataSource
    spring.shardingsphere.datasource.server-order1.driver-class-name=com.mysql.jdbc.Driver
    spring.shardingsphere.datasource.server-order1.jdbc-url=jdbc:mysql://192.168.159.103:3308/test2
    spring.shardingsphere.datasource.server-order1.username=root
    spring.shardingsphere.datasource.server-order1.password=xxxx
    # 配置第 3 个数据源
    spring.shardingsphere.datasource.server-order2.type=com.zaxxer.hikari.HikariDataSource
    spring.shardingsphere.datasource.server-order2.driver-class-name=com.mysql.jdbc.Driver
    spring.shardingsphere.datasource.server-order2.jdbc-url=jdbc:mysql://192.168.159.103:3309/test3
    spring.shardingsphere.datasource.server-order2.username=root
    spring.shardingsphere.datasource.server-order2.password=xxxx
    
    spring.shardingsphere.rules.sharding.tables.t_order.actual-data-nodes=server-order$->{0..2}.t_order 
    #------------------------分库策略,缺省表示使用默认分库策略,以下的分片策略只能选其一
    # 用于单分片键的标准分片场景
    # 分片列名称
    spring.shardingsphere.rules.sharding.tables.t_order.database-strategy.standard.sharding-column=user_id
    # 分片算法名称
    spring.shardingsphere.rules.sharding.tables.t_order.database-strategy.standard.sharding-algorithm-name=alg_mod
    
    
    # 取模分片算法
    # 分片算法类型
    spring.shardingsphere.rules.sharding.sharding-algorithms.alg_mod.type=MOD
    # 分片算法属性配置
    spring.shardingsphere.rules.sharding.sharding-algorithms.alg_mod.props.sharding-count=3
    #
    ## 哈希取模分片算法
    ## 分片算法类型
    #spring.shardingsphere.rules.sharding.sharding-algorithms.alg_hash_mod.type=HASH_MOD
    ## 分片算法属性配置
    #spring.shardingsphere.rules.sharding.sharding-algorithms.alg_hash_mod.props.sharding-count=2
    #
    ##------------------------分布式序列策略配置
    # 分布式序列列名称
    spring.shardingsphere.rules.sharding.tables.t_order.key-generate-strategy.column=id
    # 分布式序列算法名称
    spring.shardingsphere.rules.sharding.tables.t_order.key-generate-strategy.key-generator-name=alg_snowflake
    #------------------------分布式序列算法配置
    # 分布式序列算法类型
    spring.shardingsphere.rules.sharding.key-generators.alg_snowflake.type=SNOWFLAKE
    # 分布式序列算法属性配置
    #spring.shardingsphere.rules.sharding.key-generators.alg_snowflake.props.xxx=
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62

    2、基于 CosId 的取模分片算法(COSID_MOD)

    #------------------------基本配置
    # 应用名称
    spring.application.name=sharging-jdbc-demo
    # 开发环境设置
    spring.profiles.active=dev
    # 内存模式
    spring.shardingsphere.mode.type=Memory
    # 打印SQl
    spring.shardingsphere.props.sql-show=true
    #------------------------数据源配置
    # 配置真实数据源
    spring.shardingsphere.datasource.names=server-order1,server-order2,server-order0
    # 配置第 1 个数据源
    spring.shardingsphere.datasource.server-order0.type=com.zaxxer.hikari.HikariDataSource
    spring.shardingsphere.datasource.server-order0.driver-class-name=com.mysql.jdbc.Driver
    spring.shardingsphere.datasource.server-order0.jdbc-url=jdbc:mysql://192.168.159.103:3307/test1
    spring.shardingsphere.datasource.server-order0.username=root
    spring.shardingsphere.datasource.server-order0.password=xxxx
    # 配置第 2 个数据源
    spring.shardingsphere.datasource.server-order1.type=com.zaxxer.hikari.HikariDataSource
    spring.shardingsphere.datasource.server-order1.driver-class-name=com.mysql.jdbc.Driver
    spring.shardingsphere.datasource.server-order1.jdbc-url=jdbc:mysql://192.168.159.103:3308/test2
    spring.shardingsphere.datasource.server-order1.username=root
    spring.shardingsphere.datasource.server-order1.password=xxxx
    # 配置第 3 个数据源
    spring.shardingsphere.datasource.server-order2.type=com.zaxxer.hikari.HikariDataSource
    spring.shardingsphere.datasource.server-order2.driver-class-name=com.mysql.jdbc.Driver
    spring.shardingsphere.datasource.server-order2.jdbc-url=jdbc:mysql://192.168.159.103:3309/test3
    spring.shardingsphere.datasource.server-order2.username=root
    spring.shardingsphere.datasource.server-order2.password=xxxx
    
    spring.shardingsphere.rules.sharding.tables.t_order.actual-data-nodes=server-order$->{0..2}.t_order 
    #------------------------分库策略,缺省表示使用默认分库策略,以下的分片策略只能选其一
    # 用于单分片键的标准分片场景
    # 分片列名称
    spring.shardingsphere.rules.sharding.tables.t_order.database-strategy.standard.sharding-column=user_id
    # 分片算法名称
    spring.shardingsphere.rules.sharding.tables.t_order.database-strategy.standard.sharding-algorithm-name=alg_mod
    
    
    # 取模分片算法
    # 分片算法类型
    spring.shardingsphere.rules.sharding.sharding-algorithms.alg_mod.type=COSID_MOD
    # 分片算法属性配置
    spring.shardingsphere.rules.sharding.sharding-algorithms.alg_mod.props.mod=3
    # 分片算法属性配置
    spring.shardingsphere.rules.sharding.sharding-algorithms.alg_mod.props.logic-name-prefix=server-order
    #
    ## 哈希取模分片算法
    ## 分片算法类型
    #spring.shardingsphere.rules.sharding.sharding-algorithms.alg_hash_mod.type=HASH_MOD
    ## 分片算法属性配置
    #spring.shardingsphere.rules.sharding.sharding-algorithms.alg_hash_mod.props.sharding-count=2
    #
    ##------------------------分布式序列策略配置
    # 分布式序列列名称
    spring.shardingsphere.rules.sharding.tables.t_order.key-generate-strategy.column=id
    # 分布式序列算法名称
    spring.shardingsphere.rules.sharding.tables.t_order.key-generate-strategy.key-generator-name=alg_snowflake
    #------------------------分布式序列算法配置
    # 分布式序列算法类型
    spring.shardingsphere.rules.sharding.key-generators.alg_snowflake.type=SNOWFLAKE
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62

    3、哈希取模分片算法(HASH_MOD)

    4、基于分片容量的范围分片算法(VOLUME_RANGE)

    5、基于分片边界的范围分片算法(BOUNDARY_RANGE)

    6、自动时间段分片算法(AUTO_INTERVAL)

    三、标准分片算法

    Apache ShardingSphere 内置的标准分片算法实现类包括

    1、行表达式分片算法()

    2、时间范围分片算法

    3、基于 CosId 的固定时间范围的分片算法

    4、基于 CosId 的雪花ID固定时间范围的分片算法

    四、复合分片算法

    1、复合行表达式分片算法(COMPLEX_INLINE)

    五、Hint 分片算法

    1、Hint 行表达式分片算法(HINT_INLINE)

    六、自定义类分片算法

    1、自定义分片算法(CLASS_BASED)

  • 相关阅读:
    PhpSpreadsheet读写Excel文件
    Dubbo 一些你不一定知道但是很好用的功能
    Dubbo 03: 直连式 + 接口工程
    QT基础教程(Hello QT)
    罗丹明标记的葡聚糖 70k,RB-Dextran,MW:70K
    Pytorch 缓解过拟合和网络退化
    Ubuntu18.04 ROS Melodic的cv_bridge指向问题(四种方式,包括opencv4)(转载)
    ARM64 linux 异常处理 -- 异常向量
    Matter 研讨会(第二期)|乐鑫 Matter SDK 赋能客户自主开发 Matter 产品
    typedef的四种用法
  • 原文地址:https://blog.csdn.net/qq_38173650/article/details/127410774