TiDB 全局排序

  • 目前,全局排序会使用大量 TiDB 节点的计算与内存资源。对于在线增加索引等同时有用户业务在运行的场景,建议为集群添加新的 TiDB 节点,为这些 TiDB 节点设置 tidb_service_scope,并连接到这些节点上创建任务。这样分布式框架就会将任务调度到这些节点上,将工作负载与其他 TiDB 节点隔离,以减少执行后端任务(如 ADD INDEX 和 IMPORT INTO)对用户业务的影响。
  • 当需要使用全局排序功能时,为避免 OOM,建议 TiDB 节点的规格至少为 16 核 CPU、32 GiB 内存。

功能概览

TiDB 全局排序功能增强了数据导入和 DDL(数据定义语言)操作的稳定性和执行效率。全局排序作为分布式执行框架中的通用算子,通过分布式执行框架,在云上提供全局排序服务。

全局排序目前支持使用 Amazon S3 作为云存储。

目标

全局排序功能旨在提高 IMPORT INTO 和 CREATE INDEX 的稳定性与效率。通过将任务需要处理的数据进行全局排序,可以提高数据写入 TiKV 的稳定性、可控性和可扩展性,从而提供更好的数据导入与 DDL 任务的用户体验及更高质量的服务。

全局排序功能在分布式执行框架中执行任务,确保所需处理的数据在全局范围内保持有序。

限制

目前,全局排序功能不支持在查询过程中对查询结果进行排序。

使用方法

要开启全局排序功能,执行以下步骤:

  1. 将 tidb_enable_dist_task 的值设置为 ON,以开启分布式执行框架。该变量从 v8.1.0 起默认开启,对于新建的 v8.1.0 或更高版本集群,可以跳过此步骤。

     

    SET GLOBAL tidb_enable_dist_task = ON;

  2. 将 tidb_cloud_storage_uri 设置为正确的云存储路径。参见示例

     

    SET GLOBAL tidb_cloud_storage_uri = 's3://my-bucket/test-data?role-arn=arn:aws:iam::888888888888:role/my-role'

注意

IMPORT INTO 也可使用 CLOUD_STORAGE_URI 参数来控制云存储路径。如果 tidb_cloud_storage_uri 和 CLOUD_STORAGE_URI 都设置了有效的云存储路径,IMPORT INTO 将以 CLOUD_STORAGE_URI 参数的配置为准。

实现原理

全局排序功能的算法如下图所示:

全局排序功能算法

详细的实现原理如下:

第 1 步:扫描和准备数据

  1. TiDB 节点扫描特定范围的数据后(数据源可以是 CSV 数据或者 TiKV 中的表数据):

    1. TiDB 节点将扫描的数据编码为键值对。
    2. TiDB 节点将键值对排序为多个块数据段(数据段局部有序),每个段是一个文件,并将这些文件上传到云存储中。
  2. TiDB 节点记录了每个段的连续实际键值范围(称为统计信息文件),这是可扩展排序实现的关键准备工作。这些文件随实际数据一起上传到云存储中。

第 2 步:排序和分发数据

从第一步中,全局排序的程序获取了一个已排序块的列表及其对应的统计信息文件,这些文件记录了本地已排序块的数量。此外,全局排序程序还记录了一个实际数据范围,供 PD 用于数据拆分和打散。接下来将执行以下步骤:

  1. 将统计信息文件中的记录排序,划分为大小相近的范围,每个范围将作为一个并行执行的子任务。
  2. 将子任务分发给 TiDB 节点执行。
  3. 每个 TiDB 节点独立地对子任务的数据进行排序,并在没有重叠的情况下将数据导入到 TiKV 中。

服务器状态变量提供有关服务器全局状态和 TiDB 中当前会话状态的信息。大多数变量与 MySQL 兼容。

你可以使用 SHOW GLOBAL STATUS 命令查看全局状态,使用 SHOW SESSION STATUS 命令查看当前会话状态。

此外,FLUSH STATUS 命令与 MySQL 兼容。

变量参考

Compression

  • 作用域:SESSION
  • 类型:布尔值
  • MySQL 是否使用压缩协议。

Compression_algorithm

  • 作用域:SESSION
  • 类型:字符串
  • MySQL 协议使用的压缩算法。

Compression_level

  • 作用域:SESSION
  • 类型:整数型
  • MySQL 协议使用的压缩等级。

Ssl_cipher

  • 作用域:SESSION | GLOBAL
  • 类型:字符串
  • 正在使用的 TLS 加密套件。

Ssl_cipher_list

  • 作用域:SESSION | GLOBAL
  • 类型:字符串
  • 服务器支持的 TLS 加密套件列表。

Ssl_server_not_after

  • 作用域:SESSION | GLOBAL
  • 类型:日期
  • 服务器用于 TLS 连接的 X.509 证书的过期时间。

Ssl_server_not_before

  • 作用域:SESSION | GLOBAL
  • 类型:字符串
  • 服务器用于 TLS 连接的 X.509 证书的开始时间。

Ssl_verify_mode

  • 作用域:SESSION | GLOBAL
  • 类型:整数型
  • TLS 验证模式掩码。

Ssl_version

  • 作用域:SESSION | GLOBAL
  • 类型:字符串
  • TLS 协议使用的版本。

Uptime

  • 作用域:SESSION | GLOBAL
  • 类型:整数型
  • 服务器正常运行时间(秒)。

ddl_schema_version

  • 作用域:SESSION | GLOBAL
  • 类型:整数型
  • DDL schema 使用的版本。

last_plan_binding_update_time 从 v5.2.0 版本开始引入

  • 作用域:SESSION
  • 类型:时间戳
  • 最后一次计划绑定更新的日期时间。

server_id

  • 作用域:SESSION | GLOBAL
  • 类型:字符串
  • 服务器的通用唯一识别码 (UUID)。

tidb_gc_last_run_time

  • 作用域:SESSION | GLOBAL
  • 类型:字符串
  • 最近一次运行垃圾回收 (GC) 的时间戳。

tidb_gc_leader_desc

  • 作用域:SESSION | GLOBAL
  • 类型:字符串
  • GC leader 的相关信息,包括主机名和进程 ID (PID)。

tidb_gc_leader_lease

  • 作用域:SESSION | GLOBAL
  • 类型:字符串
  • GC leader 的租约时间戳。

tidb_gc_leader_uuid

  • 作用域:SESSION | GLOBAL
  • 类型:字符串
  • GC leader 的 UUID。

tidb_gc_safe_point

  • 作用域:SESSION | GLOBAL
  • 类型:字符串
  • GC safe point 的时间戳。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值