星辰考古:TiDB v2.x 回忆杀

前情回顾

在上一篇文章 星辰考古:TiDB v1.0 再回首 中,我们“回忆”了 TiDB 1.0 的内容,本文将介绍 TiDB 2.x 的相关内容。

从 TiDB 2.x 开始,正式引入 TiSpark 大数据组件,用于解决用户复杂的 OLAP 需求。

TiDB 2.x 整体架构图“升级”如下。

星辰考古:TiDB v2.x 回忆杀-1

主要时间线

TiDB 2.x 系列在 2 年时间迭代了40个小版本,包含了大量的优化和改进,也是从这个大版本开始,商业案例逐渐增长,并且今日仍有客户的生产环境运行着 2.x 版本。

  • 2018-04-27,TiDB 发布 2.0 GA 版。相比 1.0 版本,该版本对 MySQL 兼容性、系统稳定性、优化器和执行器做了很多改进。
  • 2018-11-30,TiDB 发布 2.1 GA 版。相比 2.0 版本,该版本对系统稳定性、性能、兼容性、易用性做了大量改进。
  • 2019-01-03,TiDB 发布 2.0.11 版。这是 2.0 系列的最后一个小版本。
  • 2019-12-27,TiDB 发布 2.1.19 版。这是 2.1 系列的最后一个小版本。

TiDB 2.x 特性清单

下面摘录了一些 TiDB 2.x 的重要特性,更多内容还请参阅官方文档。

从 2.0.5 版本开始,TiDB 文档也有所改进,标记了每一项对应的 PR 链接,并按模块、新特性、优化改进、问题修复等进行分类,文档结构更加清晰。

TiDB

  • 增加 tidb_config session 变量,输出当前 TiDB 配置 (批注:此时还没有 I_S.cluster_config 表)
  • 添加 Session 变量 tidb_auto_analyze_ratio 控制统计信息自动更新阈值
  • 支持只在一天中的某个时间段开启统计信息自动更新的功能 #7570
  • 新增 update-stats 配置项,控制是否更新统计信息 #10772
  • 支持通过配置文件设置单条 SQL 语句使用内存的大小,减少程序 OOM 风险
  • 支持 Delete 语句中使用 USE INDEX 的语法
  • 支持用科学计数法显示浮点数
  • ADMIN SHOW DDL JOBS 输出更详细的 DDL 任务状态信息,输出信息中添加表名、库名等信息
  • 支持 admin show ddl jobs 命令,支持输出 number 个 DDL jobs #7028
  • 支持 ADMIN SHOW DDL JOB QUERIES 查询当前正在运行的 DDL 任务的原始语句
  • 支持使用 admin show slow 语句来获取 SLOW QUERY LOG #7785
  • 支持并行 DDL 任务执行 #6955
  • 增加控制 DDL 并发度的选项 #7563
  • 支持 ADMIN RECOVER INDEX 命令,用于灾难恢复情况下修复索引数据
  • 完成 Admin Restore Table 功能方案设计 #7383
  • 新增 ADMIN PLUGINS ENABLE/DISABLE SQL 语句,支持通过 SQL 动态开启/关闭 Plugin #11189
  • 在日志中记录 ADD INDEX 执行过程中的慢操作,便于定位问题 #7083
  • 支持 Add Index 语句与其他 DDL 语句并行执行,避免耗时的 Add Index 操作阻塞其他操作
  • 添加统计 Add Index 操作进度的监控 #12389
  • 支持 SET TRANSACTION 语法
  • 支持 SHOW GRANTS FOR CURRENT_USER();
  • 新增 SHOW TABLE REGIONS 的语句,支持通过 SQL 查询表的 Region 分布情况 #11238
  • SHOW TABLE REGIONS 语法新增 WHERE 条件子句

    MySQL [s1]> show table t regions where region_id = 2; +-----------+-----------+---------+-----------+-----------------+-------+------------+ | REGION_ID | START_KEY | END_KEY | LEADER_ID | LEADER_STORE_ID | PEERS | SCATTERING | +-----------+-----------+---------+-----------+-----------------+-------+------------+ | 2 | t_35_ | | 3 | 1 | 3 | 0 | +-----------+-----------+---------+-----------+-----------------+-------+------------+ 1 row in set (0.01 sec)

  • 支持在 SHOW 语句中使用子查询,现在可以支持诸如 SHOW COLUMNS FROM tbl WHERE FIELDS IN (SELECT ‘a’) 的写法 #11461

    MySQL [s1]> SHOW COLUMNS FROM t WHERE FIELD IN (SELECT 'id'); +-------+---------+------+------+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+------+---------+-------+ | id | int(11) | YES | | NULL | | +-------+---------+------+------+---------+-------+ 1 row in set (0.00 sec)

  • 支持 HTTP API 获取 TiDB 参数信息 (批注:非常实用的功能)
  • 添加 HTTP API 打散 table 的 Regions 在 TiKV 集群中的分布
  • 支持在线更改日志级别
  • 在 information_schema 里添加 PROCESSLIST 表 #7286

    MySQL [s1]> desc information_schema.processlist; +---------+----------------------+------+------+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+----------------------+------+------+---------+-------+ | ID | bigint(21) UNSIGNED | YES | | NULL | | | USER | varchar(16) | NO | | NULL | | | HOST | varchar(64) | NO | | NULL | | | DB | varchar(64) | YES | | NULL | | | COMMAND | varchar(16) | NO | | NULL | | | TIME | int(7) UNSIGNED | YES | | NULL | | | STATE | varchar(7) | YES | | NULL | | | INFO | binary(512) UNSIGNED | YES | | NULL | | | MEM | bigint(21) UNSIGNED | YES | | NULL | | +---------+----------------------+------+------+---------+-------+ 9 rows in set (0.01 sec)

  • 添加 auto_analyze_ratio 系统变量控制自动 analyze 的阈值
  • 添加 tidb_retry_limit 系统变量控制事务自动重试的次数
  • 增加一个系统变量 tidb_disable_txn_auto_retry ,用于关闭事务自动重试 #6877
  • 支持 select tidb_is_ddl_owner() 语句,方便判断 TiDB 是否为 DDL Owner
  • 增加变量 ddl_reorg_batch_size 来控制添加索引的速度 #8614
  • 将缓存 100 个 Schema 变更相关的表信息调整成 1024 个,且支持通过 tidb_max_delta_schema_count 系统变量修改 #12515
  • 将表的默认字符集和排序规则改为 utf8mb4 和 utf8mb4_bin #8590

    MySQL [s1]> create table t (id int); Query OK, 0 rows affected (0.13 sec) MySQL [s1]> show create table t\G *************************** 1. row *************************** Table: t Create Table: CREATE TABLE `t` ( `id` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin 1 row in set (0.00 sec)

PD

  • 支持手动 split Region,可用于处理单 Region 热点的问题
  • 开启 Region merge 功能
  • 支持批量 split Region
  • 添加 Raft Learner 支持
  • TSO 分配不再受系统时间回退影响
  • PD 新增 config-check 选项,用于检查 PD 配置项是否合法 #1725
  • pd-ctl 新增 remove-tombstone 命令,支持清理 tombstone store 记录 #1705

TiKV

  • 限制接收 snapshot 时的内存使用,解决极端情况下的 OOM
  • 可以配置 Coprocessor 在遇到 warnings 时的行为
  • TiKV 支持导数据模式
  • 支持 Region 从正中间分裂
  • tikv-ctl 支持 compact 指定的 Region
  • Raw KV 支持 Batch Put、Batch Get、Batch Delete 和 Batch Scan
  • tikv-importer 作为独立的 binary 从 TiKV 中分离出来
  • 空集群默认打开 dynamic-level-bytes 参数减少空间放大

说明:

关于 TiDB Ansible,TiSpark 等其他组件这里没有列出。

TiDB Ansible 项目已归档,如果你需要部署新版本的 TiDB,请使用强大的 TiDB 集群管理工具 TiUP。

在 TiDB 最新版本中,TiFlash 组件补齐了 HTAP 的重要一环,或许 TiSpark 已经可以退出历史舞台。

升级提示

  • 由于新版本存储引擎更新,不支持在升级后回退至 2.0.x 或更旧版本
  • 从 2.0.6 之前的版本升级到 2.1 之前,最好确认集群中是否存在正在运行中的 DDL 操作,特别是耗时的 Add Index 操作,等 DDL 操作完成后再执行升级操作
  • 因为 2.1 版本启用了并行 DDL,对于早于 2.0.1 版本的集群,无法滚动升级到 2.1,可以选择下面两种方案:
    • 停机升级,直接从早于 2.0.1 的 TiDB 版本升级到 2.1
    • 先滚动升级到 2.0.1 或者之后的 2.0.x 版本,再滚动升级到 2.1 版本
  • 从 2.1 开始,引入版本控制机制,支持集群滚动兼容升级

本系列文章是为 TiDB 版本升级材料包的一部分,如果你对 TiDB 社区升级互助活动感兴趣,欢迎点击下面的链接报名。

https://asktug.com/t/topic/1025499

星辰考古:TiDB v2.x 回忆杀-2

使用 TiDB Ansible 部署 TiDB 集群

注:这里只为考古演示,并非生产环境部署步骤。

Ansible 是一个开源 IT 自动化引擎,可自动执行配置、配置管理、应用程序部署、编排和许多其他 IT 流程。它可免费使用,并且该项目受益于其数千名贡献者的经验和智慧。

TiDB Ansible 是 PingCAP 基于 Ansible playbook 功能编写的集群部署工具。它可以帮助你快速部署一个新的 TiDB 集群,其中包括 PD、TiDB、TiKV 和集群监控等组件。

准备环境

当前演示环境为 CentOS 7 操作系统,需要准备 Python 环境。

[root@centos7 ~]# hostnamectl Static hostname: centos7.shawnyan.cn ... Operating System: CentOS Linux 7 (Core) CPE OS Name: cpe:/o:centos:centos:7 Kernel: Linux 3.10.0-1160.119.1.el7.x86_64 Architecture: x86-64 [root@centos7 ~]# python --version Python 2.7.5 [root@centos7 ~]# python3 --version Python 3.6.8