分表分库之ShardingSphereJDBC

一、什么是ShardingSphereJDBC

ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈,它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar(计划中)这3款的产品组成。 他们均提供标准化的数据分片、分布式事务和数据库治理功能,可适用于如Java同构、异构语言、云原生等各种多样化的应用场景。Apache ShardingSphere 设计哲学为 Database Plus,旨在构建异构数据库上层的标准和生态。 它关注如何充分合理地利用数据库的计算和存储能力,而并非实现一个全新的数据库。 它站在数据库的上层视角,关注它们之间的协作多于数据库自身。
定位为轻量级Java框架,在Java的JDBC层提供的额外服务。 它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完全兼容JDBC和各种ORM框架。
1)适用于任何基于JDBC的ORM框架,如:JPA, Hibernate, Mybatis, Spring JDBC Template或直接使用JDBC。
2)支持任何第三方的数据库连接池,如:DBCP, C3P0, BoneCP, Druid, HikariCP等。
3)支持任意实现JDBC规范的数据库。目前支持MySQL,Oracle,SQLServer,PostgreSQL以及任何遵循SQL92标准的数据库。

二、ShardingSphereJDBC核心功能

1、数据分片
2、读写分离
3、编排治理
4、分布式事务
5、SPI

核心概念
垂直分片:按照业务拆分的方式称为垂直分片,又称为纵向拆分,它的核心理念是专库专用。 在拆分之前,一个数据库由多个数据表构成,每个表对应着不同的业务。而拆分之后,则是按照业务将表进行归类,分布到不同的数据库中,从而将压力分散至不同的数据库。 下图展示了根据业务需要,将用户表和订单表垂直分片到不同的数据库的方案。
在这里插入图片描述
垂直分片往往需要对架构和设计进行调整。通常来讲,是来不及应对互联网业务需求快速变化的;而且,它也并无法真正的解决单点瓶颈。如果垂直拆分之后,表中的数据量依然超过单节点所能承载的阈值,则需要水平分片来进一步处理。
水平分片:水平分片又称为横向拆分。 相对于垂直分片,它不再将数据根据业务逻辑分类,而是通过某个字段(或某几个字段),根据某种规则将数据分散至多个库或表中,每个分片仅包含数据的一部分。 例如:根据主键分片,偶数主键的记录放入0库(或表),奇数主键的记录放入1库(或表),如下图所示。
在这里插入图片描述
水平分片从理论上突破了单机数据量处理的瓶颈,并且扩展相对自由,是分库分表的标准解决方案
逻辑表
水平拆分的数据库(表)的相同逻辑和数据结构表的总称。例:订单数据根据主键尾数拆分为10张表,分别是t_order_0到t_order_9,他们的逻辑表名为t_order。
真实表
在分片的数据库中真实存在的物理表。即上个示例中的t_order_0到t_order_9。
数据节点
数据分片的最小单元。由数据源名称和数据表组成,例:ds_0.t_order_0。
广播表
指所有的分片数据源中都存在的表,表结构和表中的数据在每个数据库中均完全一致。适用于数据量不大且需要与海量数据的表进行关联查询的场景,例如:字典表。
绑定表
指分片规则一致的主表和子表。例如:t_order表和t_order_item表,均按照order_id分片,则此两张表互为绑定表关系。绑定表之间的多表关联查询不会出现笛卡尔积关联,关联查询效率将大大提升。举例说明,如果SQL为:
在这里插入图片描述
在不配置绑定表关系时,假设分片键order_id将数值10路由至第0片,将数值11路由至第1片,那么路由后的SQL应该为4条,它们呈现为笛卡尔积:
在这里插入图片描述
在配置绑定表关系后,路由的SQL应该为2条:
在这里插入图片描述
其中t_order在FROM的最左侧,ShardingSphere将会以它作为整个绑定表的主表。 所有路由计算将会只使用主表的策略,那么t_order_item表的分片计算将会使用t_order的条件。故绑定表之间的分区键要完全相同。

分片算法

分片键是用于分片的数据库字段,是将数据库(表)水平拆分的关键字段。例:将订单表中的订单主键的尾数取模分片,则订单主键为分片字段。 SQL中如果无分片字段,将执行全路由,性能较差。 除了对单分片字段的支持,ShardingSphere也支持根据多个字段进行分片。
分片算法是用于将数据分片的算法,常用分片算法有取模、哈希、范围、时间等。

分片策略

包含分片键和分片算法,由于分片算法的独立性,将其独立抽离。真正可用于分片操作的是分片键 + 分片算法,也就是分片策略。目前提供5种分片策略:

1. 标准分片策略

对应StandardShardingStrategy。提供对SQL语句中的=, >, <, >=, <=, IN和BETWEEN AND的分片操作支持。StandardShardingStrategy只支持单分片键,提供PreciseShardingAlgorithm和RangeShardingAlgorithm两个分片算法。PreciseShardingAlgorithm是必选的,用于处理=和IN的分片。RangeShardingAlgorithm是可选的,用于处理BETWEEN AND, >, <, >=, <=分片,如果不配置RangeShardingAlgorithm,SQL中的BETWEEN AND将按照全库路由处理

2. 复合分片策略

对应ComplexShardingStrategy。复合分片策略。提供对SQL语句中的=, >, <, >=, <=, IN和BETWEEN AND的分片操作支持。ComplexShardingStrategy支持多分片键,由于多分片键之间的关系复杂,因此并未进行过多的封装,而是直接将分片键值组合以及分片操作符透传至分片算法,完全由应用开发者实现,提供最大的灵活度。

3. 行表达式分片策略

对应InlineShardingStrategy。使用Groovy的表达式,提供对SQL语句中的=和IN的分片操作支持,只支持单分片键。对于简单的分片算法,可以通过简单的配置使用,从而避免繁琐的Java代码开发,如: t_user_$->{u_id % 8} 表示t_user表根据u_id模8,而分成8张表,表名称为t_user_0到t_user_7。

4. Hint分片策略

对应HintShardingStrategy。通过Hint指定分片值而非从SQL中提取分片值的方式进行分片的策略。

5. 不分片策略

对应NoneShardingStrategy。不分片的策略。

三、ShardingSphereJDBC工作原理

使用ShardingJDBC时,我们仅需把分片策略定义好,ShardingJDBC会按照我们定义好的分片策略对数据进行分片路由到数据节点,透明化了水平分库分表所带来的影响。让使用方尽量像使用一个数据库一样使用水平分片之后的数据库集群,或者像使用一个数据表一样使用水平分片之后的数据表。
在这里插入图片描述
在这里插入图片描述
当一个 Java 应用服务器节点执行一个查询 SQL时,ShardingJDBC要做下面几件事:
1)SQL 解析:解析分为词法解析和语法解析。先通过词法解析器将这句 SQL 拆分为一个个不可再分的单词,再使用语法解析器对 SQL 进行理解,并最终提炼出解析上下文。简单来说就是理解这句 SQL,明白它的构造和行为,这是下面的优化、路由、改写、执行和归并的基础。
2)SQL 路由:根据解析上下文匹配用户对这句 SQL 所涉及的库和表配置的分片策略,并根据分片策略生成路由后的 SQL。路由后的 SQL 有一条或多条,每一条都对应着各自的真实物理分片。
3)SQL 改写:将 SQL 改写为在真实数据库中可以正确执行的语句(逻辑 SQL 到物理 SQL 的映射,例如把逻辑表名改成带编号的分片表名)。
4)SQL 执行:执行路由和改写之后得到的 SQL 语句。
5)结果归并:将多个执行结果集归并组合成为一个结果集并正确的返回至请求客户端。

四、ShardingSphereJDBC在项目中的实践

在这里插入图片描述
在这里插入图片描述
以上谢谢大家!

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-21 18:24:02       52 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-21 18:24:02       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-21 18:24:02       45 阅读
  4. Python语言-面向对象

    2024-07-21 18:24:02       55 阅读

热门阅读

  1. Leetcode热题100 Day3

    2024-07-21 18:24:02       13 阅读
  2. SQL Server查询计划阅读及分析

    2024-07-21 18:24:02       15 阅读
  3. 【整理了一些关于使用swoole使用的解决方案】

    2024-07-21 18:24:02       15 阅读
  4. Vue中如何封装接口

    2024-07-21 18:24:02       19 阅读
  5. happens-before

    2024-07-21 18:24:02       14 阅读
  6. 如何实现宝塔面板免手机号登录?

    2024-07-21 18:24:02       17 阅读
  7. 自动化炒股:券商交易接口API调用方法

    2024-07-21 18:24:02       18 阅读
  8. Redis的过期删除策略与内存淘汰机制

    2024-07-21 18:24:02       20 阅读
  9. vivado INTERNAL_VREF

    2024-07-21 18:24:02       16 阅读
  10. 商品价格中也有“歧视”

    2024-07-21 18:24:02       14 阅读
  11. Unity3D UGUI适配不同分辨率详解

    2024-07-21 18:24:02       16 阅读