ShardingSphere-Proxy5 分片算法-时间范围分片

ShardingSphere-Proxy5 分片算法

ShardingSphere 内置提供了多种分片算法,按照类型可以划分为自动分片算法、标准分片算法、复合分片算法和 Hint 分片算法。同时对于复杂业务也提供了自定义分片算法的方式。

自动分片算法

取模分片算法
  • 类型:MOD

  • 可配置属性:

    属性名称数据类型说明
    sharding-countint分片数量
  • org.apache.shardingsphere.sharding.algorithm.sharding.mod.ModShardingAlgorithm

    哈希取模分片算法
  • 类型:HASH_MOD

  • 可配置属性:

    属性名称数据类型说明
    sharding-countint分片数量
  • org.apache.shardingsphere.sharding.algorithm.sharding.mod.HashModShardingAlgorithm

    基于 CosId 的取模分片算法
  • 类型:COSID_MOD

  • 可配置属性:

    属性名称数据类型说明
    modint分片数量
    logic-name-prefixString分片数据源或真实表的前缀格式
  • org.apache.shardingsphere.sharding.cosid.algorithm.sharding.mod.CosIdModShardingAlgorithm

自动时间段分片算法
  • 类型:AUTO_INTERVAL

  • 可配置属性:

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

基于分片容量的范围分片算法
  • 类型:VOLUME_RANGE

  • 可配置属性:

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

基于分片边界的范围分片算法
  • 类型:BOUNDARY_RANGE

  • 可配置属性:

    属性名称数据类型说明
    sharding-rangesString分片的范围边界,多个范围边界以逗号分隔
  • 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_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
  • 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");

插入后,观察物理库的表数据存储情况。

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值