【TiDB 4.0 PCTA 学习笔记】- 2.3.3 Import Data to TiDB(将数据导入 TiDB)@2班+王维

课程名称:将数据导入 TiDB

学习时长:30

课程收获:了解如何将已有数据导入到 TiDB 集群中

课程内容:

本课程简要介绍如何将已有数据导入到 TiDB 集群中。内容主要包括:用于导入全量数据的 TiDB Lightning 的概要介绍、功能特性、适用场景及使用示例;用于增量(或全量+增量)数据导入的 TiDB Data Migration 的概要介绍、功能特性、适用场景及使用示例。

Lightning

特点及使用场景:
TiDB Lightning 工具支持高速导入 Mydumper 和 CSV 文件格式的数据文件到 TiDB 集群,导入速度可达每小时 300 GB,是传统 SQL 导入方式的 3 倍多。
它有两个主要的目标使用场景:

  • 大量新数据的快速导入
  • 全量数据恢复

Lightning 工作原理

  1. tidb-lightning 会扫描数据文件,区分出结构文件(包含 CREATE TABLE 语句)和数据文件(包含 INSERT 语句)。
  2. 结构文件的内容会直接发送到 TiDB,用于建立数据库和表。
  3. tidb-lightning 会并发处理数据文件。
    3.1 tidb-lightning 会找出每一行的位置,并分配一个行号,这样即使没有定义主键的表也能够区分每一行。
    3.2 tidb-lightning 会直接借助 TiDB 实例把 SQL 转换为键值对,称为“键值编码器”(KV encoder),与外部的 TiDB 集群不同,键值编码器是寄存在 tidb-lightning 进程内的,并使用内存存储;
    3.3 每执行完一个 INSERT 之后,tidb-lightning 可以直接读取内存获取转换后的键值对(这些键值对包含数据及索引),并发送到 tikv-importer。

Lightning 并发设置

tidb-lightning 把数据文件拆分成多个能并发执行的小任务。下面的配置选项可以帮助调节这些任务的并发度

  • batch-size :对于很大的表,比如超过 5 TB 的表,如果一次性导入,可能会因为 tikv-importer 磁盘空间不足导致失败。tidb-lightning 会按照 batch-size 的配置对一个大表进行切分,导入过程中每个批次使用单独的引擎文件。 batch-size 不应该小于 100 GB,太小的话会使 region balance 和 leader balance 值升高,导致 Region 在 TiKV 不同节点之间频繁调度,浪费网络资源。
  • table-concurrency :同时导入的批次个数。如上所述,每个表会按照 batch-size 切分成多个批次。
  • index-concurrency :并行的索引引擎文件个数。 table-concurrency + index-concurrency 的总和必须小于 tikv-importer 的 max-open-engines 配置。
  • io-concurrency :并发访问磁盘的 I/O 线程数。由于磁盘内部缓存容量有限,过高的并发度容易引发频繁的 cache miss,导致 I/O 延迟增大。因此,不建议将该值调整得太大。
  • block-size :默认值为 64 KB。tidb-lightning 会一次性读取一个 block-size 大小的数据文件,然后进行编码。
  • region-concurrency :每个批次的内部线程数。每个线程要执行读文件、编码和发送到 tikv-importer 等步骤。
    – 读文件会消耗 I/O 资源,需要调节 io-concurrency 控制并发读取。
    – 编码过程的瓶颈主要在 CPU,需要适当调整 region-conconcurrency 配置。

Dumpling 工作原理

背景

首先介绍一下 Dumpling 的诞生背景,在 Dumpling 诞生之前 PingCAP 提供了 Mydumper 的 fork 版本作为 TiDB 逻辑备份工具。随着 TiDB 生态的发展,Mydumper 由于种种先天不足,无法进一步满足实际应用中的需要。

特点

Mydumper 的不足主要有以下几点:

  • 导出的数据格式无法满足 TiDB Lighting 数据导入工具的快速解析需要
  • Mydumper 官方仓库年久失修,TiDB 并不倾向于在 fork 版本中继续提供新特性
  • Mydumper 使用 C 语言及 GLib 开发,难以集成到与 Go 语言为主的 TiDB 生态工具,例如 DM 等
  • Mydumper 本身采用的开源协议与 TiDB 所使用的开源协议不兼容

基于这些原因考虑,以 Dumpling 取而代之成为了更好的选择。Dumpling 将提供以下几个特性:

  • 完全采用 Golang,与 TiDB 生态集成度高
  • 能够提供 Mydumper 类似的功能,且支持并发高速导出 MySQL 协议兼容数据库数据
  • 提供 SQL、CSV 等多种数据输出格式,以便于快速导出及导入
  • 支持直接导出数据到云存储系统,比如 S3

Dumpling 的组成

Dumpling分为六个比较重要的部分,分别负责配置解析、数据库信息预处理、一致性控制器、Black & White 列表、写控制器及表数据中间层表示。下面详细介绍一下各个部分的工作内容:

  • 配置解析:处理用户通过命令行传入的参数
  • 数据库信息预处理:在数据导出任务进行之前,获取数据库服务器版本、数据表、数据库视图等相关信息并进行预处理
  • 一致性控制器:通过用户传入的一致性规则,在数据导出过程中保障数据一致性
  • Black & White 列表:根据设置的规则过滤不需要导出的数据表
  • 写控制器:负责将导出的数据写入到本地文件或云端存储系统
  • 表数据中间表示层:中间表示层将数据表进行封装,提供一套 API 以供写控制器进行数据迭代写入

Data Migration 简介

背景:

TiDB Data Migration (DM) 是一体化的数据迁移任务管理平台,支持从 MySQL 或 MariaDB 到 TiDB 的全量数据迁移和增量数据复制。使用 DM 工具有利于简化错误处理流程,降低运维成本。

改进

数据迁移任务的高可用,部分 DM-master、DM-worker 节点异常后仍能保证数据迁移任务的正常运行。
乐观协调模式下的 sharding DDL 可以在部分场景下减少 sharding DDL 同步过程中的延迟、支持上游数据库灰度变更等场景。
更好的易用性,包括新的错误处理机制及更清晰易读的错误信息与错误处理建议。
与上下游数据库及 DM 各组件间连接的 TLS 支持。
实验性地支持从 MySQL 8.0 迁移数据。

DM 架构

DM 主要包括三个组件:DM-master,DM-worker 和 dmctl。

DM-master 负责管理和调度数据迁移任务的各项操作。

  • 保存 DM 集群的拓扑信息
  • 监控 DM-worker 进程的运行状态
  • 监控数据迁移任务的运行状态
  • 提供数据迁移任务管理的统一入口
  • 协调分库分表场景下各个实例分表的 DDL 迁移

DM-worker 负责执行具体的数据迁移任务。

  • 将 binlog 数据持久化保存在本地
  • 保存数据迁移子任务的配置信息
  • 编排数据迁移子任务的运行
  • 监控数据迁移子任务的运行状态
  • 有关于 DM-worker 的更多介绍,详见 DM-worker 简介。

dmctl 是用来控制 DM 集群的命令行工具。

  • 创建、更新或删除数据迁移任务
  • 查看数据迁移任务状态
  • 处理数据迁移任务错误
  • 校验数据迁移任务配置的正确性

学习过程中参考的其他资料