Batch Dumping Statistics Delta

Background Recently, we have been tackling the challenge of supporting 3 million tables within a single TiDB cluster. One of the most significant hurdles we’ve faced is optimizing the performance of statistics collection. In its current implementation, TiDB gathers basic table information from all servers and consolidates it into a single system table. While functional, this approach becomes highly inefficient when managing millions of tables, consuming excessive CPU and taking a considerable amount of time....

December 14, 2024 · 8 min · Rustin liu

TiDB Analyze

December 14, 2024 · 0 min · Rustin liu

Simplifying TiDB Statistics Collection: Unifying Concurrency Controls

Background TiDB provides the analyze table table_name command to generate statistics for tables. When analyzing partitioned tables, TiDB processes each partition independently and in parallel. Once analysis completes, TiDB aggregates the individual partition statistics into a single global statistics object for the entire table. The analyze table command has two concurrency-related parameters: tidb_build_stats_concurrency: Determines how many partitions can be processed simultaneously during statistics collection tidb_analyze_partition_concurrency: Controls parallel workers for saving partition statistics However, these parameters have several drawbacks:...

November 18, 2024 · 6 min · Rustin liu

TiCDC 架构和数据同步链路解析

TiCDC 是 TiDB 生态中的一个数据同步工具,它通过拉取 TiKV 的变更日志实现数据的增量同步。它除了可以将 TiDB 的数据同步至 MySQL 兼容的数据库之外,还提供了同步至 Kafka 的能力,支持 canal 和 avro 多种开放消息协议供其他系统订阅数据变更。 基本概念 以下这些都是理解 TiCDC 架构之前需要熟悉的基本概念,主要是对 TiDB 内部的一些组件和概念的解释。 TiDB: 下文中提到的 TiDB 主要是指它作为是一个计算层的抽象提供执行 SQL 的能力,没有真实的存储数据。 TiKV: 一个支持 ACID 的键值数据库,它可以作为 TiDB 的存储层。 Region: 它是 TiKV 数据移动的基本单位,可以将它认为是一组键值对集合。每个 Region 被复制到多个 TiKV 节点。 两阶段提交:一种分布式算法,它协调所有参与分布式原子事务的进程,决定是否提交或中止(回滚)该事务。 StartTs: TiDB 在开始两阶段提交时获取到的一个全局唯一递增的时间戳作为当前事务的唯一事务 ID,这里称为该事务的 start_ts。 CommitTs: TiDB 在提交两阶段提交事务时获取到另外一个全局唯一递增的时间戳作为该事务的 commit_ts。 什么是 CDC? CDC 的全称为 Change Data Capture,它是指从源数据库捕获数据并且将其同步到其他数据库或者应用程序的过程。它作为一种很常见的数据集成方式被大量的应用在数据仓库中。当然任何的数据库系统都可以构建自己的 CDC,比如 SQL Server 的 CDC。TiCDC 就是专属于 TiDB 的 CDC,它的上游只能是 TiDB,但是它的下游可以是其他 MySQL 兼容的数据库系统,也可以是消息队列。...

July 11, 2022 · 5 min · Rustin liu

使用 TiCDC 将 TiDB 数据接入 Flink

免责声明:我既不懂 TiCDC,也不懂 Flink。所以下面的文章很有可能是一派胡言。 最近我在帮 TiCDC 的 Kafka Sink 做多 Topic 支持,目标是让 TiCDC 能够把 TiDB 的数据接入到 Flink。其实现在的 TiCDC 就具备接入 Flink 的能力,只是受限于目前的 Kafka Sink 只能支持单个 Topic,接入和维护非常麻烦。 我来介绍一下目前 TiCDC 接入 Flink 的现状和方法。 此博客在 GitHub 上公开发布. 如果您有任何问题或疑问,请在此处打开一个 issue. 简介 TiCDC Kafka Sink 支持多种协议格式,其中活跃维护的是 TiCDC 自己实现的 open-protocol 和阿里巴巴的 canal-json 协议。这次我们需要使用 canal-json 协议并通过 Flink 的 Kafka connector 接入 Flink 系统。 启动 TiDB 和 TiCDC 集群 推荐使用 TiUP 启动 TiDB 和 TiCDC 集群,因为今天只是简单演示所以我就用 TiUP 的 Playground 启动测试集群。...

January 30, 2022 · 4 min · Rustin liu

开源社区分析报告背后的数据支撑: GH Archive

最近应老板要求看了一个 X-lab 针对 GitHub 开源项目的分析报告,发现了一个背后非常好用并且强大的数据集。所以简单介绍一下这个数据集的收集方式和使用方法。 此博客在 GitHub 上公开发布. 如果您有任何问题或疑问,请在此处打开一个 issue. 简介 前段时间过年的时候老板给我发来了一个 X-lab 实验室做的 GitHub 开源项目的分析报告想让我看看我们是否可以学习和利用其中的分析方法和数据集。我就看了看这个报告,发现它其实背后是使用了另外一个开源项目 GH Archive 归档的数据集并配合 ClickHouse 生成了分析报告。所以我就简单的看了看这个项目,下面是这个 GitHub 归档项目的实现思路和使用方法。 GH Archive 设计和实现思路 GH Archive 采取了一个非常暴力但是非常有效的归档方式,他们将 GitHub 所有的事件的都利用 GitHub 提供的 Event API 爬取了下来,然后按照 JSON 的格式存了下来。 他们使用 ruby 来调用 GitHub API 进行爬取,具体的代码在 crawler.rb。有效的代码不超过一百行,所以就不具体展开解读了。主要就是调用 API 并且将数据按照日期整理为 JSON 格式的文件。 同步至 BigQuery 数据集 GH Archive 通过爬取的方式整理好数据之后提供了 JSON 数据集的下载服务,我们可以通过 HTTP 客户端下载这些数据集,例如使用 wget: wget https://data.gharchive.org/2015-01-01-15.json.gz 这样我们就可以下载 2015 年 1 月 1 日 GitHub 所有公开仓库的所有事件。...

March 7, 2021 · 2 min · Rustin liu

TiDB High Performance 课程实验 1

大家好,我是 Rustin. 最近开始做贵司推出的 TiDB High Performance 课程,所以开个课程实验记录的坑! 此博客在 GitHub 上公开发布. 如果您有任何问题或疑问,请在此处打开一个 issue. 简介 在高性能挑战赛的 文档 中找到第一节课的实验描述,实验需要分别下载和编译 TiDB, TiKV 和 PD, 并且需要修改 TiDB 源码让其在启动事务的时候,打印一句 hello transation 的日志。下面我就简单记录一下整个实验过程。 克隆源码并编译 需要分别克隆和编译 TiDB, TiKV 和 PD. 这三个库分别对应了 TiDB 中的计算,存储和调度三个层面。具体内容可以参考课程文档中对应的三篇文章。 编译 TiDB git clone https://github.com/Rustin170506/tidb 在编译之前,需要我们安装 make 工具,因为三个项目的 build 都是用 makefile 来组织的。查看 makefile 可以看到 .PHONY 中有个 server 的伪目标。内容如下: server: ifeq ($(TARGET), "") CGO_ENABLED=1 $(GOBUILD) $(RACE_FLAG) -ldflags '$(LDFLAGS) $(CHECK_FLAG)' -o bin/tidb-server tidb-server/main.go else CGO_ENABLED=1 $(GOBUILD) $(RACE_FLAG) -ldflags '$(LDFLAGS) $(CHECK_FLAG)' -o '$(TARGET)' tidb-server/main....

September 3, 2020 · 3 min · Rustin liu

从 pingcap tidb 学习使用静态检查工具提升代码质量

大家好,我是 Rustin 。今天想跟大家简单介绍一下如何使用一些 golang 的静态代码检查工具来提升代码质量! 此博客在 GitHub 上公开发布. 如果您有任何问题或疑问,请在此处打开一个 issue。 简介 从去年接触到 TiDB 就开始尝试在社区帮忙修复一些简单的 Bug。最近,我在阅读代码的过程中发现 TiDB 的代码库中有大量的没有必要的类型转换,我就用 GoLand 分析检查出大部分的无效的类型转化, 然后提了一个 PR (CEO 半夜 review 代码,哈哈哈)修复。在这个 PR 中 zz-jason 大神 评论希望能够通过静态检查工具来检测无效的类型转换。 我经过一些研究,决定使用 unconvert 来检测无效的类型转换,然后在这个 PR 解决了这个问题。 最近我终于有机会在公司写 Go了,所以我也想在公司的项目上配置和使用一些静态检查工具来提升代码质量。 在经过一下午的努力之后终于把 TiDB 的大部分检查工具移植到了公司项目上,并且在 github 上创建了一个模板项目 go-boilerplate 。下面我就简单介绍一下这个模板的构建过程和使用的方式。 init 项目,添加代码 我最近使用的 Go 版本 1.13.8,所以就使用 go mod 来初始化和管理项目。 go mod init github.com/Rustin170506/go-boilerplate 然后我添加了 main 文件和一个用作例子的 foo 文件,目录结构如下所示: . ├── foo.go ├── foo_test.go ├── go.mod ├── go....

April 25, 2020 · 4 min · Rustin liu