ShardingSphere-Proxy5 分片算法-时间范围分片
ShardingSphere-Proxy5 分片算法
ShardingSphere 内置提供了多种分片算法,按照类型可以划分为自动分片算法、标准分片算法、复合分片算法和 Hint 分片算法。同时对于复杂业务也提供了自定义分片算法的方式。
自动分片算法
取模分片算法
- 类型:MOD
- 可配置属性:
| 属性名称 | 数据类型 | 说明 |
| :------------- | :--------- | :------- |
| sharding-count | int | 分片数量 | - org.apache.shardingsphere.sharding.algorithm.sharding.mod.ModShardingAlgorithm
哈希取模分片算法
- 类型:HASH_MOD
- 可配置属性:
| 属性名称 | 数据类型 | 说明 |
| :------------- | :--------- | :------- |
| sharding-count | int | 分片数量 | - org.apache.shardingsphere.sharding.algorithm.sharding.mod.HashModShardingAlgorithm
基于 CosId 的取模分片算法
- 类型:COSID_MOD
- 可配置属性:
| 属性名称 | 数据类型 | 说明 |
| :---------------- | :--------- | :--------------------------- |
| mod | int | 分片数量 |
| logic-name-prefix | String | 分片数据源或真实表的前缀格式 | - org.apache.shardingsphere.sharding.cosid.algorithm.sharding.mod.CosIdModShardingAlgorithm
自动时间段分片算法
- 类型:AUTO_INTERVAL
- 可配置属性:
| 属性名称 | 数据类型 | 说明 |
| :--------------- | :--------- | :----------------------------------------------------------- |
| datetime-lower | String | 分片的起始时间范围,时间戳格式:yyyy-MM-dd HH:mm:ss |
| datetime-upper | String | 分片的结束时间范围,时间戳格式:yyyy-MM-dd HH:mm:ss |
| sharding-seconds | long | 单一分片所能承载的最大时间,单位:秒,允许分片键的时间戳格式的秒带有时间精度,但秒后的时间精度会被自动抹去 | - org.apache.shardingsphere.sharding.algorithm.sharding.datetime.AutoIntervalShardingAlgorithm
基于分片容量的范围分片算法
- 类型:VOLUME_RANGE
- 可配置属性:
| 属性名称 | 数据类型 | 说明 |
| :-------------- | :--------- | :----------------------------- |
| range-lower | long | 范围下界,超过边界的数据会报错 |
| range-upper | long | 范围上界,超过边界的数据会报错 |
| sharding-volume | long | 分片容量 | - org.apache.shardingsphere.sharding.algorithm.sharding.range.VolumeBasedRangeShardingAlgorithm
基于分片边界的范围分片算法
- 类型:BOUNDARY_RANGE
- 可配置属性:
| 属性名称 | 数据类型 | 说明 |
| :-------------- | :--------- | :------------------------------------- |
| sharding-ranges | String | 分片的范围边界,多个范围边界以逗号分隔 | - org.apache.shardingsphere.sharding.algorithm.sharding.range.BoundaryBasedRangeShardingAlgorithm
标准分片算法
Apache ShardingSphere 内置的标准分片算法实现类包括:
行表达式分片算法
使用 Groovy 的表达式,提供对 SQL 语句中的
=
和IN
的分片操作支持,只支持单分片键。 对于简单的分片算法,可以通过简单的配置使用,从而避免繁琐的 Java 代码开发,如:t_user_$->{u_id % 8}
表示t_user
表根据u_id
模 8,而分成 8 张表,表名称为t_user_0
到t_user_7
。 详情请参见行表达式。
- 类型:INLINE
- 可配置属性:
| 属性名称 | 数据类型 | 说明 | 默认值 |
| :----------------------------------------- | :--------- | :--------------------------------------------------------- | :------- |
| algorithm-expression | String | 分片算法的行表达式 | |
| allow-range-query-with-inline-sharding (?) | boolean | 是否允许范围查询。注意:范围查询会无视分片策略,进行全路由 | false |
时间范围分片算法
此算法主动忽视了
datetime-pattern
的时区信息。 这意味着当datetime-lower
,datetime-upper
和传入的分片键含有时区信息时,不会因为时区不一致而发生时区转换。 当传入的分片键为java.time.Instant
时存在特例处理,其会携带上系统的时区信息后转化为datetime-pattern
的字符串格式,再进行下一步分片。
- 类型:INTERVAL
- 可配置属性:
| 属性名称 | 数据类型 | 说明 | 默认值 |
| :--------------------------- | :--------- | :----------------------------------------------------------- | :------- |
| datetime-pattern | String | 分片键的时间戳格式,必须遵循 Java DateTimeFormatter 的格式。例如:yyyy-MM-dd HH:mm:ss,yyyy-MM-dd 或 HH:mm:ss 等。但不支持与java.time.chrono.JapaneseDate
相关的 Gy-MM 等 | |
| datetime-lower | String | 时间分片下界值,格式与datetime-pattern
定义的时间戳格式一致 | |
| datetime-upper (?) | String | 时间分片上界值,格式与datetime-pattern
定义的时间戳格式一致 | 当前时间 |
| sharding-suffix-pattern | String | 分片数据源或真实表的后缀格式,必须遵循 Java DateTimeFormatter 的格式,必须和datetime-interval-unit
保持一致。例如:yyyyMM | |
| datetime-interval-amount (?) | int | 分片键时间间隔,超过该时间间隔将进入下一分片 | 1 |
| datetime-interval-unit (?) | String | 分片键时间间隔单位,必须遵循 Java ChronoUnit 的枚举值。例如:MONTHS | DAYS | - org.apache.shardingsphere.sharding.algorithm.sharding.datetime.IntervalShardingAlgorithm
创建数据源
修改config-sharding.yaml文件添加数据源配置
databaseName: sharding_db ##逻辑库
dataSources: ## 数据源,连接真实物理库,注意物理库必须有相应的库存在,负责proxy无法启动。
ds_0:
url: jdbc:mysql://127.0.0.1:13307/demo_ds_0?serverTimezone=UTC&useSSL=false
username: root
password: sunday
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 50
minPoolSize: 1
ds_1:
url: jdbc:mysql://127.0.0.1:3306/demo_ds_1?serverTimezone=UTC&useSSL=false
username: root
password: sunday
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 50
minPoolSize: 1
配置分片规则
继续修改config-sharding.yaml文件添加数据分片规则
alg_interval:
type: INTERVAL
props:
datetime-pattern: "yyyyMM" # 分片字段格式
datetime-lower: "202201" # 范围下限
datetime-upper: "202206" # 范围上限
sharding-suffix-pattern: "yyyyMM" # 分片名后缀,可以是MM,yyyyMMdd等。
datetime-interval-amount: 1 # 分片间隔,这里指一个月
datetime-interval-unit: "MONTHS" # 分片间隔单位
完整配置文件
databaseName: sharding_db
dataSources: ## 数据源,连接真实物理库,注意物理库必须有相应的库存在,负责proxy无法启动。
ds_0:
url: jdbc:mysql://127.0.0.1:13307/demo_ds_0?serverTimezone=UTC&useSSL=false
username: root
password: sunday
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 50
minPoolSize: 1
ds_1:
url: jdbc:mysql://127.0.0.1:3306/demo_ds_1?serverTimezone=UTC&useSSL=false
username: root
password: sunday
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 50
minPoolSize: 1
## 分片规则配置
rules:
- !SHARDING
tables:
t_order_interval: # 分片表
actualDataNodes: ds_${0..1}.t_order_interval${202201..202206}
databaseStrategy: # 分库规则
standard: # 标准类型分片,目前官方有四种分片类型
shardingColumn: user_id
shardingAlgorithmName: alg_mod # 算法名称
tableStrategy: # 分表规则
standard:
shardingColumn: data_year_month
shardingAlgorithmName: alg_interval # 算法名称,具体使用哪一种算法下面会根据算法名称配置
keyGenerateStrategy: # 主键生成规则
column: id
keyGeneratorName: snowflake
keyGenerators: # 主键生成规则配置
snowflake:
type: SNOWFLAKE
shardingAlgorithms: # 分片算法配置,根据上面的算法名称配置算法的类型和算法接收的参数
alg_mod:
type: MOD
props:
sharding-count: 2
alg_interval:
type: INTERVAL
props:
datetime-pattern: "yyyyMM" # 分片字段格式
datetime-lower: "202201" # 范围下限
datetime-upper: "202206" # 范围上限
sharding-suffix-pattern: "yyyyMM" # 分片名后缀,可以是MM,yyyyMMdd等。
datetime-interval-amount: 1 # 分片间隔,这里指一个月
datetime-interval-unit: "MONTHS" # 分片间隔单位
连接proxy创建分片表
配置分片表后,并没有生成相应的分片表,需要连接上sharding-proxy,在proxy中执行建表语句,在创建逻辑表时分片表会被proxy自动按照配置的规则进行创建。
CREATE TABLE `t_order_interval` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`order_no` varchar(30) DEFAULT NULL,
`user_id` bigint(20) DEFAULT NULL,
`amount` decimal(10,2) DEFAULT NULL,
`data_year_month` varchar(125) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=779468255126355969 DEFAULT CHARSET=utf8mb4;
插入测试数据
INSERT INTO `sharding_db`.`t_order_interval`(`id`, `order_no`, `user_id`, `amount`) VALUES (779468213359476737, '22', 22, 22.00, "202204");
INSERT INTO `sharding_db`.`t_order_interval`(`id`, `order_no`, `user_id`, `amount`) VALUES (779468285585391617, '44', 44, 44.00, "202203");
INSERT INTO `sharding_db`.`t_order_interval`(`id`, `order_no`, `user_id`, `amount`) VALUES (779468168534949888, '11', 11, 11.00, "202202");
INSERT INTO `sharding_db`.`t_order_interval`(`id`, `order_no`, `user_id`, `amount`) VALUES (779468255126355968, '33', 33, 33.00, "202201");
插入后,观察物理库的表数据存储情况。
分类:
ShardingSphere
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架