Sharding-JDBC系列(四):Sharding-JDBC 5.x 内置片分算法与实现

**特别注意**:此篇内容是基于 Sharding Sphere 5.x 版本(即将发布)的描述,来自官方文档 内置算法

原因是最初阅读 Sharding Sphere 官方文档时,直接看的是最新版本的文档,几乎全看完了才发现没有切换已发布的 4.x 版本的文档。

从该小节内容可以看出 5.x 相比 4.x 改动是挺大的,4.x 的分片算法需要用户自己实现,而 5.x 版本开始提供了内置分片算法。

内置分片算法

官方文档 用户手册 > 分片算法

ShardingAlgorithm

内部已提供的的分片算法实现类。

SPI 名称 详细说明
ShardingAlgorithm 分片算法
已知实现类 详细说明
InlineShardingAlgorithm 基于行表达式的分片算法
ModShardingAlgorithm 基于取模的分片算法
HashModShardingAlgorithm 基于哈希取模的分片算法
FixedIntervalShardingAlgorithm 基于固定时间范围的分片算法
MutableIntervalShardingAlgorithm 基于可变时间范围的分片算法
VolumeBasedRangeShardingAlgorithm 基于分片容量的范围分片算法
BoundaryBasedRangeShardingAlgorithm 基于分片边界的范围分片算法

自动分片算法

取模分片算法

类型:MOD

可配置属性:

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

哈希取模分片算法

类型:HASH_MOD

可配置属性:

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

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

类型:VOLUME_RANGE

可配置属性:

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

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

类型:BOUNDARY_RANGE

可配置属性:

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

自动时间段分片算法

类型:AUTO_INTERVAL

可配置属性:

属性名称 数据类型 说明
datetime-lower String 分片的起始时间范围,时间戳格式:yyyy-MM-dd HH:mm:ss
datetime-upper String 分片的结束时间范围,时间戳格式:yyyy-MM-dd HH:mm:ss
sharding-seconds long 单一分片所能承载的最大时间,单位:秒

标准分片算法

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

行表达式分片算法

类型:INLINE

可配置属性:

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

时间范围分片算法

类型:INTERVAL

可配置属性:

属性名称 数据类型 说明 默认值
datetime-pattern String 分片键的时间戳格式,必须遵循 Java DateTimeFormatter 的格式。例如:yyyy-MM-dd HH:mm:ss -
datetime-lower String 时间分片下界值,格式与 datetime-pattern 定义的时间戳格式一致 -
datetime-upper String 时间分片上界值,格式与 datetime-pattern 定义的时间戳格式一致 当前时间
sharding-suffix-pattern String 分片数据源或真实表的后缀格式,必须遵循 Java DateTimeFormatter 的格式。例如:yyyyMM -
datetime-interval-amount int 分片键时间间隔,超过该时间间隔将进入下一分片 1
datetime-interval-unit String 分片键时间间隔单位,必须遵循 Java ChronoUnit 的枚举值。例如:MONTHS DAYS

复合分片算法

Apache ShardingSphere 暂无内置复合分片算法。

Hint 分片算法

Apache ShardingSphere 暂无内置 Hint 分片算法。

内置分布式序列算法

KeyGenerateAlgorithm

内部已提供的分布式序列算法实现类

SPI 名称 详细说明
KeyGenerateAlgorithm 分布式主键生成算法
已知实现类 详细说明
SnowflakeKeyGenerateAlgorithm 基于雪花算法的分布式主键生成算法
UUIDKeyGenerateAlgorithm 基于UUID的分布式主键生成算法

雪花算法

类型:SNOWFLAKE

可配置属性:

属性名称 数据类型 说明 默认值
worker-id long 工作机器唯一标识 0
max-vibration-offset int 最大抖动上限值,范围[0, 4096)。
注:若使用此算法生成值作分片值,建议配置此属性。
此算法在不同毫秒内所生成的 key 取模 2^n (2^n一般为分库或分表数) 之后结果总为 0 或 1。
为防止上述分片问题,建议将此属性值配置为 (2^n)-1
1
max-tolerate-time-difference-milliseconds long 最大容忍时钟回退时间,单位:毫秒 10 毫秒

UUID

类型:UUID

可配置属性:无

负载均衡算法

轮询算法

类型:ROUND_ROBIN

可配置属性:无

随机访问算法

类型:RANDOM

可配置属性:无

加密算法

MD5 加密算法

类型:MD5

可配置属性:无

AES 加密算法

类型:AES

可配置属性:

名称 数据类型 说明
aes-key-value String AES 使用的 KEY

RC4 加密算法

类型:RC4

可配置属性:

名称 数据类型 说明
rc4-key-value String RC4 使用的 KEY

其它内部实现类

TimeService

SPI 名称 详细说明
TimeService 获取当前时间进行路由
已知实现类 详细说明
DefaultTimeService 从应用系统时间中获取当前时间进行路由
DatabaseTimeServiceDelegate 从数据库中获取当前时间进行路由

DatabaseSQLEntry

SPI 名称 详细说明
DatabaseSQLEntry 获取当前时间的数据库方言
已知实现类 详细说明
MySQLDatabaseSQLEntry 从 MySQL 获取当前时间的数据库方言
PostgreSQLDatabaseSQLEntry 从 PostgreSQL 获取当前时间的数据库方言
OracleDatabaseSQLEntry 从 Oracle 获取当前时间的数据库方言
SQLServerDatabaseSQLEntry 从 SQLServer 获取当前时间的数据库方言

其它参考

  1. 分库分表需要考虑的问题及方案
  2. MySQL分表分库使用场景以及设计方式
  3. Sharding-JDBC 分布式事务

Sharding-JDBC系列(四):Sharding-JDBC 5.x 内置片分算法与实现

http://blog.gxitsky.com/2019/09/27/sharding-jdbc-4-sharding-algorithm/

作者

光星

发布于

2019-09-27

更新于

2021-02-05

许可协议

评论