导读
在多租户大规模部署场景下,传统单机数据库的管理复杂性问题仍困扰着用户。
在 TiDB v6-v7 版本中,我们成功将 TiDB DDL 创建索引的性能提升了 10 倍,为用户带来了显著的体验改善。在 TiDB v8 版本中,我们对 TiDB DDL 语句执行流程进行了进一步的优化和重构,显著提升了框架的可扩展性和语句的执行效率,为未来实现 TiDB DDL 的真正分布式执行奠定了坚实基础。
本系列文章将从原理解析、技术实现和应用实践等角度深入解析 TiDB DDL 框架如何提升系统的可扩展性,建表速度 50 倍提升(对比 TiDB v7.5),实现百万级别表的管理。本文为系列文章的第一篇,将介绍 DDL 框架优化的效果和思路。
本文作者:居佳佳,郭铭浩,熊亮春
元数据:用来定义并指导数据库系统如何解析与处理用户存在数据库中数据的数据。 General DDL 语句:这类 DDL 语句的完成,只涉及元数据修改即可。 Reorg DDL 语句:这类需要处理用户实际数据的 DDL 语句。
TiDB 在线 DDL 变更功能曾有效缓解了用户在数据库使用和演进过程中的痛点。然而,随着用户规模和数据量的不断增长,创建索引的性能瓶颈日益凸显。我们通过优化索引构建流程,将索引创建速度提升了 10 倍。随后,我们将索引创建任务迁移至分布式框架,进一步提升了大表索引的构建效率。
随着 SaaS 用户对 TiDB 的深入应用,百万级表的场景对 DDL 框架提出了更高要求。一方面,我们需要显著提升框架的吞吐量,以在有限时间内完成大量 DDL 操作;另一方面,需要保证框架在高并发、高负载下的稳定性与扩展性。为此,我们在过去半年里,重点优化了框架的扩展性,提升了 DDL 语句的执行效率。以下为部分测试结果:
1. TiDB v8.2
通过对比 TiDB v8.1 和 v8.2 的 DDL 任务执行 QPS,我们可以清晰地看到,v8.2 版本的性能得到了大幅提升。在 v8.1 中,DDL 任务的平均 QPS 约为 7,而 v8.2 则达到了 38,峰值更是达到了 80,性能提升了约 5 倍。这表明,TiDB 团队在 v8.2 版本中对 DDL 语句的执行效率进行了深入优化,取得了显著成效。
2. TiDB v8.3
与 v8.2 版本相比,TiDB v8.3 在 DDL 任务执行的 QPS 上实现了大幅提升。v8.3 的最大 QPS 达到 200 左右,平均 QPS 也提升至 180 左右,性能表现更加稳定。这表明 TiDB 团队在 v8.3 版本中对 DDL 语句的执行效率进行了持续优化,并取得了令人瞩目的成果。
启用 Fast Create Table 优化后,DDL 操作的每秒查询次数(QPS)可提升一倍,显著提高系统的整体吞吐量。
3. TiDB v8.5
为了全面评估 TiDB v8.5 版本中 DDL 性能的优化效果,我们在实验室搭建了一个专用的测试集群。该集群的硬件配置如下:
测试结果如下:
在百万张表场景下,TiDB v8.5 版本的建表速度相比 v7.5 版本实现了 50 倍的性能提升。
在深入探讨 TiDB DDL 优化之前,我们先来了解一下 TiDB DDL 语句的执行过程。TiDB 作为一款支持在线 DDL 的分布式数据库,其 DDL 操作能够在不影响业务的情况下进行。我们将重点介绍在线 DDL 变更的执行流程,包括 SQL 解析、Job 创建、后台执行等环节,为后续的优化讲解打下基础。
1 DDL 语句任务运行流程
TiDB DDL 执行流程
当用户通过客户端向 TiDB 提交一条 CREATE TABLE 语句时,TiDB 会依次执行以下步骤:
2 在线 Schema 变更简介
前面我们介绍了 TiDB DDL 任务的整体执行流程。接下来,让我们聚焦到在线 Schema 变更的细节上。当一个 Job Worker 接收到一个在线 DDL 任务时,它会按照以下步骤逐步完成任务:
为了保证 schema 变更的正确性,online-schema 算法维持了以下的不变性:在任何时间,针对某个 schema 对象,整个集群中最多只有两个相连的状态存在。因此在执行完单步变更后,Job worker 需要等待系统中的所有 TiDB 节点都推进到改动后的状态,然后才能执行下一步,直到 Schema 达到最终的目标状态。
因此,在线 Schema 变更会循环执行以下几个步骤:
思考问题:
通过以上步骤,TiDB 能够安全、高效地执行在线 Schema 变更,保证业务的连续性。
1 工程思考
图:DDL 里程碑
如上图所示,我们针对 General DDL 类型的优化制定了一条清晰的路线图。考虑到 TiDB DDL 执行框架经过多年的迭代已相对稳定,为确保优化过程的安全性和高效性,我们在优化之初确立了以下几条原则:
实践证明,这些原则在 DDL 优化项目中取得了良好的效果。我们成功将一个复杂的优化任务分解为多个可管理的子任务,并通过持续迭代的方式,逐步提升了 DDL 执行性能。
具体来说,我们通过以下方式来实现这些原则:
在接下来的章节中,我们将详细分享我们在 DDL 优化过程中遇到的挑战、采用的解决方案以及取得的成果。
2 优化路线
从 DDL 里程碑图中可以看出,在 TiDB v7.5 左右,我们面临着一个严峻的挑战:用户希望在一个 TiDB 集群中管理百万级表。然而,我们的测试结果显示,TiDB v7.6 在创建 50 万张表后性能急剧下降,无法支撑更大规模的建表需求。这表明 TiDB 在大规模建表场景下存在严重的性能瓶颈,阻碍了其在海量数据场景下的应用。为了解决这一问题,我们团队投入了大量精力,对 TiDB 的核心组件进行了深入优化。
基于上述工程思考原则,我们深入探索并结合实际情况,制定了如下优化路线:
下图是我们到 8.1 版本时,优化的效果展示:
DDL 框架的重构是一项复杂而艰巨的任务,但其带来的收益是巨大的。通过重构,我们可以打造一个更加稳定、高效、可扩展的 DDL 框架,为未来的业务发展提供坚实的基础。
本文介绍了 TiDB v8 版本中 DDL 优化的效果和重构的思考,在接下来的文章中,我们将深入解析 TiDB DDL 重构的技术实现。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。