ShardingSphere jdbc实现分库分表核心概念详解

 更新时间:2022年12月11日 17:17:39   作者:刨红薯的小羊竿尔  
这篇文章主要为大家介绍了ShardingSphere jdbc实现分库分表核心概念详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

ShardingSphere

ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈,它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar(计划中)这3款相互独立的产品组成。他们均提供标准化的数据分片、分布式事务和数据库治理功能。

Sharding-JDBC

定位为轻量级Java框架,在Java的JDBC层提供的额外服务。 它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完全兼容JDBC和各种ORM框架。

1)适用于任何基于Java的ORM框架,如:JPA, Hibernate, Mybatis, Spring JDBC Template或直接使用JDBC。

2)基于任何第三方的数据库连接池,如:DBCP, C3P0, BoneCP, Druid, HikariCP等。

3)支持任意实现JDBC规范的数据库。目前支持MySQL,Oracle,SQLServer和PostgreSQL。

Sharding-JDBC包含的一些核心概念

1)逻辑表-LogicTable

数据分片的逻辑表,对于水平拆分的数据库(表),同一类表的总称。例:订单数据根据主键尾数拆分为10张表,分别是t_order_0到t_order_9,他们的逻辑表名为t_order。

2)实际表-ActualTable

在分片的数据库中真实存在的物理表。即上个示例中的t_order_0到t_order_9。

3)数据节点-DataNode

数据分片的最小单元。由数据源名称和数据表组成,例:ds_1.t_order_0。配置时默认各个分片数据库的表结构均相同,直接配置逻辑表和真实表对应关系即可。如果各数据库的表结果不同,可使用ds.actual_table配置。

4)动态表-DynamicTable

逻辑表和真实表不一定需要在配置规则中静态配置。比如按照日期分片的场景,真实表的名称随着时间的推移会产生变化。此类需求Sharding-JDBC是支持的,不过目前配置并不友好,会在新版本中提升。

5)绑定表-BindingTable

指在任何场景下分片规则均一致的主表和子表。例:订单表和订单项表,均按照订单ID分片,则此两张表互为BindingTable关系。BindingTable关系的多表关联查询不会出现笛卡尔积关联,关联查询效率将大大提升。

6)分片键-ShardingColumn

分片字段。用于将数据库(表)水平拆分的关键字段。例:订单表订单ID分片尾数取模分片,则订单ID为分片字段。SQL中如果无分片字段,将执行全路由,性能较差。Sharding-JDBC支持多分片字段。

7)分片算法-ShardingAlgorithm

分片算法。Sharding-JDBC通过分片算法将数据分片,支持通过等号、BETWEEN和IN分片。分片算法目前需要业务方开发者自行实现,可实现的灵活度非常高。未来Sharding-JDBC也将会实现常用分片算法,如range,hash和tag等。

8)SQL Hint

对于分片字段非SQL决定,而由其他外置条件决定的场景,可使用SQL Hint灵活的注入分片字段。例:内部系统,按照员工登录ID分库,而数据库中并无此字段。SQL Hint支持通过ThreadLocal和SQL注释(待实现)两种方式使用。

9)广播表broadcastTable

所有的分⽚数据源中都存在的表,表结构和表中的数据在每个数据库中均完全⼀致,例如:数据字典表,公共配置表。

10)分布式主键生成策略

Sharding-JDBC 内部支持UUID和Snowflake生成分布式主键。

分片策略算法

ShardingSphere-JDBC在分片策略上分别引入了分片算法、分片策略两个概念,当然在分片的过程中分片键也是一个核心的概念;在此可以简单的理解分片策略 = 分片算法 + 分片键

分片算法

提供了抽象分片算法类:ShardingAlgorithm,根据类型又分为:精确分片算法、区间分片算法、复合分片算法以及Hint分片算法;

  • 精确分片算法:对应PreciseShardingAlgorithm类,主要用于处理 = 和 IN的分片;
public class PreciseDBShardingAlgorithm implements PreciseShardingAlgorithm<Long> {
    @Override
    public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<Long> shardingValue) {
        //todo
    }
}
  • 区间分片算法:对应RangeShardingAlgorithm类,主要用于处理 BETWEEN AND><>=<= 分片;
public class RangeShardingDBAlgorithm implements RangeShardingAlgorithm<Long> {
    @Override
    public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<Long> shardingValue) {
        //todo
    }
}
  • 复合分片算法:对应ComplexKeysShardingAlgorithm类,用于处理使用多键作为分片键进行分片的场景;
public class ComplexKeysShardingDBAlgorithm implements ComplexKeysShardingAlgorithm<Long> {
    @Override
    public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<Long> shardingValue) {
        //todo
    }
}
  • Hint分片算法:对应HintShardingAlgorithm类,用于处理使用 Hint 行分片的场景;
public class HintShardingDBAlgorithm implements HintShardingAlgorithm<Long> {
    @Override
    public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<Long> shardingValue) {
        //todo
    }
}

以上所有的算法类都是接口类,具体实现交给开发者自己。

分片策略

分片策略基本和上面的分片算法对应,包括:标准分片策略、复合分片策略、Hint分片策略、内联分片策略、不分片策略;

  • 标准分片策略:对应StandardShardingStrategy类,提供PreciseShardingAlgorithmRangeShardingAlgorithm两个分片算法,PreciseShardingAlgorithm是必须的,RangeShardingAlgorithm可选的;
public final class StandardShardingStrategy implements ShardingStrategy {
    private final String shardingColumn;
    private final PreciseShardingAlgorithm preciseShardingAlgorithm;
    private final RangeShardingAlgorithm rangeShardingAlgorithm;
}
  • 复合分片策略:对应ComplexShardingStrategy类,提供ComplexKeysShardingAlgorithm分片算法;可以发现支持多个分片键;
public final class ComplexShardingStrategy implements ShardingStrategy {
    @Getter
    private final Collection<String> shardingColumns;
    private final ComplexKeysShardingAlgorithm shardingAlgorithm;
}
  • Hint分片策略:对应HintShardingStrategy类,通过 Hint 指定分片值而非从 SQL 中提取分片值的方式进行分片的策略;提供HintShardingAlgorithm分片算法;
public final class HintShardingStrategy implements ShardingStrategy {
    @Getter
    private final Collection<String> shardingColumns;
    private final HintShardingAlgorithm shardingAlgorithm;
}
  • 内联分片策略:对应InlineShardingStrategy类,没有提供分片算法,路由规则通过表达式来实现;
  • 不分片策略:对应NoneShardingStrategy类,不分片策略;

分片策略配置类

在使用中我们并没有直接使用上面的分片策略类,ShardingSphere-JDBC分别提供了对应策略的配置类包括:

StandardShardingStrategyConfiguration

ComplexShardingStrategyConfiguration

HintShardingStrategyConfiguration

InlineShardingStrategyConfiguration

NoneShardingStrategyConfiguration

以上就是ShardingSphere jdbc实现分库分表核心概念详解的详细内容,更多关于ShardingSphere jdbc分库分表的资料请关注脚本之家其它相关文章!

相关文章

  • SpringBoot结合Ajax实现登录页面实例

    SpringBoot结合Ajax实现登录页面实例

    大家好,本篇文章主要讲的是SpringBoot结合Ajax实现登录页面实例,感兴趣的同学赶快来看一看,对你有帮助的话记得收藏一下
    2022-02-02
  • Java面向对象之什么是异常

    Java面向对象之什么是异常

    Java 把异常当作对象来处理,并定义一个基类,java.lang.Throwable 作为所有异常的超类。今天通过本文给大家分享Java面向对象之什么是异常,感兴趣的朋友一起看看吧
    2021-07-07
  • java中Map集合的常用方法总结大全

    java中Map集合的常用方法总结大全

    开发中最常用的就是List集合和Map集合,Map集合是基于java核心类java.util中的,下面这篇文章主要给大家总结介绍了关于java中Map集合的一些常用方法,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-01-01
  • SpringBoot项目防止反编译的方案

    SpringBoot项目防止反编译的方案

    最近项目要求部署到其他公司的服务器上,但是又不想将源码泄露出去,要求对正式环境的启动包进行安全性处理,防止客户直接通过反编译工具将代码反编译出来,所以本文给大家介绍了SpringBoot项目如何防止反编译,需要的朋友可以参考下
    2024-01-01
  • Java生成含字母和数字的6位随机字符串

    Java生成含字母和数字的6位随机字符串

    这篇文章主要为大家详细介绍了Java生成含字母和数字的6位随机字符串的相关资料,供大家参考,感兴趣的朋友可以参考一下
    2016-05-05
  • jpa EntityManager 复杂查询实例

    jpa EntityManager 复杂查询实例

    这篇文章主要介绍了jpa EntityManager 复杂查询实例,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • idea中如何查看类中所有方法列表

    idea中如何查看类中所有方法列表

    这篇文章主要介绍了idea中如何查看类中所有方法列表问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • Spring配置文件中密码明文改为密文处理的通用方式

    Spring配置文件中密码明文改为密文处理的通用方式

    SpringBoot和SpringCloud中涉及多个配置文件,配置文件中对于密码默认是明文方式,这种方式在生产环境一般是不被允许的,为避免配置文件中出现明文,应当在配置文件中配置为密文,然后在启动时在程序内部完成解密,本文提供了通用的处理方式,需要的朋友可以参考下
    2025-01-01
  • Java中的RocketMQ消费幂等详解

    Java中的RocketMQ消费幂等详解

    这篇文章主要介绍了Java中的RocketMQ消费幂等详解,当出现消费者对某条消息重复消费的情况时,重复消费的结果与消费一次的结果是相同的,并且多次消费并未对业务系统业务产生任何负面影响,那么这个消费过程就是消息幂等,需要的朋友可以参考下
    2023-10-10
  • SpringBoot拦截器使用精讲

    SpringBoot拦截器使用精讲

    拦截器可以根据 URL 对请求进行拦截,主要应用于登陆校验、权限验证、乱码解决、性能监控和异常处理等功能上。SpringBoot同样提供了拦截器功能。 本文将为大家详细介绍一下
    2021-12-12

最新评论