diff --git a/TOC.md b/TOC.md index 26ac323f4c0e..be5ce877d095 100644 --- a/TOC.md +++ b/TOC.md @@ -1009,6 +1009,7 @@ - [通过拓扑 label 进行副本调度](/schedule-replicas-by-topology-labels.md) - 内部组件介绍 - [TiDB 后端任务分布式并行执行框架](/tidb-distributed-execution-framework.md) + - [TiDB 全局排序](/tidb-global-sort.md) - 常见问题解答 (FAQ) - [FAQ 汇总](/faq/faq-overview.md) - [产品 FAQ](/faq/tidb-faq.md) diff --git a/media/dist-task/global-sort.jpeg b/media/dist-task/global-sort.jpeg new file mode 100644 index 000000000000..1d75de9cee9a Binary files /dev/null and b/media/dist-task/global-sort.jpeg differ diff --git a/system-variables.md b/system-variables.md index bb36de636c91..f609f0b96825 100644 --- a/system-variables.md +++ b/system-variables.md @@ -1397,6 +1397,21 @@ mysql> SELECT job_info FROM mysql.analyze_jobs ORDER BY end_time DESC LIMIT 1; - 从 TiDB v7.2.0 开始,支持分布式导入任务 [`IMPORT INTO`](/sql-statements/sql-statement-import-into.md)。 - 该变量由 `tidb_ddl_distribute_reorg` 改名而来。 +### `tidb_cloud_storage_uri` 从 v7.4.0 版本开始引入 + +> **警告:** +> +> 该变量目前为实验特性,不建议在生产环境中使用。该功能可能会在未事先通知的情况下发生变化或删除。如果发现 bug,请在 GitHub 上提 [issue](https://github.com/pingcap/tidb/issues) 反馈。 + +- 作用域:GLOBAL +- 是否持久化到集群:是 +- 是否受 Hint [SET_VAR](/optimizer-hints.md#set_varvar_namevar_value) 控制:否 +- 默认值:`""` +- 该变量用来指定[全局排序](/tidb-global-sort.md)中使用的云存储的 URI。在开启 [TiDB 后端任务分布式框架](/tidb-distributed-execution-framework.md)后,你可以配置 URI 指向具有访问存储所需权限的云存储路径,以此来实现全局排序的功能。更多详情,参考 [URI 格式](/br/backup-and-restore-storages.md#uri-格式)。 +- 以下语句支持全局排序功能: + - [`ADD INDEX`](/sql-statements/sql-statement-add-index.md) 语句。 + - 用于将数据导入本地部署的 TiDB 的 [`IMPORT INTO`](/sql-statements/sql-statement-import-into.md) 语句。对于 TiDB Cloud,`IMPORT INTO` 语句不适用全局排序。 + ### `tidb_ddl_error_count_limit` - 作用域:GLOBAL diff --git a/tidb-global-sort.md b/tidb-global-sort.md new file mode 100644 index 000000000000..e25f4850d088 --- /dev/null +++ b/tidb-global-sort.md @@ -0,0 +1,67 @@ +--- +title: TiDB 全局排序 +summary: 了解 TiDB 全局排序功能的使用场景、限制、使用方法和实现原理。 +--- + +# TiDB 全局排序 + +> **Warning:** +> +> 该功能目前为实验特性,不建议在生产环境中使用。该功能可能会在未事先通知的情况下发生变化或删除。如果发现 bug,请在 GitHub 上提 [issue](https://github.com/pingcap/tidb/issues) 反馈。 + +## 功能概览 + +TiDB 全局排序功能增强了数据导入和 DDL(数据定义语言)操作的稳定性和执行效率。全局排序作为[分布式执行框架](/tidb-distributed-execution-framework.md)中的通用算子,通过分布式执行框架,在云上提供全局排序服务。 + +全局排序目前仅支持使用 Amazon S3 作为云存储,未来将扩展支持多种共享存储接口,例如 POSIX,实现与不同存储系统的无缝集成。全局排序功能可以灵活地为各种使用场景提供高效且适配的数据排序服务。 + +## 目标 + +全局排序功能旨在提高 `IMPORT INTO` 和 `CREATE INDEX` 的稳定性与效率。通过将任务需要处理的数据进行全局排序,可以提高数据写入 TiKV 的稳定性、可控性和可扩展性,从而提供更好的数据导入与 DDL 任务的用户体验及更高质量的服务。 + +全局排序功能在后端任务分布式并行执行框架中执行任务,确保后端任务所需处理的数据在全局范围内保持有序。 + +## 限制 + +目前,全局排序功能不支持在查询过程中对查询结果进行排序。 + +## 使用方法 + +要开启全局排序功能,执行以下步骤: + +1. 将 [`tidb_enable_dist_task`](/system-variables.md#tidb_enable_dist_task-从-v710-版本开始引入) 的值设置为 `ON`,以开启分布式执行框架: + + ```sql + SET GLOBAL tidb_enable_dist_task = ON; + ``` + +2. 将 [`tidb_cloud_storage_uri`](/system-variables.md#tidb_cloud_storage_uri-从-v740-版本开始引入) 设置为正确的云存储路径。参见[示例](/br/backup-and-restore-storages.md)。 + + ```sql + SET GLOBAL tidb_cloud_storage_uri = 's3://my-bucket/test-data?role-arn=arn:aws:iam::888888888888:role/my-role' + ``` + +## 实现原理 + +全局排序功能的算法如下图所示: + +![全局排序功能算法](/media/dist-task/global-sort.jpeg) + +详细的实现原理如下: + +### 第 1 步:扫描和准备数据 + +1. TiDB 节点扫描特定范围的数据后(数据源可以是 CSV 数据或者 TiKV 中的表数据): + + 1. TiDB 节点将扫描的数据编码为键值对。 + 2. TiDB 节点将键值对排序为多个块数据段(数据段局部有序),每个段是一个文件,并将这些文件上传到云存储中。 + +2. TiDB 节点记录了每个段的连续实际键值范围(称为统计信息文件),这是可扩展排序实现的关键准备工作。这些文件随实际数据一起上传到云存储中。 + +### 第 2 步:排序和分发数据 + +从第一步中,全局排序的程序获取了一个已排序块的列表及其对应的统计信息文件,这些文件记录了本地已排序块的数量。此外,全局排序程序还记录了一个实际数据范围,供 PD 用于数据拆分和打散。接下来将执行以下步骤: + +1. 将统计信息文件中的记录排序,划分为大小相近的范围,每个范围将作为一个并行执行的子任务。 +2. 将子任务分发给 TiDB 节点执行。 +3. 每个 TiDB 节点独立地对子任务的数据进行排序,并在没有重叠的情况下将数据导入到 TiKV 中。