首页 > 其他分享 >记录学习 ShardingSphere 遇到的坑

记录学习 ShardingSphere 遇到的坑

时间:2023-05-23 10:56:13浏览次数:50  
标签:遇到 ShardingSphere 记录 id 算法 名称 分片 sharding order

 首先 来一下 官网文档地址:概览 :: ShardingSphere

一、数据库

分为2个库,每个库有2张表

​编辑

 

二、配置

官方有很多配置方式(ShardingSphere-JDBC :: ShardingSphere),这边使用的是YAML配置(YAML 配置 :: ShardingSphere

规则配置:数据分片遇到的坑

以下是官方给出的参数配置解释:

rules:
- !SHARDING
  tables: # 数据分片规则配置
    <logic-table-name> (+): # 逻辑表名称
      actualDataNodes (?): # 由数据源名 + 表名组成(参考 Inline 语法规则)
      databaseStrategy (?): # 分库策略,缺省表示使用默认分库策略,以下的分片策略只能选其一
        standard: # 用于单分片键的标准分片场景
          shardingColumn: # 分片列名称
          shardingAlgorithmName: # 分片算法名称
        complex: # 用于多分片键的复合分片场景
          shardingColumns: # 分片列名称,多个列以逗号分隔
          shardingAlgorithmName: # 分片算法名称
        hint: # Hint 分片策略
          shardingAlgorithmName: # 分片算法名称
        none: # 不分片
      tableStrategy: # 分表策略,同分库策略
      keyGenerateStrategy: # 分布式序列策略
        column: # 自增列名称,缺省表示不使用自增主键生成器
        keyGeneratorName: # 分布式序列算法名称
      auditStrategy: # 分片审计策略
        auditorNames: # 分片审计算法名称
          - <auditor-name>
          - <auditor-name>
        allowHintDisable: true # 是否禁用分片审计hint
  autoTables: # 自动分片表规则配置
    t_order_auto: # 逻辑表名称
      actualDataSources (?): # 数据源名称
      shardingStrategy: # 切分策略
        standard: # 用于单分片键的标准分片场景
          shardingColumn: # 分片列名称
          shardingAlgorithmName: # 自动分片算法名称
  bindingTables (+): # 绑定表规则列表
    - <logic_table_name_1, logic_table_name_2, ...> 
    - <logic_table_name_1, logic_table_name_2, ...> 
  broadcastTables (+): # 广播表规则列表
    - <table-name>
    - <table-name>
  defaultDatabaseStrategy: # 默认数据库分片策略
  defaultTableStrategy: # 默认表分片策略
  defaultKeyGenerateStrategy: # 默认的分布式序列策略
  defaultShardingColumn: # 默认分片列名称
  
  # 分片算法配置
  shardingAlgorithms:
    <sharding-algorithm-name> (+): # 分片算法名称
      type: # 分片算法类型
      props: # 分片算法属性配置
      # ...
  
  # 分布式序列算法配置
  keyGenerators:
    <key-generate-algorithm-name> (+): # 分布式序列算法名称
      type: # 分布式序列算法类型
      props: # 分布式序列算法属性配置
      # ...
  # 分片审计算法配置
  auditors:
    <sharding-audit-algorithm-name> (+): # 分片审计算法名称
      type: # 分片审计算法类型
      props: # 分片审计算法属性配置
      # ...

以下是官方给出的配置示例:

dataSources:
  ds_0:
    dataSourceClassName: com.zaxxer.hikari.HikariDataSource
    driverClassName: com.mysql.jdbc.Driver
    jdbcUrl: jdbc:mysql://localhost:3306/demo_ds_0?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF-8
    username: root
    password:
  ds_1:
    dataSourceClassName: com.zaxxer.hikari.HikariDataSource
    driverClassName: com.mysql.jdbc.Driver
    jdbcUrl: jdbc:mysql://localhost:3306/demo_ds_1?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF-8
    username: root
    password:

rules:
- !SHARDING
  tables:
    t_order: 
      actualDataNodes: ds_${0..1}.t_order_${0..1}
      tableStrategy: 
        standard:
          shardingColumn: order_id
          shardingAlgorithmName: t-order-inline
      keyGenerateStrategy:
        column: order_id
        keyGeneratorName: snowflake
      auditStrategy:
        auditorNames:
          - sharding_key_required_auditor
        allowHintDisable: true
    t_order_item:
      actualDataNodes: ds_${0..1}.t_order_item_${0..1}
      tableStrategy:
        standard:
          shardingColumn: order_id
          shardingAlgorithmName: t_order-item-inline
      keyGenerateStrategy:
        column: order_item_id
        keyGeneratorName: snowflake
    t_account:
      actualDataNodes: ds_${0..1}.t_account_${0..1}
      tableStrategy:
        standard:
          shardingAlgorithmName: t-account-inline
      keyGenerateStrategy:
        column: account_id
        keyGeneratorName: snowflake
  defaultShardingColumn: account_id
  bindingTables:
    - t_order,t_order_item
  broadcastTables:
    - t_address
  defaultDatabaseStrategy:
    standard:
      shardingColumn: user_id
      shardingAlgorithmName: database-inline
  defaultTableStrategy:
    none:
  
  shardingAlgorithms:
    database-inline:
      type: INLINE
      props:
        algorithm-expression: ds_${user_id % 2}
    t-order-inline:
      type: INLINE
      props:
        algorithm-expression: t_order_${order_id % 2}
    t_order-item-inline:
      type: INLINE
      props:
        algorithm-expression: t_order_item_${order_id % 2}
    t-account-inline:
      type: INLINE
      props:
        algorithm-expression: t_account_${account_id % 2}
  keyGenerators:
    snowflake:
      type: SNOWFLAKE
  auditors:
    sharding_key_required_auditor:
      type: DML_SHARDING_CONDITIONS

props:
  sql-show: false

第一个坑:按官方给出的配置一直报错:找不到逻辑表名

org.springframework.jdbc.BadSqlGrammarException: 
### Error updating database.  Cause: java.sql.SQLSyntaxErrorException: Table 'sharding_jdbc_order01.t_order' doesn't exist
### The error may exist in com/sharding/jdbc/test/mapper/OrderMapper.java (best guess)
### The error may involve com.sharding.jdbc.test.mapper.OrderMapper.insert-Inline
### The error occurred while setting parameters
### SQL: INSERT INTO t_order  ( id, order_no, user_id, amount )  VALUES  ( ?, ?, ?, ? )
### Cause: java.sql.SQLSyntaxErrorException: Table 'sharding_jdbc_order01.t_order' doesn't exist
; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Table 'sharding_jdbc_order01.t_order' doesn't exist

解决办法:在rules下边加上sharding

 rules:
    #需要加上sharding
   sharding:
     tables:

第二个坑:分片算法名称必须是中划线,如果是下划线就会报下边的错

Caused by: org.apache.shardingsphere.spi.exception.ServiceProviderNotFoundException: No implementation class load from SPI `org.apache.shardingsphere.sharding.spi.ShardingAlgorithm` with type `null`.
	at org.apache.shardingsphere.spi.typed.TypedSPIRegistry.getRegisteredService(TypedSPIRegistry.java:76)
	at org.apache.shardingsphere.spring.boot.registry.AbstractAlgorithmProvidedBeanRegistry.lambda$registerBean$2(AbstractAlgorithmProvidedBeanRegistry.java:78)
	at java.util.LinkedHashMap.forEach(LinkedHashMap.java:684)
	at org.apache.shardingsphere.spring.boot.registry.AbstractAlgorithmProvidedBeanRegistry.registerBean(AbstractAlgorithmProvidedBeanRegistry.java:77)
	at org.apache.shardingsphere.sharding.spring.boot.algorithm.ShardingAlgorithmProvidedBeanRegistry.postProcessBeanDefinitionRegistry(ShardingAlgorithmProvidedBeanRegistry.java:38)

分片算法名称正确写法:

 rules:
      sharding:
        tables: # 数据分片规则配置
          t_order: # 逻辑表名称
            actualDataNodes: server-order0$->{0..1}.t_order$->{0..1} # 由数据源名 + 表名组成(参考 Inline 语法规则)
            databaseStrategy: # 分库策略,缺省表示使用默认分库策略,以下的分片策略只能选其一
              standard: # 用于单分片键的标准分片场景
                shardingColumn: user_id # 分片列名称(数据库列字段,用户名称)
                shardingAlgorithmName: t-order-inline # 分片算法名称(必须以中划线命名)

          #分片算法配置
         shardingAlgorithms:
          #行表达式分片算法
          t-order-inline: # 分片算法名称(必须以中划线命名)
            # type 和 props,请参考分片内置算法:https://shardingsphere.apache.org/document/current/cn/user-manual/common-config/builtin-algorithm/sharding/
            type: INLINE # 分片算法类型
            props: # 分片算法属性配置
              #t_order0$->{user_id % 2} 表示 t_order 表根据 user_id 取模(取余) 2,而分成 2 张表,表名称为 t_order01 到 t_order02
              algorithm-expression: server-order0$->{user_id % 2}

分片算法名称错误写法:

rules:
  sharding:
    tables: # 数据分片规则配置
      t_order: # 逻辑表名称
         actualDataNodes: server-order0$->{0..1}.t_order$->{0..1} # 由数据源名 + 表名组成(参考 Inline 语法规则)
           databaseStrategy: # 分库策略,缺省表示使用默认分库策略,以下的分片策略只能选其一
              standard: # 用于单分片键的标准分片场景
                shardingColumn: user_id # 分片列名称(数据库列字段)
                shardingAlgorithmName: t_order_inline # 分片算法名称(不能用下划线命名)
    
    #分片算法配置
    shardingAlgorithms:
       #行表达式分片算法
       t_order_inline: # 分片算法名称(不能用下划线命名)
            # type 和 props,请参考分片内置算法:https://shardingsphere.apache.org/document/current/cn/user-manual/common-config/builtin-algorithm/sharding/
            type: INLINE # 分片算法类型
            props: # 分片算法属性配置
              #t_order0$->{user_id % 2} 表示 t_order 表根据 user_id 取模(取余) 2,而分成 2 张表,表名称为 t_order01 到 t_order02
              algorithm-expression: server-order0$->{user_id % 2}

暂时就遇到这两个,先记录一下,后续如果在遇到会继续写。

标签:遇到,ShardingSphere,记录,id,算法,名称,分片,sharding,order
From: https://www.cnblogs.com/fenghd/p/17422648.html

相关文章

  • SQL删除重复的记录(只保留一条)
    首先新建表:--创建示例表CREATETABLEt(idINTIDENTITY(1,1)PRIMARYKEY,aVARCHAR(10),bVARCHAR(10))--插入数据INSERTINTOtSELECT'aa','bb'UNIONALLSELECT'a1','bgb'UNIONALLSELECT'aa','bb'UNION......
  • C1手动挡练车实操学习记录-科目三
    科目三:道路考试 一、挡位与速度挡位作用:1挡起步,2挡拐弯,3挡行驶,4挡提速。 口诀:1(挡)不过2(20迈),2(挡)不过3(30迈),3(挡)不过4(40迈) 1、逢5加挡迈速15:1挡换2挡;迈速25:2挡换3挡;迈速35:3挡换4挡; 2、逢0减挡迈速30:4挡换3挡;迈速20:3挡换2挡;迈速10:2挡换1挡。 二、转弯转弯让直行,右......
  • R语言学习记录
    2021年买的课程,今天终于开始正式学习了,这个故事告诉我们,学术还是得硕博时期搞,一旦毕业工作了,杂七杂八的事情太多,再加上家庭等因素,就会导致一拖再拖。首先,第一件事,放下焦虑,什么时候我变成了特别想一下子学会某件事情,而不再享受学习过程逐渐习得的快乐了呢?老师说,需要100小时才算是......
  • vue3遇到的问题集合
    1.vue3打包设置 2.vue3路由配置history 3.vue3屏蔽eslint ......
  • 记录--九个超级好用的 Javascript 技巧
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助前言在实际的开发工作过程中,积累了一些常见又超级好用的Javascript技巧和代码片段,包括整理的其他大神的JS使用技巧,今天筛选了9个,以供大家参考。1、动态加载JS文件在一些特殊的场景下,特别是一些库和框架......
  • 监控调用接口记录日志
    1、监控中间件publicclassOuterApiMonitorMiddleware:IMiddleware{//privatereadonlyILogger<OuterApiMonitorMiddleware>_logger;privatereadonlyIOuterApiLogger_apiLog;publicOuterApiMonitorMiddleware(/*ILogger<OuterApiMonitorMiddlewa......
  • 读取数据库JSON格式数据信息处理办法记录
    遇到的问题:现有代码如下defListQuery(self):sql01="SELECTcontentFROMzt_user_customdata\WHERErealname='alarm-server'ANDaccount='alarm-server'"result01=self.CommonQueryFunc(sql01)result02=str(resu......
  • 安装mysql服务遇到的问题
    找不到MSVCR120.dll,无继续法执行代码”官方链接MicrosoftVisualC++可再发行的最新下载mysqld:Can'tcreate/writetofile'Drowerdownload\mysql-5.7.19-winx64\mysql-5.7.19-winx64\data\is_writable'(Errcode:2-Nosuchfileordirectory)把my.ini移动到bin目录下......
  • 遇到的问题之"数据库编写SQL-》子查询中加入limit报错:This version of MySQL doesn't
    一、问题 >1235-ThisversionofMySQLdoesn'tyetsupport'LIMIT&IN/ALL/ANY/SOMEsubquery'二、原因/解决方案这个错误通常是由于MySQL版本太旧导致的。在旧版本的MySQL中,无法在子查询中使用LIMIT和IN/ALL/ANY/SOME子查询。您需要升级到MySQL的较新版本,以解决......
  • 【React工作记录五十八】函数方式渲染页面
     前言我是歌谣我有个兄弟巅峰的时候排名c站总榜19叫前端小歌谣曾经我花了三年的时间创作了他现在我要用五年的时间超越他今天又是接近兄弟的一天人生难免坎坷大不了从头再来歌谣的意志是永恒的放弃很容易但是坚持一定很酷导语项目中添加按钮的两种方式编辑核心实现代码......