聊聊 Sharding-JDBC 分库分表(二)

love374
发布于 2022-7-12 17:07
浏览
0收藏

 

Sharding-JDBC 介绍
Sharding-JDBC 是当当网研发的开源分布式数据库中间件,从 3.0 开始Sharding-JDBC被包含在 Sharding-Sphere 中,之后该项目进入进入Apache孵化器,4.0版本之后的版本为Apache版本。

 

ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈,由Sharding-JDBC、Sharding-Proxy、Sharding-Sidecar(规划中)组成。

“官网:https://shardingsphere.apache.org”


目前我们只需要关注Sharding-JDBC,后面的两种组件后文介绍。

 

Sharding-JDBC 的定位是一款轻量级JAVA框架,基于JDBC实现分库分表,通过Sharding-JDBC可以透明的访问已经经过分库、分表的数据源。

 

Sharding-JDBC的特性如下:

  1. 适用于任何基于Java的ORM框架,如:Hibernate, Mybatis, Spring JDBC Template或直接使用JDBC。
  2. 基于任何第三方的数据库连接池,如:DBCP, C3P0, BoneCP, Druid, HikariCP等。
  3. 支持任意实现JDBC规范的数据库。目前支持MySQL,Oracle,SQLServer和PostgreSQL。


Sharding-JDBC 中的一些概念
在介绍Sharding-JDBC 实战之前需要了解其中的一些概念,如下:

 

1. 逻辑表
在对表进行分片后,一张表分成了n个表,比如订单表t_order分成如下三张表:t_order_1,t_order_2,t_order_3。

 

此时订单表的逻辑表就是t_order,Sharding-JDBC在进行分片规则配置时针对的就是这张逻辑表

 

2. 真实表
上述t_ordr_1,t_order_2,t_order_3 称之为 真实表

 

3. 数据节点
数据分片的最小单元,由数据源名称和表名称组成,比如:ds1.t_order_1

 

4. 分片键
用于分片的数据库字段,是将数据库(表)水平拆分的关键字段。例:将订单表中的订单主键的尾数取模分片,则订

 

单主键为分片字段。SQL中如果无分片字段,将执行全路由,性能较差。除了对单分片字段的支持,Sharding- Jdbc也支持根据多个字段进行分片。

 

5. 分片算法
通过分片算法将数据分片,支持通过 = 、 BETWEEN 和 IN 分片。

 

分片算法需要应用方开发者自行实现,可实现的灵 活度非常高。包括:精确分片算法 、范围分片算法 ,复合分片算法 等。例如:where order_id = ? 将采用精确分片算法,where order_id in (?,?,?)将采用精确分片算法,where order_id BETWEEN ? and ? 将采用范围分片算 法,复合分片算法用于分片键有多个复杂情况。

 

“Sharding-JDBC 中的分片算法需要开发者根据业务自定义”


6. 分片策略
包含分片键和分片算法,由于分片算法的独立性,将其独立抽离。真正可用于分片操作的是分片键 + 分片算法,也 就是分片策略。

 

内置的分片策略大致可分为尾数取模、哈希、范围、标签、时间等。由用户方配置的分片策略则更加灵活,常用的使用行表达式配置分片策略,它采用Groovy表达式表示,如: t_user_$->{u_id % 8} 表示t_user 表根据u_id模8,而分成8张表,表名称为 t_user_0 到 t_user_7 。

 

1、标准分片策略

标准分片策略适用于单分片键,此策略支持 PreciseShardingAlgorithm 和 RangeShardingAlgorithm 两个分片算法。

 

其中 PreciseShardingAlgorithm 是必选的,用于处理 = 和 IN 的分片。RangeShardingAlgorithm 是可选的,用于处理BETWEEN AND, >, <,>=,<= 条件分片,如果不配置RangeShardingAlgorithm,SQL中的条件等将按照全库路由处理。

 

2、复合分片策略

复合分片策略,同样支持对 SQL语句中的 =,>, <, >=, <=,IN和 BETWEEN AND 的分片操作。不同的是它支持多分片键,具体分配片细节完全由应用开发者实现。

 

3、行表达式分片策略

行表达式分片策略,支持对 SQL语句中的 = 和 IN 的分片操作,但只支持单分片键。这种策略通常用于简单的分片,不需要自定义分片算法,可以直接在配置文件中接着写规则。

 

t_order_$->{t_order_id % 4} 代表 t_order 对其字段 t_order_id取模,拆分成4张表,而表名分别是t_order_0 到 t_order_3。

 

4、Hint分片策略

Hint分片策略,对应上边的Hint分片算法,通过指定分片健而非从 SQL中提取分片健的方式进行分片的策略。

 

7. 分布式主键生成策略
通过在客户端生成自增主键替换以数据库原生自增主键的方式,做到分布式主键无重复。

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

文章转自公众号:码猿技术专栏

标签
已于2022-7-12 17:07:08修改
收藏
回复
举报
回复
    相关推荐