Skip to content

Commit

Permalink
添加分库分表信息
Browse files Browse the repository at this point in the history
  • Loading branch information
makemyownlife committed Jan 9, 2024
1 parent 3598601 commit 519a203
Show file tree
Hide file tree
Showing 8 changed files with 480 additions and 58 deletions.
118 changes: 61 additions & 57 deletions docs/.vuepress/sidebar/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,62 +23,66 @@ export default sidebar({
},
{
text: "消息队列",
icon
:
"Kafka",
prefix
:
"mq",
collapsible
:
true,
children
:
[
{
text: "RocketMQ4.X设计精要",
prefix: "rocketmq4/",
collapsible: true,
icon: "apacherocketmq",
children: [
"00RocketMQ4_introduce",
"01RocketMQ4_artch",
"01RocketMQ4_network",
"02RocketMQ4_nameserver",
"03RocketMQ4_producer",
"04RocketMQ4_store",
"06RocketMQ4_consumer",
"07RocketMQ4_broadcast_consumer",
"08RocketMQ4_masterslave",
"10RocketMQ4_transaction",
"11RocketMQ4_messagetrack",
"13RocketMQ4_subscribe_consistent",
"14RocketMQ4_mideng"
],
}
]
}
,
{
text: "技术人生",
icon
:
"life-ring",
prefix
:
"codelife",
collapsible
:
true,
children
:
[
"runningforcode.md",
"messagequeuecareer.md",
"howtolearnopenproject.md",
"guotuxuexistorm.md",
]
}
]
icon: "Kafka",
prefix: "mq",
collapsible: true,
children: [
{
text: "RocketMQ4.X设计精要",
prefix: "rocketmq4/",
collapsible: true,
icon: "apacherocketmq",
children: [
"00RocketMQ4_introduce",
"01RocketMQ4_artch",
"01RocketMQ4_network",
"02RocketMQ4_nameserver",
"03RocketMQ4_producer",
"04RocketMQ4_store",
"06RocketMQ4_consumer",
"07RocketMQ4_broadcast_consumer",
"08RocketMQ4_masterslave",
"10RocketMQ4_transaction",
"11RocketMQ4_messagetrack",
"13RocketMQ4_subscribe_consistent",
"14RocketMQ4_mideng"
],
}
]
}
,
{
text: "分库分表",
icon: "fill-sharding",
prefix: "sharding",
collapsible: true,
children: [
{
text: "shardingsphere-jdbc",
prefix: "shardingspherejdbc/",
collapsible: true,
icon: "JDBC",
children: [
"00coreconcept",
"01coreinsight"
],
}
]
}
,
{
text: "技术人生",
icon: "life-ring",
prefix: "codelife",
collapsible: true,
children:
[
"runningforcode.md",
"messagequeuecareer.md",
"howtolearnopenproject.md",
"guotuxuexistorm.md",
]
}
]
})
;
2 changes: 1 addition & 1 deletion docs/.vuepress/theme.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ export default hopeTheme({

iconAssets: [
"https://at.alicdn.com/t/c/font_2922463_kweia6fbo9.css",
"https://at.alicdn.com/t/c/font_4335276_4phw50gppkl.css"
"https://at.alicdn.com/t/c/font_4335276_89qzsw8y34a.css"
],

author: {
Expand Down
Binary file added docs/images/parsing_architecture_cn.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/images/route_architecture.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/images/sharding_architecture_cn.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/images/sql_ast.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
195 changes: 195 additions & 0 deletions docs/sharding/shardingspherejdbc/00coreconcept.md
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完全相同。

### 自增主键生成策略

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

0 comments on commit 519a203

Please sign in to comment.