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 获取当前时间的数据库方言 |
其它参考
Sharding-JDBC系列(四):Sharding-JDBC 5.x 内置片分算法与实现
http://blog.gxitsky.com/2019/09/27/sharding-jdbc-4-sharding-algorithm/