登录
  • 欢迎访问悠扬的技术博客,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站😉

Sharding-Proxy自定义分片策略(按年分库,按月、日、小时分表)

ShardingSphere 悠扬 1882次浏览 已收录 3个评论

版本说明

组件 版本 备注
Sharding-Proxy源码 4.1.1  
Mysql 8.x  

一、官方的说明

1.使用自定义分片算法

你会发现如下的说明不能帮你什么🤣

当用户需要使用自定义的分片算法类时,无法再通过简单的inline表达式在yaml文件进行配置。可通过以下方式配置使用自定义分片算法。

  1. 实现ShardingAlgorithm接口定义的算法实现类。
  2. 将上述java文件打包成jar包。
  3. 将上述jar包拷贝至ShardingProxy解压后的conf/lib目录下。
  4. 将上述自定义算法实现类的java文件引用配置在yaml文件里tableRule的algorithmClassName属性上,具体可参考配置规则

 

2.数据分片配置说明

如下内容可能会有用一点,来源于:sharding-Jdbc配置说明   注意:仅我下面贴出来的有用,毕竟不是一个组件有些配置是不一样的。

dataSources: #数据源配置,可配置多个data_source_name
  <data_source_name>: #<!!数据库连接池实现类> `!!`表示实例化该类
    driverClassName: #数据库驱动类名
    url: #数据库url连接
    username: #数据库用户名
    password: #数据库密码
    # ... 数据库连接池的其它属性

shardingRule:
  tables: #数据分片规则配置,可配置多个logic_table_name
    <logic_table_name>: #逻辑表名称
      actualDataNodes: #由数据源名 + 表名组成,以小数点分隔。多个表以逗号分隔,支持inline表达式。缺省表示使用已知数据源与逻辑表名称生成数据节点,用于广播表(即每个库中都需要一个同样的表用于关联查询,多为字典表)或只分库不分表且所有库的表结构完全一致的情况

      databaseStrategy: #分库策略,缺省表示使用默认分库策略,以下的分片策略只能选其一
        standard: #用于单分片键的标准分片场景
          shardingColumn: #分片列名称
          preciseAlgorithmClassName: #精确分片算法类名称,用于=和IN。。该类需实现PreciseShardingAlgorithm接口并提供无参数的构造器
          rangeAlgorithmClassName: #范围分片算法类名称,用于BETWEEN,可选。。该类需实现RangeShardingAlgorithm接口并提供无参数的构造器
        complex: #用于多分片键的复合分片场景
          shardingColumns: #分片列名称,多个列以逗号分隔
          algorithmClassName: #复合分片算法类名称。该类需实现ComplexKeysShardingAlgorithm接口并提供无参数的构造器
        inline: #行表达式分片策略
          shardingColumn: #分片列名称
          algorithmInlineExpression: #分片算法行表达式,需符合groovy语法
        hint: #Hint分片策略
          algorithmClassName: #Hint分片算法类名称。该类需实现HintShardingAlgorithm接口并提供无参数的构造器
        none: #不分片
      tableStrategy: #分表策略,同分库策略
      keyGenerator:
        column: #自增列名称,缺省表示不使用自增主键生成器
        type: #自增列值生成器类型,缺省表示使用默认自增列值生成器。可使用用户自定义的列值生成器或选择内置类型:SNOWFLAKE/UUID
        props: #属性配置, 注意:使用SNOWFLAKE算法,需要配置worker.id与max.tolerate.time.difference.milliseconds属性。若使用此算法生成值作分片值,建议配置max.vibration.offset属性
          <property-name>: 属性名称

  bindingTables: #绑定表规则列表
    - <logic_table_name1, logic_table_name2, ...>
    - <logic_table_name3, logic_table_name4, ...>
    - <logic_table_name_x, logic_table_name_y, ...>
  broadcastTables: #广播表规则列表
    - table_name1
    - table_name2
    - table_name_x

  defaultDataSourceName: #未配置分片规则的表将通过默认数据源定位  
  defaultDatabaseStrategy: #默认数据库分片策略,同分库策略
  defaultTableStrategy: #默认表分片策略,同分库策略
  defaultKeyGenerator: #默认的主键生成算法 如果没有设置,默认为SNOWFLAKE算法
    type: #默认自增列值生成器类型,缺省将使用org.apache.shardingsphere.core.keygen.generator.impl.SnowflakeKeyGenerator。可使用用户自定义的列值生成器或选择内置类型:SNOWFLAKE/UUID
    props:
      <property-name>: #自增列值生成器属性配置, 比如SNOWFLAKE算法的worker.id与max.tolerate.time.difference.milliseconds

  masterSlaveRules: #读写分离规则,详见读写分离部分
    <data_source_name>: #数据源名称,需要与真实数据源匹配,可配置多个data_source_name
      masterDataSourceName: #详见读写分离部分
      slaveDataSourceNames: #详见读写分离部分
      loadBalanceAlgorithmType: #详见读写分离部分
      props: #读写分离负载算法的属性配置
        <property-name>: #属性值

二、正确的姿势

1.下载官方源码

这个不用在说明了,没找到请到我的其他文章中发现有惊喜。

2.配置启动sharding-proxy

这个也不在叙述,没啥有营养的价值,我以实现如下代码,按照预期进行入库操作,步骤如下,请跟着我,别掉队😉
Sharding-Proxy自定义分片策略(按年分库,按月、日、小时分表)

数据库配置,如下代码连接sharding-proxy代理在Navicat MySQL中运行,不会操作的也请看看其他文章
drop table IF EXISTS t_order;
CREATE TABLE IF NOT EXISTS t_order (order_id BIGINT NOT NULL AUTO_INCREMENT, user_id INT NOT NULL, create_time TIMESTAMP NOT NUll ,status VARCHAR(50), PRIMARY KEY (order_id));
预期操作
#2020 入demo2020库
INSERT INTO t_order (user_id, status,create_time) VALUES (2020, ‘init’,’2020-01-01 12:01:12′);
INSERT INTO t_order (user_id, status,create_time) VALUES (2020, ‘init’,’2020-02-01 12:01:12′);
INSERT INTO t_order (user_id, status,create_time) VALUES (2020, ‘init’,’2020-03-01 12:01:12′);
INSERT INTO t_order (user_id, status,create_time) VALUES (2020, ‘init’,’2020-04-01 12:01:12′);
INSERT INTO t_order (user_id, status,create_time) VALUES (2020, ‘init’,’2020-05-01 12:01:12′);
INSERT INTO t_order (user_id, status,create_time) VALUES (2020, ‘init’,’2020-06-01 12:01:12′);
#2021 入demo2021库
INSERT INTO t_order (user_id, status,create_time) VALUES (2021, ‘init’,’2021-07-01 12:01:12′);
INSERT INTO t_order (user_id, status,create_time) VALUES (2021, ‘init’,’2021-08-01 12:01:12′);
INSERT INTO t_order (user_id, status,create_time) VALUES (2021, ‘init’,’2021-09-01 12:01:12′);
INSERT INTO t_order (user_id, status,create_time) VALUES (2021, ‘init’,’2021-10-01 12:01:12′);
INSERT INTO t_order (user_id, status,create_time) VALUES (2021, ‘init’,’2021-11-01 12:01:12′);
INSERT INTO t_order (user_id, status,create_time) VALUES (2021, ‘init’,’2021-12-01 12:01:12′);
#检查插入数据,本次操作有且只能有12条记录,并去真实库,真实表中进行数据检验,也就是33080实例中的demo2020库和demo2021库
select * from t_order;  

3.代码、配置文件,结构说明

先贴个代码实际操作点,注意,注释是我自己加的

程序入口点

Sharding-Proxy自定义分片策略(按年分库,按月、日、小时分表)

策略配置

Sharding-Proxy自定义分片策略(按年分库,按月、日、小时分表)

代码结构说明

Sharding-Proxy自定义分片策略(按年分库,按月、日、小时分表)

分片配置文件

schemaName: sharding_db

dataSources:
  ds_2020:
    url: jdbc:mysql://192.168.32.132:33080/demo_2020
    username: root
    password: 12345678
    connectionTimeoutMilliseconds: 30000
    idleTimeoutMilliseconds: 60000
    maxLifetimeMilliseconds: 1800000
    maxPoolSize: 50
  ds_2021:
    url: jdbc:mysql://192.168.32.132:33080/demo_2021
    username: root
    password: 12345678
    connectionTimeoutMilliseconds: 30000
    idleTimeoutMilliseconds: 60000
    maxLifetimeMilliseconds: 1800000
    maxPoolSize: 50

shardingRule:
  tables:
    t_order:
      actualDataNodes: ds_${2020..2021}.t_order_${1..12}
      databaseStrategy:
        standard:
          shardingColumn: create_time
          preciseAlgorithmClassName: org.apache.shardingsphere.shardingproxy.rules.NxhzShardingDataBaseTimeByStringAlgorithm
      tableStrategy:
        standard:
          shardingColumn: create_time
          preciseAlgorithmClassName: org.apache.shardingsphere.shardingproxy.rules.NxhzShardingTableTimeByStringAlgorithm

  bindingTables:
    - t_order
#  defaultDatabaseStrategy:
#    standard:
#      shardingColumn: create_time
#      preciseAlgorithmClassName: org.apache.shardingsphere.shardingproxy.NxhzShardingDataBaseTimeAlgorithm
#  defaultTableStrategy:
#    standard:
#      shardingColumn: create_time
#      preciseAlgorithmClassName: org.apache.shardingsphere.shardingproxy.NxhzShardingTableTimeAlgorithm

搞定收工,提供代码下载地址

可以联系本人提供有偿服务哦


版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明Sharding-Proxy自定义分片策略(按年分库,按月、日、小时分表)
喜欢 (8)
支付宝[]
分享 (0)
悠扬
关于作者:
10年以上工作经验,从事2年微服务架构搭建工作,有大数据处理相关工作经验,使用spring全家桶包括:Spring,SpringBoot,SpringCloud 数据层组件服务使用SpringDataJpa,Mybatis以及其他第三方组件Sharding-JDBC,Sharding-Proxy分库分表。熟悉微服务,服务降级,限流,分流,做过项目源码修改,有cat,apollo,nacos使用经验,有Lostash,Elasticsearch,kibana,mysqlMHA生产实践经验,使用开源代码Apache Sarding项目,修改源码支持mysql分库分表使用年月日小时分库分表,docker做集群服务,Jekins做项目发布,GitLab做项目管理,使用docker容器部署,熟悉消息队列RabbitMQ,Kafka,ActiveMQ。RuoYi-Vue-Atomikos项目开源加入生态圈组件,项目支持分布式事务,界面添加多数据源,数据源动态配置,切面切换,多数据源事务支持,支持区域数据源配置,用于区域数据切分,数据层次分库。项目地址:https://gitee.com/zsiyang/ruoyi-vue-atomikos
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(3)个小伙伴在吐槽
  1. 大佬,没找到你的代码下载地址 :???:
    代码搬运工2021-12-07 14:52 回复
    • 悠扬
      :razz: 提供思路,不提供代码
      悠扬2021-12-24 11:50 回复