-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
3598601
commit 519a203
Showing
8 changed files
with
480 additions
and
58 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,195 @@ | ||
--- | ||
title: 核心概念 | ||
category: shardingsphere | ||
tag: | ||
- shardingsphere-jdbc | ||
- 分库分表 | ||
head: | ||
- - meta | ||
- name: keywords | ||
content: 分库分表,shardingsphere,设计 | ||
- - meta | ||
- name: description | ||
content: 本小节主要介绍数据分片的核心概念,主要包括SQL核心概念、分片核心概念、配置核心概念 | ||
--- | ||
## 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为: | ||
|
||
```sql | ||
SELECT i.* FROM t_order o JOIN t_order_item i ON o.order_id=i.order_id WHERE o.order_id in (10, 11); | ||
``` | ||
|
||
在不配置绑定表关系时,假设分片键`order_id`将数值10路由至第0片,将数值11路由至第1片,那么路由后的SQL应该为4条,它们呈现为笛卡尔积: | ||
|
||
```sql | ||
SELECT i.* FROM t_order_0 o JOIN t_order_item_0 i ON o.order_id=i.order_id WHERE o.order_id in (10, 11); | ||
|
||
SELECT i.* FROM t_order_0 o JOIN t_order_item_1 i ON o.order_id=i.order_id WHERE o.order_id in (10, 11); | ||
|
||
SELECT i.* FROM t_order_1 o JOIN t_order_item_0 i ON o.order_id=i.order_id WHERE o.order_id in (10, 11); | ||
|
||
SELECT i.* FROM t_order_1 o JOIN t_order_item_1 i ON o.order_id=i.order_id WHERE o.order_id in (10, 11); | ||
``` | ||
|
||
在配置绑定表关系后,路由的SQL应该为2条: | ||
|
||
```sql | ||
SELECT i.* FROM t_order_0 o JOIN t_order_item_0 i ON o.order_id=i.order_id WHERE o.order_id in (10, 11); | ||
|
||
SELECT i.* FROM t_order_1 o JOIN t_order_item_1 i ON o.order_id=i.order_id WHERE o.order_id in (10, 11); | ||
``` | ||
|
||
其中`t_order`在FROM的最左侧,ShardingSphere将会以它作为整个绑定表的主表。 所有路由计算将会只使用主表的策略,那么`t_order_item`表的分片计算将会使用`t_order`的条件。故绑定表之间的分区键要完全相同。 | ||
|
||
### 广播表 | ||
|
||
指所有的分片数据源中都存在的表,表结构和表中的数据在每个数据库中均完全一致。适用于数据量不大且需要与海量数据的表进行关联查询的场景,例如:字典表。 | ||
|
||
|
||
|
||
## 2 分片概念 | ||
|
||
### 分片键 | ||
|
||
用于分片的数据库字段,是将数据库(表)水平拆分的关键字段。例:将订单表中的订单主键的尾数取模分片,则订单主键为分片字段。 SQL中如果无分片字段,将执行全路由,性能较差。 除了对单分片字段的支持,ShardingSphere也支持根据多个字段进行分片。 | ||
|
||
### 分片算法 | ||
|
||
通过分片算法将数据分片,支持通过`=`、`>=`、`<=`、`>`、`<`、`BETWEEN`和`IN`分片。分片算法需要应用方开发者自行实现,可实现的灵活度非常高。 | ||
|
||
目前提供4种分片算法。由于分片算法和业务实现紧密相关,因此并未提供内置分片算法,而是通过分片策略将各种场景提炼出来,提供更高层级的抽象,并提供接口让应用开发者自行实现分片算法。 | ||
|
||
- 精确分片算法 | ||
|
||
对应PreciseShardingAlgorithm,用于处理使用单一键作为分片键的=与IN进行分片的场景。需要配合StandardShardingStrategy使用。 | ||
|
||
- 范围分片算法 | ||
|
||
对应RangeShardingAlgorithm,用于处理使用单一键作为分片键的BETWEEN AND、>、<、>=、<=进行分片的场景。需要配合StandardShardingStrategy使用。 | ||
|
||
- 复合分片算法 | ||
|
||
对应ComplexKeysShardingAlgorithm,用于处理使用多键作为分片键进行分片的场景,包含多个分片键的逻辑较复杂,需要应用开发者自行处理其中的复杂度。需要配合ComplexShardingStrategy使用。 | ||
|
||
- Hint分片算法 | ||
|
||
对应HintShardingAlgorithm,用于处理使用Hint行分片的场景。需要配合HintShardingStrategy使用。 | ||
|
||
### 分片策略 | ||
|
||
包含分片键和分片算法,由于分片算法的独立性,将其独立抽离。真正可用于分片操作的是分片键 + 分片算法,也就是分片策略。目前提供5种分片策略。 | ||
|
||
- 标准分片策略 | ||
|
||
对应StandardShardingStrategy。提供对SQL语句中的=, >, <, >=, <=, IN和BETWEEN AND的分片操作支持。StandardShardingStrategy只支持单分片键,提供PreciseShardingAlgorithm和RangeShardingAlgorithm两个分片算法。PreciseShardingAlgorithm是必选的,用于处理=和IN的分片。RangeShardingAlgorithm是可选的,用于处理BETWEEN AND, >, <, >=, <=分片,如果不配置RangeShardingAlgorithm,SQL中的BETWEEN AND将按照全库路由处理。 | ||
|
||
- 复合分片策略 | ||
|
||
对应ComplexShardingStrategy。复合分片策略。提供对SQL语句中的=, >, <, >=, <=, IN和BETWEEN AND的分片操作支持。ComplexShardingStrategy支持多分片键,由于多分片键之间的关系复杂,因此并未进行过多的封装,而是直接将分片键值组合以及分片操作符透传至分片算法,完全由应用开发者实现,提供最大的灵活度。 | ||
|
||
- 行表达式分片策略 | ||
|
||
对应InlineShardingStrategy。使用Groovy的表达式,提供对SQL语句中的=和IN的分片操作支持,只支持单分片键。对于简单的分片算法,可以通过简单的配置使用,从而避免繁琐的Java代码开发,如: `t_user_$->{u_id % 8}` 表示t_user表根据u_id模8,而分成8张表,表名称为`t_user_0`到`t_user_7`。 | ||
|
||
- Hint分片策略 | ||
|
||
对应HintShardingStrategy。通过Hint指定分片值而非从SQL中提取分片值的方式进行分片的策略。 | ||
|
||
- 不分片策略 | ||
|
||
对应NoneShardingStrategy。不分片的策略。 | ||
|
||
### SQL Hint | ||
|
||
对于分片字段非SQL决定,而由其他外置条件决定的场景,可使用SQL Hint灵活的注入分片字段。例:内部系统,按照员工登录主键分库,而数据库中并无此字段。SQL Hint支持通过Java API和SQL注释(待实现)两种方式使用。 | ||
|
||
|
||
|
||
## 3 基础配置 | ||
|
||
### 分片规则 | ||
|
||
分片规则配置的总入口。包含数据源配置、表配置、绑定表配置以及读写分离配置等。 | ||
|
||
### 数据源配置 | ||
|
||
真实数据源列表。 | ||
|
||
### 表配置 | ||
|
||
逻辑表名称、数据节点与分表规则的配置。 | ||
|
||
### 数据节点配置 | ||
|
||
用于配置逻辑表与真实表的映射关系。可分为均匀分布和自定义分布两种形式。 | ||
|
||
- 均匀分布 | ||
|
||
指数据表在每个数据源内呈现均匀分布的态势,例如: | ||
|
||
``` | ||
db0 | ||
├── t_order0 | ||
└── t_order1 | ||
db1 | ||
├── t_order0 | ||
└── t_order1 | ||
``` | ||
|
||
那么数据节点的配置如下: | ||
|
||
``` | ||
db0.t_order0, db0.t_order1, db1.t_order0, db1.t_order1 | ||
``` | ||
|
||
- 自定义分布 | ||
|
||
指数据表呈现有特定规则的分布,例如: | ||
|
||
``` | ||
db0 | ||
├── t_order0 | ||
└── t_order1 | ||
db1 | ||
├── t_order2 | ||
├── t_order3 | ||
└── t_order4 | ||
``` | ||
|
||
那么数据节点的配置如下: | ||
|
||
``` | ||
db0.t_order0, db0.t_order1, db1.t_order2, db1.t_order3, db1.t_order4 | ||
``` | ||
|
||
### 分片策略配置 | ||
|
||
对于分片策略存有数据源分片策略和表分片策略两种维度。 | ||
|
||
- 数据源分片策略 | ||
|
||
对应于DatabaseShardingStrategy。用于配置数据被分配的目标数据源。 | ||
|
||
- 表分片策略 | ||
|
||
对应于TableShardingStrategy。用于配置数据被分配的目标表,该目标表存在与该数据的目标数据源内。故表分片策略是依赖与数据源分片策略的结果的。 | ||
|
||
两种策略的API完全相同。 | ||
|
||
### 自增主键生成策略 | ||
|
||
通过在客户端生成自增主键替换以数据库原生自增主键的方式,做到分布式主键无重复。 |
Oops, something went wrong.