写点什么

TiDB 实践—索引加速 + 分布式执行框架创建索引提升 70+ 倍

  • 2024-07-19
    北京
  • 本文字数:3675 字

    阅读完需:约 12 分钟

作者: 数据源的 TiDB 学习之路原文来源:https://tidb.net/blog/92d348c2

背景介绍

TiDB 采用在线异步变更的方式执行 DDL 语句,从而实现 DDL 语句的执行不会阻塞其他会话中的 DML 语句。按照是否需要操作 DDL 目标对象所包括的数据来划分,DDL 语句可以划分为 逻辑 DDL 语句物理 DDL 语句。逻辑 DDL 语句通常只修改数据库对象的元数据,不对变更对象存储的数据进行处理,例如变更表名或变更列名。物理 DDL 语句不但会修改变更对象的元数据,同时也修改变更对象所存储的用户数据,例如,为表创建索引,不仅需要变更表的定义,同时也需要做一次全表扫描以构建新增加的索引。


在 TiDB 中,物理 DDL 被称为 Reorg DDL(Reorg 即 Reorganization)。目前物理 DDL 只包含 ADD INDEX 以及有损列类型变更(例如从 INT 转成 CHAR 类型)这两种类型。物理 DDL 的特点是执行时间较长,且执行时间与表的数据量、机器配置以及业务负载有关。


为了优化 TiDB 中物理 DDL 性能,TiDB v6.3.0 支持开启添加索引加速功能,提升了创建索引回填过程的速度。从 v7.1.0 开始,TiDB 又引入了分布式执行框架,以进一步发挥分布式架构的资源优势。该框架的目标是对基于该框架的任务进行统一调度与分布式执行,并提供整体和单个任务两个维度的资源管理能力,更好地满足用户对于资源使用的预期。


基于以上信息,使用创建索引为例,在测试环境中验证 TiDB 索引加速及分布式执行框架对物理 DDL 的性能提升情况,供读者参考。

先上结论

  1. 基于 10 亿 表创建索引,采用普通 Online DDL 方式,耗时约 12 小时 21 分钟

  2. 基于 10 亿 表创建索引,采用 Fast DDL 方式,耗时约 30 分钟,比普通 DDL 提升约 24 倍

  3. 基于 10 亿 表创建索引,采用 Fast DDL + 分布式框架

  4. 在 3 个 TiDB Server 时,耗时约 10 分钟,是 Fast DDL 性能的 3 倍,是普通 DDL 的 72 倍

  5. 在 2 个 TiDB Server 时,耗时约 14~15 分钟,是 Fast DDL 性能的 2 倍,是普通 DDL 的 48 倍

  6. 证明采用分布式框架性能基本随着 TiDB Server 个数增长呈准线性增长


参数说明

tidb_ddl_enable_fast_reorg 从 v6.3.0 版本开始引入

  • 作用域:GLOBAL

  • 是否持久化到集群:是

  • 是否受 Hint SET_VAR 控制:否

  • 类型:布尔型

  • 默认值:ON

  • 这个变量用来控制是否开启添加索引加速功能,来提升创建索引回填过程的速度。开启该变量对于数据量较大的表有一定的性能提升。

  • TiDB v7.1.0 引入了快速加索引功能的检查点机制,即使 TiDB owner 因故障重启或者切换,也能够通过自动定期保存的检查点恢复部分进度。

  • 要验证已经完成的 ADD INDEX 操作是否使用了添加索引加速功能,可以执行 ADMIN SHOW DDL JOBS 语句查看 JOB_TYPE 一列中是否含有 ingest 字样。

tidb_enable_dist_task 从 v7.1.0 版本开始引入

  • 作用域:GLOBAL

  • 是否持久化到集群:是

  • 是否受 Hint SET_VAR 控制:否

  • 默认值:ON

  • 这个变量用于控制是否开启 TiDB 分布式执行框架。开启分布式执行框架后,DDL 和 Import 等将会由集群中多个 TiDB 节点共同完成。

  • 从 TiDB v7.1.0 开始,支持分布式执行分区表的 ADD INDEX

  • 从 TiDB v7.2.0 开始,支持分布式导入任务 IMPORT INTO

  • 从 TiDB v8.1.0 开始,该变量默认开启。如果要从低版本的集群升级到 v8.1.0 或更高版本,且该集群已开启分布式执行框架,为了避免升级期间 ADD INDEX 操作可能导致数据索引不一致的问题,请在升级前关闭分布式执行框架(即将 tidb_enable_dist_task 设置为 OFF),升级后再手动开启。

  • 该变量由 tidb_ddl_distribute_reorg 改名而来。

tidb_service_scope 从 v7.4.0 版本开始引入

  • 作用域:GLOBAL

  • 是否持久化到集群:否

  • 是否受 Hint SET_VAR 控制:否

  • 类型:字符串

  • 默认值:””

  • 可选值:”” 或 background

  • 该变量是一个实例级别的变量,用于控制 TiDB 分布式执行框架 下各 TiDB 节点的服务范围。当设置 TiDB 节点的 tidb_service_scopebackground 时,分布式执行框架将调度该节点执行任务(如 ADD INDEXIMPORT INTO)。

环境准备

  • 节点配置(3 节点 ARM 机器)



  • 集群信息(V 7.5.1 版本,混合部署)

  • 参数配置

  • 数据准备

测试过程

mysql> show create table sbtest1;+---------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+| Table   | Create Table                                                                                                                                                                                                                                                                                                                                   |+---------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+| sbtest1 | CREATE TABLE `sbtest1` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `k` int(11) NOT NULL DEFAULT '0',  `c` char(120) NOT NULL DEFAULT '',  `pad` char(60) NOT NULL DEFAULT '',  PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */,) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin AUTO_INCREMENT=45086776 |+---------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+1 row in set (0.02 sec)

mysql> select count(*) from sbtest1;+------------+| count(*) |+------------+| 1000000000 |+------------+1 row in set (1 min 30.40 sec)
复制代码

测试 1: Online DDL

SET GLOBAL tidb_ddl_enable_fast_reorg = OFF;create index k_1 on sbtest1(k);
复制代码


  • 测试输出:

  • 执行耗时:44463 秒 = 12 小时 21 分钟 3 秒

  • 资源截图:


测试 2: Fast Online DDL

SET GLOBAL tidb_ddl_enable_fast_reorg = ON;SET GLOBAL tidb_enable_dist_task = OFF; create index k_1 on sbtest1(k);
复制代码


  • 测试输出:

  • 执行耗时:1812 秒 = 30 分钟 12 秒

  • 资源截图:


测试 3: 分布式执行框架 Fast Online DDL

使用 3 个 TiDB Server 测试

SET GLOBAL tidb_ddl_enable_fast_reorg = ON;SET GLOBAL tidb_enable_dist_task = ON;
--以下可选TiDB-server-1: SET GLOBAL tidb_service_scope = 'background';TiDB-server-2: SET GLOBAL tidb_service_scope = 'background';TiDB-server-3: SET GLOBAL tidb_service_scope = 'background';等同于SET GLOBAL tidb_service_scope = '';
create index k_1 on sbtest1(k);
复制代码


  • 测试输出:

  • 执行耗时:



  • 资源截图:


使用 2 个 TiDB Server 测试

SET GLOBAL tidb_ddl_enable_fast_reorg = ON;SET GLOBAL tidb_enable_dist_task = ON;
TiDB-server-2: SET GLOBAL tidb_service_scope = 'background';TiDB-server-3: SET GLOBAL tidb_service_scope = 'background';
create index k_1 on sbtest1(k);
复制代码


  • 测试输出:

  • 执行耗时:



  • 资源截图:


参考链接

TiDB DDL 执行原理及最佳实践:https://docs.pingcap.com/zh/tidb/stable/ddl-introduction


TiDB 分布式执行框架:https://docs.pingcap.com/zh/tidb/stable/tidb-distributed-execution-framework

问题记录

  1. 使用分布式执行框架创建索引后台 JOB 中 ROW_COUNT 最终结果不正确


分析:


表记录数为 10 亿,索引创建成功后 JOB 对应的 ROW_COUNT 值不正确,产研确认是 BUG,8.0 版本已修复


手工对比表和索引数据,确认一致


mysql> select (bit_xor(concat(id, k))) from sbtest1;+--------------------------+| (bit_xor(concat(id, k))) |+--------------------------+|     14493758885395096677 |+--------------------------+1 row in set, 1 warning (1 min 31.97 sec)
mysql> select (bit_xor(concat(id, k))) from sbtest1 use index(primary);+--------------------------+| (bit_xor(concat(id, k))) |+--------------------------+| 14493758885395096677 |+--------------------------+1 row in set, 1 warning (2 min 17.95 sec)
复制代码


  1. 打开 fast ddl 开关创建索引后台 JOB 查看仍然走普通 ddl 模式


分析:


  1. 初次分析是因为 temp-dir 定义的目录不存在

  2. 手工创建后仍然走普通 ddl 模式,重启 TiDB Server 后正常


发布于: 刚刚阅读数: 4
用户头像

TiDB 社区官网:https://tidb.net/ 2021-12-15 加入

TiDB 社区干货传送门是由 TiDB 社区中布道师组委会自发组织的 TiDB 社区优质内容对外宣布的栏目,旨在加深 TiDBer 之间的交流和学习。一起构建有爱、互助、共创共建的 TiDB 社区 https://tidb.net/

评论

发布
暂无评论
TiDB实践—索引加速+分布式执行框架创建索引提升70+倍_7.x 实践_TiDB 社区干货传送门_InfoQ写作社区