Skip to content

Commit 7304166

Browse files
authored
v8.5.5 pd,tidb: support affinity schedule (#21207) (#21273)
1 parent d0e187c commit 7304166

File tree

8 files changed

+209
-5
lines changed

8 files changed

+209
-5
lines changed

TOC.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -883,6 +883,7 @@
883883
- [`SET ROLE`](/sql-statements/sql-statement-set-role.md)
884884
- [`SET TRANSACTION`](/sql-statements/sql-statement-set-transaction.md)
885885
- [`SET <variable>`](/sql-statements/sql-statement-set-variable.md)
886+
- [`SHOW AFFINITY`](/sql-statements/sql-statement-show-affinity.md)
886887
- [`SHOW [BACKUPS|RESTORES]`](/sql-statements/sql-statement-show-backups.md)
887888
- [`SHOW ANALYZE STATUS`](/sql-statements/sql-statement-show-analyze-status.md)
888889
- [`SHOW BINDINGS`](/sql-statements/sql-statement-show-bindings.md)
@@ -1000,6 +1001,7 @@
10001001
- [临时表](/temporary-tables.md)
10011002
- [缓存表](/cached-tables.md)
10021003
- [外键约束](/foreign-key.md)
1004+
- [表级数据亲和性](/table-affinity.md)
10031005
- 字符集和排序规则
10041006
- [概述](/character-set-and-collation.md)
10051007
- [GBK](/character-set-gbk.md)

information-schema/information-schema-partitions.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,9 @@ DESC PARTITIONS;
4545
| TABLESPACE_NAME | varchar(64) | YES | | NULL | |
4646
| TIDB_PARTITION_ID | bigint(21) | YES | | NULL | |
4747
| TIDB_PLACEMENT_POLICY_NAME | varchar(64) | YES | | NULL | |
48+
| TIDB_AFFINITY | varchar(128) | YES | | NULL | |
4849
+-------------------------------+--------------+------+------+---------+-------+
49-
27 rows in set (0.00 sec)
50+
28 rows in set (0.00 sec)
5051
```
5152

5253
```sql
@@ -85,6 +86,7 @@ SUBPARTITION_ORDINAL_POSITION: NULL
8586
TABLESPACE_NAME: NULL
8687
TIDB_PARTITION_ID: 89
8788
TIDB_PLACEMENT_POLICY_NAME: NULL
89+
TIDB_AFFINITY: NULL
8890
*************************** 2. row ***************************
8991
TABLE_CATALOG: def
9092
TABLE_SCHEMA: test
@@ -113,6 +115,7 @@ SUBPARTITION_ORDINAL_POSITION: NULL
113115
TABLESPACE_NAME: NULL
114116
TIDB_PARTITION_ID: 90
115117
TIDB_PLACEMENT_POLICY_NAME: NULL
118+
TIDB_AFFINITY: NULL
116119
2 rows in set (0.00 sec)
117120
```
118121

information-schema/information-schema-tables.md

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,12 @@ DESC tables;
4141
| TABLE_COMMENT | varchar(2048) | YES | | NULL | |
4242
| TIDB_TABLE_ID | bigint(21) | YES | | NULL | |
4343
| TIDB_ROW_ID_SHARDING_INFO | varchar(255) | YES | | NULL | |
44+
| TIDB_PK_TYPE | varchar(64) | YES | | NULL | |
45+
| TIDB_PLACEMENT_POLICY_NAME | varchar(64) | YES | | NULL | |
46+
| TIDB_TABLE_MODE | varchar(16) | YES | | NULL | |
47+
| TIDB_AFFINITY | varchar(128) | YES | | NULL | |
4448
+---------------------------+---------------+------+------+----------+-------+
45-
23 rows in set (0.00 sec)
49+
27 rows in set (0.00 sec)
4650
```
4751

4852
{{< copyable "sql" >}}
@@ -76,6 +80,10 @@ SELECT * FROM tables WHERE table_schema='mysql' AND table_name='user'\G
7680
TABLE_COMMENT:
7781
TIDB_TABLE_ID: 5
7882
TIDB_ROW_ID_SHARDING_INFO: NULL
83+
TIDB_PK_TYPE: CLUSTERED
84+
TIDB_PLACEMENT_POLICY_NAME: NULL
85+
TIDB_TABLE_MODE: Normal
86+
TIDB_AFFINITY: NULL
7987
1 row in set (0.00 sec)
8088
```
8189

@@ -115,12 +123,16 @@ SHOW TABLES
115123
* `CREATE_OPTIONS`:创建选项。
116124
* `TABLE_COMMENT`:表的注释、备注。
117125

118-
表中的信息大部分定义自 MySQL,只有两列是 TiDB 新增的:
126+
表中的大部分列都和 MySQL 相同,除了以下列是 TiDB 新增的:
119127

120128
* `TIDB_TABLE_ID`:标识表的内部 ID,该 ID 在一个 TiDB 集群内部唯一。
121129
* `TIDB_ROW_ID_SHARDING_INFO`:标识表的 Sharding 类型,可能的值为:
122130
- `"NOT_SHARDED"`:表未被 Shard。
123131
- `"NOT_SHARDED(PK_IS_HANDLE)"`:一个定义了整型主键的表未被 Shard。
124132
- `"PK_AUTO_RANDOM_BITS={bit_number}"`:一个定义了整型主键的表由于定义了 `AUTO_RANDOM` 而被 Shard。
125133
- `"SHARD_BITS={bit_number}"`:表使用 `SHARD_ROW_ID_BITS={bit_number}` 进行了 Shard。
126-
- NULL:表属于系统表或 View,无法被 Shard。
134+
- `NULL`:表属于系统表或 View,无法被 Shard。
135+
* `TIDB_PK_TYPE`:表的主键类型,可能的值包括 `CLUSTERED`(聚簇主键)和 `NONCLUSTERED`(非聚簇主键)。
136+
* `TIDB_PLACEMENT_POLICY_NAME`:应用于该表的放置策略 (placement policy) 名称。
137+
* `TIDB_TABLE_MODE`:表的模式,例如 `Normal``Import``Restore`
138+
* `TIDB_AFFINITY`:表的亲和性等级,非分区表为 `table`,分区表为 `partition`,未开启亲和性时为 `NULL`

pd-configuration-file.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,13 @@ pd-server 相关配置项。
287287
+ 控制 Region Merge 的 key 上限,当 Region key 大于指定值时 PD 不会将其与相邻的 Region 合并。
288288
+ 默认:540000。在 v8.4.0 之前,默认值为 200000;从 v8.4.0 开始,默认值为 540000。
289289

290+
### `max-affinity-merge-region-size` <span class="version-mark">从 v8.5.5 版本开始引入</span>
291+
292+
+ 控制属于同一[亲和性](/table-affinity.md)分组中相邻的小 Region 自动合并的阈值。当 Region 属于某个亲和性分组,且其大小小于该配置值时,PD 会尝试将该 Region 与同一亲和性分组中相邻的其它小 Region 进行合并,以减少 Region 数量并保持亲和性效果。
293+
+ 设置为 `0` 表示关闭亲和性分组中相邻小 Region 的自动合并。
294+
+ 默认值:256
295+
+ 单位:MiB
296+
290297
### `patrol-region-interval`
291298

292299
+ 控制 checker 检查 Region 健康状态的运行频率,越短则运行越快,通常状况不需要调整
@@ -362,6 +369,11 @@ pd-server 相关配置项。
362369
+ 同时进行的 Region Merge 调度的任务,设置为 0 则关闭 Region Merge。
363370
+ 默认值:8
364371

372+
### `affinity-schedule-limit` <span class="version-mark">从 v8.5.5 版本开始引入</span>
373+
374+
+ 控制同时进行的[亲和性](/table-affinity.md)调度任务数量。设置为 `0` 表示禁用亲和性调度。
375+
+ 默认值:0
376+
365377
### `high-space-ratio`
366378

367379
+ 设置 store 空间充裕的阈值。当节点的空间占用比例小于该阈值时,PD 调度时会忽略节点的剩余空间,主要根据实际数据量进行均衡。此配置仅在 `region-score-formula-version = v1` 时生效。

sql-statements/sql-statement-alter-table.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ AlterTableSpec ::=
5454
| TTLEnable EqOpt ( 'ON' | 'OFF' )
5555
| TTLJobInterval EqOpt stringLit
5656
)
57+
| 'AFFINITY' EqOpt stringLit
5758
| PlacementPolicyOption
5859
5960
PlacementPolicyOption ::=
@@ -172,6 +173,7 @@ TiDB 中的 `ALTER TABLE` 语法主要存在以下限制:
172173
- 不支持分区表上的列类型变更。
173174
- 不支持生成列上的列类型变更。
174175
- 不支持部分数据类型(例如,部分时间类型、Bit、Set、Enum、JSON 等)的变更,因为 TiDB 中的 `CAST` 函数与 MySQL 的行为存在兼容性问题。
176+
- `AFFINITY` 选项为 TiDB 扩展语法。开启 `AFFINITY` 后,不支持变更该表的分区方案(如添加、删除、重组或交换分区),需要先移除 `AFFINITY`
175177
- 不支持空间数据类型。
176178
- `ALTER TABLE t CACHE | NOCACHE` 不是 MySQL 标准语法,而是 TiDB 扩展功能,参见[缓存表](/cached-tables.md)
177179

sql-statements/sql-statement-create-table.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ TableOption ::=
117117
| 'UNION' EqOpt '(' TableNameListOpt ')'
118118
| 'ENCRYPTION' EqOpt EncryptionOpt
119119
| 'TTL' EqOpt TimeColumnName '+' 'INTERVAL' Expression TimeUnit (TTLEnable EqOpt ( 'ON' | 'OFF' ))? (TTLJobInterval EqOpt stringLit)?
120+
| 'AFFINITY' EqOpt StringName
120121
| PlacementPolicyOption
121122
122123
OnCommitOpt ::=
@@ -170,10 +171,12 @@ TiDB 支持以下 `table_option`。TiDB 会解析并忽略其他 `table_option`
170171
|`CHARACTER SET` |指定该表所使用的[字符集](/character-set-and-collation.md) | `CHARACTER SET` = 'utf8mb4'|
171172
|`COLLATE` |指定该表所使用的字符集排序规则 | `COLLATE` = 'utf8mb4_bin'|
172173
|`COMMENT` |注释信息 | `COMMENT` = 'comment info'|
174+
|`AFFINITY` |为表或分区开启亲和性调度。非分区表可设置为 `'table'`,分区表可设置为 `'partition'`。设置为 `'none'` 或留空可关闭亲和性调度 |`AFFINITY` = 'table'|
173175

174176
> **注意:**
175177
>
176-
> 在 TiDB 配置文件中,`split-table` 默认开启。当该配置项开启时,建表操作会为每个表建立单独的 Region,详情参见 [TiDB 配置文件描述](/tidb-configuration-file.md)
178+
> - 在 TiDB 配置文件中,`split-table` 默认开启。当该配置项开启时,建表操作会为每个表建立单独的 Region,详情参见 [TiDB 配置文件描述](/tidb-configuration-file.md)
179+
> - 使用 `AFFINITY` 时,当前不支持对该表进行分区方案变更(如添加、删除、重组或交换分区),也不支持在临时表或视图上设置该选项。
177180
178181
## 示例
179182

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
---
2+
title: SHOW AFFINITY
3+
summary: 介绍 TiDB 数据库中 SHOW AFFINITY 的使用概况。
4+
---
5+
6+
# SHOW AFFINITY <span class="version-mark">从 v8.5.5 开始引入</span>
7+
8+
`SHOW AFFINITY` 语句用于查看配置了 `AFFINITY` 选项的表的[亲和性](/table-affinity.md)调度信息,以及 PD 当前记录的目标副本分布。
9+
10+
## 语法图
11+
12+
```ebnf+diagram
13+
ShowAffinityStmt ::=
14+
"SHOW" "AFFINITY" ShowLikeOrWhereOpt
15+
```
16+
17+
`SHOW AFFINITY` 支持使用 `LIKE``WHERE` 子句过滤表名。
18+
19+
## 示例
20+
21+
以下示例创建两个启用了亲和性调度的表,并查看其调度信息:
22+
23+
```sql
24+
CREATE TABLE t1 (a INT) AFFINITY = 'table';
25+
CREATE TABLE tp1 (a INT) AFFINITY = 'partition' PARTITION BY HASH(a) PARTITIONS 2;
26+
27+
SHOW AFFINITY;
28+
```
29+
30+
输出结果示例如下:
31+
32+
```sql
33+
+---------+------------+----------------+-----------------+------------------+----------+--------------+----------------------+
34+
| Db_name | Table_name | Partition_name | Leader_store_id | Voter_store_ids | Status | Region_count | Affinity_region_count|
35+
+---------+------------+----------------+-----------------+------------------+----------+--------------+----------------------+
36+
| test | t1 | NULL | 1 | 1,2,3 | Stable | 8 | 8 |
37+
| test | tp1 | p0 | 4 | 4,5,6 | Preparing| 4 | 2 |
38+
| test | tp1 | p1 | 4 | 4,5,6 | Preparing| 3 | 2 |
39+
+---------+------------+----------------+-----------------+------------------+----------+--------------+----------------------+
40+
```
41+
42+
各列含义如下:
43+
44+
- `Leader_store_id``Voter_store_ids`:PD 为该表或分区记录的目标 Leader 副本和 Voter 副本所在的 TiKV Store ID。如果亲和性分组尚未确定目标副本位置或 [`schedule.affinity-schedule-limit`](/pd-configuration-file.md#affinity-schedule-limit-从-v855-版本开始引入)`0`,则显示为 `NULL`
45+
- `Status`:表示当前亲和性调度的状态。可能的取值如下:
46+
- `Pending`:PD 尚未对该表或分区进行亲和性调度(比如未确定 Leader 或 Voter 时)。
47+
- `Preparing`:PD 正在调度 Region 以满足亲和性要求。
48+
- `Stable`:所有 Region 已达到目标分布。
49+
- `Region_count`:当前在该亲和性组中的 Region 数量。
50+
- `Affinity_region_count`:当前已满足亲和性副本分布要求的 Region 数量。
51+
-`Affinity_region_count` 小于 `Region_count` 时,表示仍有部分 Region 尚未完成基于亲和性的副本调度。
52+
-`Affinity_region_count` 等于 `Region_count` 时,表示基于亲和性的 Region 副本迁移调度已完成,也就意味着所有 Region 的分布已经满足亲和性要求,但并不代表相关 Region 的合并操作已完成。
53+
54+
## MySQL 兼容性
55+
56+
该语句是 TiDB 对 MySQL 语法的扩展。
57+
58+
## 另请参阅
59+
60+
- [`CREATE TABLE`](/sql-statements/sql-statement-create-table.md)
61+
- [`ALTER TABLE`](/sql-statements/sql-statement-alter-table.md)

table-affinity.md

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
---
2+
title: 表级数据亲和性
3+
summary: 通过为表或分区配置亲和性约束,控制 Region 副本的分布并查看调度状态。
4+
---
5+
6+
# 表级数据亲和性 <span class="version-mark">从 v8.5.5 开始引入</span>
7+
8+
> **警告:**
9+
>
10+
> 该功能为实验特性,不建议在生产环境中使用。该功能可能会在未事先通知的情况下发生变化或删除。如果发现 bug,请在 GitHub 上提 [issue](https://github.com/pingcap/tidb/issues) 反馈。
11+
12+
表级数据亲和性是 PD 在表级别上的数据分布调度机制,用于控制同一个表或分区中 Region 的 Leader 和 Voter 副本在 TiKV 集群中的分布。
13+
14+
开启 PD 数据亲和性调度,并将表的 `AFFINITY` 选项设置为 `table``partition` 后,PD 会将同一张表或同一个分区的 Region 归入同一个亲和性分组,并在调度过程中优先将这些 Region 的 Leader 和 Voter 副本放置到相同的少数 TiKV 节点上,从而减少查询过程中跨节点访问带来的网络延迟,提升查询性能。
15+
16+
## 使用限制
17+
18+
使用表级数据亲和性前,请注意以下限制:
19+
20+
-[PD 微服务模式](/pd-microservices.md)下,该功能不会生效。
21+
- [临时表](/temporary-tables.md)[视图](/views.md)不支持配置数据亲和性。
22+
-[分区表](/partitioned-table.md)配置数据亲和性后,**不支持修改该表的分区方案**,包括新增、删除、重组或交换分区。如需调整分区配置,请先移除该表的亲和性设置。
23+
- **数据量较大时需提前评估磁盘容量**:开启数据亲和性后,PD 会优先将表或分区的 Region 调度到相同的少数 TiKV 节点上。对于数据量较大的表或分区,可能导致这些节点的磁盘使用率显著升高。建议提前评估磁盘容量并做好监控。
24+
- 数据亲和性调度仅影响 Leader 和 Voter 副本的分布。如果表有 Learner 副本(如 TiFlash),Learner 副本的分布不受亲和性配置影响。
25+
26+
## 前提条件
27+
28+
PD 亲和性调度特性默认关闭。在设置表或分区的亲和性前,请开启并配置该特性。
29+
30+
1. 将 PD 配置项 [`schedule.affinity-schedule-limit`](/pd-configuration-file.md#affinity-schedule-limit-从-v855-版本开始引入) 设置为大于 `0` 的值,以开启 PD 的亲和性调度。
31+
32+
例如,执行以下命令将该配置项设置为 `4`,表示允许 PD 最多同时执行 4 个亲和性调度任务:
33+
34+
```bash
35+
pd-ctl config set schedule.affinity-schedule-limit 4
36+
```
37+
38+
2. (可选)根据需要设置 PD 配置项 [`schedule.max-affinity-merge-region-size`](/pd-configuration-file.md#max-affinity-merge-region-size-从-v855-版本开始引入)(默认值为 `256`,单位为 MiB),用于控制属于同一亲和性分组中相邻的小 Region 自动合并的阈值。设置为 `0` 表示关闭亲和性分组中相邻的小 Region 的自动合并。
39+
40+
## 使用方法
41+
42+
本节介绍如何配置表或分区的亲和性,以及如何查看亲和性调度状态。
43+
44+
### 配置表或分区的亲和性
45+
46+
你可以通过 `CREATE TABLE``ALTER TABLE` 语句中的 `AFFINITY` 选项配置表或分区的亲和性。
47+
48+
| 亲和性等级 | 适用范围 | 效果 |
49+
|---|---|---|
50+
| `AFFINITY='table'` | 非分区表 | 开启该表的亲和性,PD 会为此表的所有 Region 创建一个亲和性分组。 |
51+
| `AFFINITY='partition'` | 分区表 | 开启该表中每个分区的亲和性,PD 会为此表的**每个分区**对应的 Region 分别创建独立的亲和性分组。例如,当表包含 4 个分区时,PD 将为该表创建 4 个相互独立的亲和性分组。 |
52+
| `AFFINITY=''``AFFINITY='none'` | 已设置 `AFFINITY='table'``AFFINITY='partition'` 的表 | 关闭该表或分区的亲和性。设置后,PD 会删除对应表或分区的亲和性分组,表或分区的 Region 将不再受到亲和性调度约束。TiKV 上 Region 的自动分裂将在最长 10 分钟内恢复为默认状态。 |
53+
54+
**示例**
55+
56+
创建非分区表时开启该表的亲和性:
57+
58+
```sql
59+
CREATE TABLE t1 (a INT) AFFINITY = 'table';
60+
```
61+
62+
创建分区表时开启该表中每个分区的亲和性:
63+
64+
```sql
65+
CREATE TABLE tp1 (a INT)
66+
AFFINITY = 'partition'
67+
PARTITION BY HASH(a) PARTITIONS 4;
68+
```
69+
70+
为现有非分区表开启亲和性:
71+
72+
```sql
73+
CREATE TABLE t2 (a INT);
74+
ALTER TABLE t2 AFFINITY = 'table';
75+
```
76+
77+
关闭表的亲和性:
78+
79+
```sql
80+
ALTER TABLE t1 AFFINITY = '';
81+
```
82+
83+
### 查看亲和性
84+
85+
可以通过以下方式查看表或分区的亲和性信息:
86+
87+
- 执行 [`SHOW AFFINITY`](/sql-statements/sql-statement-show-affinity.md) 语句,在 `Status` 列查看已开启亲和性的表或分区及其调度状态。`Status` 列的值含义如下:
88+
89+
- `Pending`:PD 尚未对该表或分区进行亲和性调度,比如未确定 Leader 或 Voter 时。
90+
- `Preparing`:PD 正在调度 Region 以满足亲和性要求。
91+
- `Stable`:所有 Region 已达到目标分布。
92+
93+
- 查询 [`INFORMATION_SCHEMA.TABLES`](/information-schema/information-schema-tables.md) 表的 `TIDB_AFFINITY` 列查看表的亲和性等级。
94+
- 查询 [`INFORMATION_SCHEMA.PARTITIONS`](/information-schema/information-schema-partitions.md) 表的 `TIDB_AFFINITY` 列查看分区的亲和性等级。
95+
96+
## 注意事项
97+
98+
- **Region 的自动分裂**:当 Region 属于某个亲和性分组且亲和性生效时,Region 默认不会自动分裂,以避免产生过多 Region 影响亲和性效果。只有当 Region 大小超过 [`schedule.max-affinity-merge-region-size`](/pd-configuration-file.md#max-affinity-merge-region-size-从-v855-版本开始引入) 值的四倍时,才会触发自动分裂。需要注意的是,非 TiKV 或 PD 自动触发的 Region 分裂(例如手动执行的 [`SPLIT TABLE`](/sql-statements/sql-statement-split-region.md))不受此限制。
99+
100+
- **降级与过期机制**:如果亲和性分组中目标 Leader 或 Voter 所在的 TiKV 节点处于不可用状态(例如节点宕机或磁盘空间不足)、Leader 被驱逐,或与现有放置规则发生冲突时,PD 会将该亲和性分组标记为降级状态。在降级期间,对应表或分区的亲和性调度将暂停。
101+
102+
- 若相关节点在 10 分钟内恢复正常,PD 会继续按照原有亲和性设置进行调度。
103+
- 若超过 10 分钟仍未恢复,该亲和性分组将被标记为过期。此时 PD 会先恢复常规调度行为([`SHOW AFFINITY`](/sql-statements/sql-statement-show-affinity.md) 的状态会回到 `Pending`),然后自动更新亲和性分组中的 Leader 和 Voter,以重新启用亲和性调度。
104+
105+
## 相关语句与配置
106+
107+
- [`CREATE TABLE`](/sql-statements/sql-statement-create-table.md) 和 [`ALTER TABLE`](/sql-statements/sql-statement-alter-table.md) 的 `AFFINITY` 选项
108+
- [`SHOW AFFINITY`](/sql-statements/sql-statement-show-affinity.md)
109+
- PD 配置项:[`schedule.affinity-schedule-limit`](/pd-configuration-file.md#affinity-schedule-limit-从-v855-版本开始引入) 和 [`schedule.max-affinity-merge-region-size`](/pd-configuration-file.md#max-affinity-merge-region-size-从-v855-版本开始引入)

0 commit comments

Comments
 (0)