MySQL系列-05ShardingSphere

MySQL与ShardingSphere数据分片解析

1.介绍

1.1什么是ShardingSphere

   Apache ShardingSphere是一款开源的分布式数据库中间件组成的生态圈。它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar(规划中)这3款相互独立的产品组成。 他们均提供标准化的数据分片、分布式事务和数据库治理功能,可适用于如Java同构、异构语言、容器、云原生等各种多样化的应用场景。ShardingSphere定位为关系型数据库中间件,旨在充分合理地在分布式的场景下利用关系型数据库的计算和存储能力,而并非实现一个全新的关系型数据库。

Apache ShardingSphere

  • Sharding-JDBC:被定位为轻量级Java框架,在Java的JDBC层提供的额外服务,以jar包形式使用。
  • Sharding-Proxy:被定位为透明化的数据库代理端,提供封装了数据库二进制协议的服务端版本,用于完成对异构语言的支持。
  • Sharding-Sidecar:被定位为Kubernetes或Mesos的云原生数据库代理,以DaemonSet的形式代理所有对数据库的访问。

1.2三者对比

ShardingSphere安装包下载:下载 :: ShardingSphere

2.数据分片剖析

2.1核心概念

2.1.1表概念
  1. 真实表:数据库中真实存在的物理表。例如b_order0、b_order1
  2. 逻辑表:在分片之后,同一类表结构的名称(总成)。例如b_order
  3. 数据节点:在分片之后,由数据源和数据表组成。例如ds0.b_order1
  4. 绑定表:指的是分片规则一致的关系表(主表、子表),例如b_order和b_order_item,均按照order_id分片,则此两个表互为绑定表关系。绑定表之间的多表关联查询不会出现笛卡尔积关联,可以提升关联查询效率。
  5. 广播表:在使用中,有些表没必要做分片,例如字典表、省份信息等,因为他们数据量不大,而且这种表可能需要与海量数据的表进行关联查询。广播表会在不同的数据节点上进行存储,存储的表结构和数据完全相同。

2.1.2分片算法

   由于分片算法和业务实现紧密相关,ShardingJDBC提供更高层级的抽象,提供接口让应用开发者自行实现分片算法。目前提供4种分片算法接口。

算法

名称

说明

PreciseShardingAlgorithm

精确分片算法

用于处理使用单一键作为分片键的=与IN进行分片的场景

RangeShardingAlgorithm

范围分片算法

用于处理使用单一键作为分片键的BETWEEN AND、>、<、>=、<=进行分片的场景

ComplexKeysShardingAlgorithm

复合分片算法

用于处理使用多键作为分片键进行分片的场景,多个分片键的逻辑较复杂,需要应用开发者
自行处理其中的复杂度。

HintShardingAlgorithm

Hint分片算法

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

2.1.3分片策略

   分片策略包含分片键和分片算法,真正可用于分片操作的是分片键 + 分片算法,也就是分片策略。目前提供5种分片策略

策略

名称

说明

StandardShardingStrategy

标准分片策略

只支持单分片键,提供对SQL语句中的=, >, <, >=, <=, IN和BETWEEN AND的分片操作支持。
提供PreciseShardingAlgorithm和RangeShardingAlgorithm两个分片算法。
PreciseShardingAlgorithm是必选的,RangeShardingAlgorithm是可选的。但是SQL中使用
了范围操作,如果不配置RangeShardingAlgorithm会采用全库路由扫描,效率低。

ComplexShardingStrategy

复合分片策略

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

InlineShardingStrategy

行表达式分片策略

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

HintShardingStrategy

Hint分片策略

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

NoneShardingStrategy

不分片策略

不分片的策略

2.2SQL使用规范

2.2.1支持项
  1. 路由至单数据节点时,目前MySQL数据库100%全兼容,其他数据库完善中。
  2. 路由至多数据节点时,全面支持DQL、DML、DDL、DCL、TCL。支持分页、去重、排序、分组、聚合、关联查询(不支持跨库关联)。以下用最为复杂的查询为例:
SELECT select_expr [, select_expr ...]
FROM table_reference [, table_reference ...]
[WHERE predicates]
[GROUP BY {col_name | position} [ASC | DESC], ...]
[ORDER BY {col_name | position} [ASC | DESC], ...]
[LIMIT {[offset,] row_count | row_count OFFSET offset}]

2.2.2不支持项
  1. 不支持CASE WHEN、HAVING、UNION (ALL)
  2. 子查询中又嵌套了子查询不支持
SELECT COUNT(*) FROM (SELECT * FROM b_order o) --支持
 
SELECT COUNT(*) FROM (SELECT * FROM b_order o WHERE o.id IN (SELECT id
FROM b_order WHERE status = ?)) --不支持
  1. 由于归并的限制,子查询中包含聚合函数目前无法支持
  2. 不支持包含schema的SQL。因为ShardingSphere的理念是像使用一个数据源一样使用多数据源,因此对SQL的访问都是在同一个逻辑schema之上。
  3. 当分片键处于运算表达式或函数中的SQL时,将采用全路由的形式获取结果 (create_time为分片键 )
SELECT * FROM b_order WHERE to_date(create_time, 'yyyy-mm-dd') = '2020-
05-05';

2.3其他功能

2.3.1Inline行表达式
  1. 介绍
       InlineShardingStrategy:采用Inline行表达式进行分片的配置。
       Inline是可以简化数据节点和分片算法配置信息。主要是解决配置简化、配置一体化。
  2. 语法:行表达式的使用非常直观,只需要在配置中使用

    ->{ expression } 标识行表达式即可。
${begin..end} 表示范围区间
${[unit1, unit2, unit_x]} 表示枚举值
  1. 注意:行表达式中如果出现多个->{}表达式,整个表达式结果会将每个子表达式结果进行笛卡尔(积)组合。
2.3.2数据节点配置
  1. 均匀分布的数据节点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值