分片算法

背景信息

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

参数解释

自动分片算法

取模分片算法

类型:MOD

可配置属性:

属性名称数据类型说明
sharding-countint分片数量

哈希取模分片算法

类型:HASH_MOD

可配置属性:

属性名称数据类型说明
sharding-countint分片数量

基于分片容量的范围分片算法

类型:VOLUME_RANGE

可配置属性:

属性名称数据类型说明
range-lowerlong范围下界,超过边界的数据会报错
range-upperlong范围上界,超过边界的数据会报错
sharding-volumelong分片容量

基于分片边界的范围分片算法

类型:BOUNDARY_RANGE

可配置属性:

属性名称数据类型说明
sharding-rangesString分片的范围边界,多个范围边界以逗号分隔

自动时间段分片算法

类型:AUTO_INTERVAL

可配置属性:

属性名称数据类型说明
datetime-lowerString分片的起始时间范围,时间戳格式:yyyy-MM-dd HH:mm:ss
datetime-upperString分片的结束时间范围,时间戳格式:yyyy-MM-dd HH:mm:ss
sharding-secondslong单一分片所能承载的最大时间,单位:秒,允许分片键的时间戳格式的秒带有时间精度,但秒后的时间精度会被自动抹去

标准分片算法

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

行表达式分片算法

使用 Groovy 的表达式,提供对 SQL 语句中的 =IN 的分片操作支持,只支持单分片键。 对于简单的分片算法,可以通过简单的配置使用,从而避免繁琐的 Java 代码开发,如: t_user_$->{u_id % 8} 表示 t_user 表根据 u_id 模 8,而分成 8 张表,表名称为 t_user_0t_user_7。 详情请参见行表达式

类型:INLINE

可配置属性:

属性名称数据类型说明默认值
algorithm-expressionString分片算法的行表达式
allow-range-query-with-inline-sharding (?)boolean是否允许范围查询。注意:范围查询会无视分片策略,进行全路由false

时间范围分片算法

此算法主动忽视了 datetime-pattern 的时区信息。 这意味着当 datetime-lower, datetime-upper 和传入的分片键含有时区信息时,不会因为时区不一致而发生时区转换。 当传入的分片键为 java.time.Instant 时存在特例处理,其会携带上系统的时区信息后转化为 datetime-pattern 的字符串格式,再进行下一步分片。

类型:INTERVAL

可配置属性:

属性名称数据类型说明默认值
datetime-patternString分片键的时间戳格式,必须遵循 Java DateTimeFormatter 的格式。例如:yyyy-MM-dd HH:mm:ss,yyyy-MM-dd 或 HH:mm:ss 等。但不支持与 java.time.chrono.JapaneseDate 相关的 Gy-MM 等
datetime-lowerString时间分片下界值,格式与 datetime-pattern 定义的时间戳格式一致
datetime-upper (?)String时间分片上界值,格式与 datetime-pattern 定义的时间戳格式一致当前时间
sharding-suffix-patternString分片数据源或真实表的后缀格式,必须遵循 Java DateTimeFormatter 的格式,必须和 datetime-interval-unit 保持一致。例如:yyyyMM
datetime-interval-amount (?)int分片键时间间隔,超过该时间间隔将进入下一分片1
datetime-interval-unit (?)String分片键时间间隔单位,必须遵循 Java ChronoUnit 的枚举值。例如:MONTHSDAYS

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

基于 me.ahoo.cosid:cosid-core 的工具类实现的固定时间范围的分片算法。 当分片键为 JSR-310 的所含类或与时间相关的类,将转换为java.time.LocalDateTime后再做下一步分片。 参考 https://github.com/apache/shardingsphere/issues/14047 的讨论。

类型:COSID_INTERVAL

可配置属性:

属性名称数据类型说明默认值
zone-idString时区,必须遵循 java.time.ZoneId 的所含值。 例如:Asia/Shanghai
logic-name-prefixString分片数据源或真实表的前缀格式
datetime-lowerString时间分片下界值,格式与 yyyy-MM-dd HH:mm:ss 的时间戳格式一致
datetime-upperString时间分片上界值,格式与 yyyy-MM-dd HH:mm:ss 的时间戳格式一致
sharding-suffix-patternString分片数据源或真实表的后缀格式,必须遵循 Java DateTimeFormatter 的格式,必须和 datetime-interval-unit 保持一致。例如:yyyyMM
datetime-interval-unitString分片键时间间隔单位,必须遵循 Java ChronoUnit 的枚举值。例如:MONTHS
datetime-interval-amountint分片键时间间隔,超过该时间间隔将进入下一分片

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

基于 me.ahoo.cosid:cosid-core 的工具类实现的雪花ID固定时间范围的分片算法。 当分片键为 JSR-310 的所含类或与时间相关的类,将转换为java.time.LocalDateTime后再做下一步分片。 参考 https://github.com/apache/shardingsphere/issues/14047 的讨论。

类型:COSID_INTERVAL_SNOWFLAKE

可配置属性:

属性名称数据类型说明默认值
zone-idString时区,必须遵循 java.time.ZoneId 的所含值。 例如:Asia/Shanghai
logic-name-prefixString分片数据源或真实表的前缀格式
datetime-lowerString时间分片下界值,格式与 yyyy-MM-dd HH:mm:ss 的时间戳格式一致
datetime-upperString时间分片上界值,格式与 yyyy-MM-dd HH:mm:ss 的时间戳格式一致
sharding-suffix-patternString分片数据源或真实表的后缀格式,必须遵循 Java DateTimeFormatter 的格式,必须和 datetime-interval-unit 保持一致。例如:yyyyMM
datetime-interval-unitString分片键时间间隔单位,必须遵循 Java ChronoUnit 的枚举值。例如:MONTHS
datetime-interval-amountint分片键时间间隔,超过该时间间隔将进入下一分片

基于 CosId 的取模分片算法

基于 me.ahoo.cosid:cosid-core 的工具类实现的取模分片算法。 参考 https://github.com/apache/shardingsphere/issues/14047 的讨论。

类型:COSID_MOD

可配置属性:

属性名称数据类型说明
modint分片数量
logic-name-prefixString分片数据源或真实表的前缀格式

复合分片算法

复合行表达式分片算法

详情请参见行表达式

类型:COMPLEX_INLINE

属性名称数据类型说明默认值
sharding-columns (?)String分片列名称,多个列用逗号分隔。如不配置无法则不能校验
algorithm-expressionString分片算法的行表达式
allow-range-query-with-inline-sharding (?)boolean是否允许范围查询。注意:范围查询会无视分片策略,进行全路由false

Hint 分片算法

Hint 行表达式分片算法

详情请参见行表达式

类型:HINT_INLINE

属性名称数据类型说明默认值
algorithm-expression (?)String分片算法的行表达式${value}

自定义类分片算法

通过配置分片策略类型和算法类名,实现自定义扩展。 CLASS_BASED 允许向算法类内传入额外的自定义属性,传入的属性可以通过属性名为 propsjava.util.Properties 类实例取出。 参考 Git 的 org.apache.shardingsphere.example.extension.sharding.algortihm.classbased.fixture.ClassBasedStandardShardingAlgorithmFixture

类型:CLASS_BASED

可配置属性:

属性名称数据类型说明
strategyString分片策略类型,支持 STANDARD、COMPLEX 或 HINT(不区分大小写)
algorithmClassNameString分片算法全限定名

操作步骤

  1. 使用数据分片时,在 shardingAlgorithms 属性下配置对应的数据分片算法即可;

配置示例

  1. rules:
  2. - !SHARDING
  3. tables:
  4. t_order:
  5. actualDataNodes: ds_${0..1}.t_order_${0..1}
  6. tableStrategy:
  7. standard:
  8. shardingColumn: order_id
  9. shardingAlgorithmName: t_order_inline
  10. keyGenerateStrategy:
  11. column: order_id
  12. keyGeneratorName: snowflake
  13. t_order_item:
  14. actualDataNodes: ds_${0..1}.t_order_item_${0..1}
  15. tableStrategy:
  16. standard:
  17. shardingColumn: order_id
  18. shardingAlgorithmName: t_order_item_inline
  19. keyGenerateStrategy:
  20. column: order_item_id
  21. keyGeneratorName: snowflake
  22. t_account:
  23. actualDataNodes: ds_${0..1}.t_account_${0..1}
  24. tableStrategy:
  25. standard:
  26. shardingAlgorithmName: t_account_inline
  27. keyGenerateStrategy:
  28. column: account_id
  29. keyGeneratorName: snowflake
  30. defaultShardingColumn: account_id
  31. bindingTables:
  32. - t_order,t_order_item
  33. broadcastTables:
  34. - t_address
  35. defaultDatabaseStrategy:
  36. standard:
  37. shardingColumn: user_id
  38. shardingAlgorithmName: database_inline
  39. defaultTableStrategy:
  40. none:
  41. shardingAlgorithms:
  42. database_inline:
  43. type: INLINE
  44. props:
  45. algorithm-expression: ds_${user_id % 2}
  46. t_order_inline:
  47. type: INLINE
  48. props:
  49. algorithm-expression: t_order_${order_id % 2}
  50. t_order_item_inline:
  51. type: INLINE
  52. props:
  53. algorithm-expression: t_order_item_${order_id % 2}
  54. t_account_inline:
  55. type: INLINE
  56. props:
  57. algorithm-expression: t_account_${account_id % 2}
  58. keyGenerators:
  59. snowflake:
  60. type: SNOWFLAKE

相关参考