-
Notifications
You must be signed in to change notification settings - Fork 1.2k
pd,tidb: support affinity schedule #21207
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 1 commit
44f8f26
a26c81f
aedfcf3
da72e6b
8ad61fa
aaa4115
716c904
fd96fef
ab2f15d
448f0d5
a89d382
39d1ab3
00bf417
4442fcd
e92537d
6102ec9
0ef11f2
e59108f
3dc15f4
c07d0f8
d0621e5
f2005df
c912fcd
d564660
c8a6adb
cae10c9
8261428
02f2000
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,54 @@ | ||
| --- | ||
| title: SHOW AFFINITY | ||
| summary: 介绍 TiDB 数据库中 SHOW AFFINITY 的使用概况。 | ||
| --- | ||
|
|
||
| # SHOW AFFINITY <span class="version-mark">从 v8.5.5 开始引入</span> | ||
lhy1024 marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
|
|
||
| `SHOW AFFINITY` 语句用于查看开启了 `AFFINITY` 选项的表或分区的亲和性调度信息,以及 PD 当前记录的目标副本分布。 | ||
lhy1024 marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
|
|
||
| ## 语法图 | ||
|
|
||
| ```ebnf+diagram | ||
| ShowAffinityStmt ::= | ||
| "SHOW" "AFFINITY" ShowLikeOrWhereOpt | ||
| ``` | ||
|
|
||
| `SHOW AFFINITY` 支持使用 `LIKE` 或 `WHERE` 过滤表名。 | ||
qiancai marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
|
|
||
| ## 示例 | ||
|
|
||
qiancai marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| ```sql | ||
| CREATE TABLE t1 (a INT) AFFINITY = 'table'; | ||
| CREATE TABLE tp1 (a INT) AFFINITY = 'partition' PARTITION BY HASH(a) PARTITIONS 2; | ||
|
|
||
| SHOW AFFINITY; | ||
| ``` | ||
|
|
||
| 输出结果类似于: | ||
lhy1024 marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
|
|
||
| ```sql | ||
| +---------+------------+----------------+-----------------+------------------+----------+--------------+----------------------+ | ||
| | Db_name | Table_name | Partition_name | Leader_store_id | Voter_store_ids | Status | Region_count | Affinity_region_count| | ||
| +---------+------------+----------------+-----------------+------------------+----------+--------------+----------------------+ | ||
| | test | t1 | NULL | 1 | 1,2,3 | Stable | 8 | 8 | | ||
| | test | tp1 | p0 | 4 | 4,5,6 | Preparing| 4 | 2 | | ||
| | test | tp1 | p1 | 4 | 4,5,6 | Preparing| 3 | 2 | | ||
| +---------+------------+----------------+-----------------+------------------+----------+--------------+----------------------+ | ||
| ``` | ||
|
|
||
| 各列含义如下: | ||
|
|
||
| - `LEADER_STORE_ID`、`VOTER_STORE_IDS`:PD 为该表或分区记录的目标 Leader 副本和 Voter 副本所在的 store ID。当亲和性尚未确定时显示为 `NULL`。 | ||
| - `STATUS`:`Pending` 表示 PD 尚未进行亲和性调度,`Preparing` 表示正在调度 Region 以满足亲和性要求,`Stable` 表示所有 Region 已经达到目标分布。 | ||
qiancai marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| - `REGION_COUNT`:当前在该亲和性组中的 Region 数量。 | ||
|
||
| - `AFFINITY_REGION_COUNT`:已经满足亲和性副本分布的 Region 数量。 | ||
|
|
||
| ## MySQL 兼容性 | ||
|
|
||
| 该语句是 TiDB 对 MySQL 语法的扩展。 | ||
|
|
||
| ## 另请参阅 | ||
|
|
||
| - [`CREATE TABLE`](/sql-statements/sql-statement-create-table.md) | ||
| - [`ALTER TABLE`](/sql-statements/sql-statement-alter-table.md) | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,78 @@ | ||
| --- | ||
| title: 表级数据亲和性 | ||
| summary: 通过表或分区的亲和性约束,控制 Region 的副本分布并查看调度状态。 | ||
qiancai marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| --- | ||
|
|
||
| # 表级数据亲和性 <span class="version-mark">实验特性,自 v8.5.5 起提供</span> | ||
lhy1024 marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
|
|
||
| > **警告:** | ||
| > | ||
| > 该功能为实验特性,不建议在生产环境中使用。行为和接口可能在未来版本变更或移除。如遇问题,请在 GitHub 提交 [issue](https://github.com/pingcap/tidb/issues) 反馈。 | ||
| 表级数据亲和性用于将表或分区的 Region 归为同一亲和性分组,并让 PD 将这些 Region 的 Leader、Voter 优先调度到指定的 Store 上,减少跨节点分散带来的延迟。亲和性信息由 PD 维护,TiDB 通过 `AFFINITY` 表选项声明亲和性级别。 | ||
|
|
||
| ## 前置条件 | ||
|
|
||
lhy1024 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| - 集群版本:TiDB/PD/TiKV 均需为 v8.5.5 及以上的相互兼容版本。 | ||
| - 在 PD 侧开启调度:将 `schedule.affinity-schedule-limit` 设置为大于 0,否则亲和性调度不会生效。示例: | ||
|
|
||
lhy1024 marked this conversation as resolved.
Show resolved
Hide resolved
qiancai marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| ```bash | ||
| pd-ctl config set schedule.affinity-schedule-limit 4 | ||
| ``` | ||
|
|
||
| - 可选:根据需要设置 `schedule.max-affinity-merge-region-size`(MiB),控制亲和性 Region 的合并阈值,设置为 `0` 表示关闭亲和性场景下的自动合并。 | ||
|
|
||
| ## 支持的亲和性级别 | ||
|
|
||
| - 非分区表:`AFFINITY='table'`。 | ||
| - 分区表:`AFFINITY='partition'`,每个分区会生成独立的亲和性分组。 | ||
|
||
| - 取消亲和性:设置为 `AFFINITY=''` 或 `AFFINITY='none'`。 | ||
|
||
| - 不支持在临时表、视图上开启亲和性。 | ||
|
|
||
| ## 基本用法 | ||
|
|
||
| 1. **创建或修改表时声明亲和性** | ||
|
|
||
| ```sql | ||
| CREATE TABLE t1 (a INT) AFFINITY = 'table'; | ||
|
|
||
| CREATE TABLE tp1 (a INT) | ||
| AFFINITY = 'partition' | ||
| PARTITION BY HASH(a) PARTITIONS 4; | ||
|
|
||
| ALTER TABLE t1 AFFINITY = 'table'; -- 开启 | ||
| ALTER TABLE t1 AFFINITY = ''; -- 关闭 | ||
| ``` | ||
|
|
||
| 开启后,TiDB 会在 PD 中为表或分区自动创建亲和性分组,并向 PD 维护对应的 key range。 | ||
|
|
||
| 2. **查看调度状态** | ||
|
|
||
| - `SHOW AFFINITY;` 展示当前已开启亲和性的表或分区及其在 PD 中记录的目标副本分布。`STATUS` 含义: | ||
| - `Pending`:PD 尚未开始进行亲和性调度(比如未确定 Leader/Voter)。 | ||
| - `Preparing`:正在调度 Region 以满足亲和性要求。 | ||
| - `Stable`:所有 Region 已达到目标分布。 | ||
| - INFORMATION_SCHEMA 也会暴露亲和性信息: | ||
| - `TABLES.TIDB_AFFINITY`:表级亲和性。 | ||
| - `PARTITIONS.TIDB_AFFINITY`:分区级亲和性。 | ||
|
|
||
| ## 调度行为与内部机制 | ||
|
|
||
| - **自动分裂拦截**:当 Region 属于亲和性分组,- 亲和性生效时,Region 默认不进行自动分裂(除非大小或 key 数超过阈值),避免产生过多 Region 影响亲和性效果。手工 `ADMIN SPLIT` 不受此限制。 | ||
| - **降级与过期**:若分组目标的 Leader/Voter 所在 Store 不可用(如节点 down 、磁盘不足等),PD 会将分组标记为降级。若 10 分钟内未恢复,将自动过期并允许常规调度;此时亲和性调度暂停,`SHOW AFFINITY` 的状态会回到 `Pending`。恢复后可重新更新分组的 Leader/Voter 以重新启用亲和性。 | ||
|
|
||
| ## 限制与注意事项 | ||
|
|
||
| - 开启亲和性后,**不支持修改分区方案**(如新增/删除/重组/交换分区)。如需调整分区,请先移除亲和性。 | ||
| - 临时表、视图不支持亲和性。 | ||
| - 亲和性调度依赖 PD 调度参数: | ||
| - `schedule.affinity-schedule-limit` 默认 0(关闭)。需显式配置后,PD 才会为亲和性分组创建调度任务。 | ||
| - `schedule.max-affinity-merge-region-size` 为亲和性 Region 的合并阈值;设置为 0 关闭亲和性合并。 | ||
| - 亲和性生效时,小于阈值的 Region 默认不进行自动分裂,手工 `ADMIN SPLIT` 仍可执行。 | ||
| - 当目标 Store 处于不可用、被驱逐 Leader、或与放置规则冲突时,PD 会将分组标记为降级或过期,亲和性调度暂停。恢复后可通过 `SHOW AFFINITY` 观察状态,必要时重新更新分组的 Leader/Voter。 | ||
|
|
||
| ## 相关语句与配置 | ||
|
|
||
| - `CREATE TABLE` / `ALTER TABLE` 的 `AFFINITY` 选项。 | ||
| - `SHOW AFFINITY` 语句。 | ||
| - PD 调度参数:`schedule.affinity-schedule-limit`、`schedule.max-affinity-merge-region-size`。 | ||
Uh oh!
There was an error while loading. Please reload this page.