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

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

ShardingSphere安装包下载:下载 :: ShardingSphere
2.数据分片剖析
2.1核心概念

2.1.1表概念
- 真实表:数据库中真实存在的物理表。例如b_order0、b_order1
- 逻辑表:在分片之后,同一类表结构的名称(总成)。例如b_order
- 数据节点:在分片之后,由数据源和数据表组成。例如ds0.b_order1
- 绑定表:指的是分片规则一致的关系表(主表、子表),例如b_order和b_order_item,均按照order_id分片,则此两个表互为绑定表关系。绑定表之间的多表关联查询不会出现笛卡尔积关联,可以提升关联查询效率。
- 广播表:在使用中,有些表没必要做分片,例如字典表、省份信息等,因为他们数据量不大,而且这种表可能需要与海量数据的表进行关联查询。广播表会在不同的数据节点上进行存储,存储的表结构和数据完全相同。
2.1.2分片算法
由于分片算法和业务实现紧密相关,ShardingJDBC提供更高层级的抽象,提供接口让应用开发者自行实现分片算法。目前提供4种分片算法接口。
| 算法 |
名称 |
说明 |
| PreciseShardingAlgorithm |
精确分片算法 |
用于处理使用单一键作为分片键的=与IN进行分片的场景 |
| RangeShardingAlgorithm |
范围分片算法 |
用于处理使用单一键作为分片键的BETWEEN AND、>、<、>=、<=进行分片的场景 |
| ComplexKeysShardingAlgorithm |
复合分片算法 |
用于处理使用多键作为分片键进行分片的场景,多个分片键的逻辑较复杂,需要应用开发者 |
| HintShardingAlgorithm |
Hint分片算法 |
用于处理使用Hint行分片的场景。对于分片字段非SQL决定,而由其他外置条件决定的场 |
2.1.3分片策略
分片策略包含分片键和分片算法,真正可用于分片操作的是分片键 + 分片算法,也就是分片策略。目前提供5种分片策略
| 策略 |
名称 |
说明 |
| StandardShardingStrategy |
标准分片策略 |
只支持单分片键,提供对SQL语句中的=, >, <, >=, <=, IN和BETWEEN AND的分片操作支持。 |
| ComplexShardingStrategy |
复合分片策略 |
支持多分片键。提供对SQL语句中的=, >, <, >=, <=, IN和BETWEEN AND的分片操作支持。由 |
| InlineShardingStrategy |
行表达式分片策略 |
只支持单分片键。使用Groovy的表达式,提供对SQL语句中的=和IN的分片操作支持,对于 |
| HintShardingStrategy |
Hint分片策略 |
通过Hint指定分片值而非从SQL中提取分片值的方式进行分片的策略 |
| NoneShardingStrategy |
不分片策略 |
不分片的策略 |
2.2SQL使用规范
2.2.1支持项
- 路由至单数据节点时,目前MySQL数据库100%全兼容,其他数据库完善中。
- 路由至多数据节点时,全面支持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不支持项
- 不支持CASE WHEN、HAVING、UNION (ALL)
- 子查询中又嵌套了子查询不支持
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 = ?)) --不支持
- 由于归并的限制,子查询中包含聚合函数目前无法支持
- 不支持包含schema的SQL。因为ShardingSphere的理念是像使用一个数据源一样使用多数据源,因此对SQL的访问都是在同一个逻辑schema之上。
- 当分片键处于运算表达式或函数中的SQL时,将采用全路由的形式获取结果 (create_time为分片键 )
SELECT * FROM b_order WHERE to_date(create_time, 'yyyy-mm-dd') = '2020-
05-05';
2.3其他功能
2.3.1Inline行表达式
- 介绍
InlineShardingStrategy:采用Inline行表达式进行分片的配置。
Inline是可以简化数据节点和分片算法配置信息。主要是解决配置简化、配置一体化。 - 语法:行表达式的使用非常直观,只需要在配置中使用
->{ expression } 标识行表达式即可。
${begin..end} 表示范围区间
${[unit1, unit2, unit_x]} 表示枚举值
- 注意:行表达式中如果出现多个->{}表达式,整个表达式结果会将每个子表达式结果进行笛卡尔(积)组合。
2.3.2数据节点配置
- 均匀分布的数据节点

最低0.47元/天 解锁文章
2463

被折叠的 条评论
为什么被折叠?



