作者: ShawnYan



前情回顾

在前两节中,我们共同“回忆”了 TiDB v1/v2 的相关内容,包括如何手动搭建 TiDB 和使用 TiDB Ansible 搭建 TiDB。

  • 星辰考古:TiDB v1.0 再回首
  • 星辰考古:TiDB v2.x 回忆杀

本节将继续讨论 TiDB v3,在 TiDB 3.x 中处理 AP 业务的主力仍然是 TiSpark,不过 TiFlash 已经初现。

TiDB 3.x 整体架构图再“升级”。

星辰考古:TiDB v3.x 忆水木_https

TiDB v3 时代,TiDB 已在 500+ 用户的生产环境中长期稳定运行,涵盖金融、保险、制造,互联网,游戏等领域,涉及交易、数据中台、历史库等多个业务场景。

如今,TiDB 现已被 3000 多家不同行业的领先企业应用在实际生产环境。



TiDB 3.x 时间线

TiDB 2.x 的时间线是 2018.4--2019.12,TiDB 3.x 的时间线是 2019.1--2020.12

  • 2019-01-19,TiDB 发布 3.0 Beta 版。相比 v2.1 版本,该版本对系统稳定性、优化器、统计信息以及执行引擎做了很多改进。
  • 2019-06-28,TiDB 发布 3.0 GA 版本。相比于 v2.1,v3.0 版本在以下方面有重要改进:
  • 稳定性方面,显著提升了大规模集群的稳定性,集群支持 150+ 存储节点,300+TB 存储容量长期稳定运行。
  • 优化 Raft 副本之间的心跳机制,按照 Region 的活跃程度调整心跳频率,减小冷数据对集群的负担。
  • 热点调度策略支持更多参数配置,采用更高优先级,并提升热点调度的准确性。
  • 优化 PD 调度流程,提供调度限流机制,提升系统稳定性。
  • 新增分布式 GC 功能,提升 GC 的性能,降低大集群 GC 时间,提升系统稳定性。
  • 易用性方面有显著的提升,降低用户运维成本,例如:标准化慢查询日志,制定日志文件输出规范,新增 EXPLAIN ANALYZE,SQL Trace 功能方便排查问题等。
  • 性能方面,与 2.1 相比,TPC-C 性能提升约 4.5 倍,Sysbench 性能提升约 1.5 倍。因支持 View,TPC-H 50G Q15 可正常运行。
  • 新功能方面增加了窗口函数、视图(实验特性)、分区表、插件系统、悲观锁(实验特性)、SQL Plan Management 等特性。
  • 2019-12-31,TiDB 3.0.8 发布,2019 年 TiDB 3.0 系列共发版 14 次。
  • 2020-04-16,TiDB 3.1 GA。
  • 2020-06-04,TiDB 3.1.2 发布,这是 TiDB 3.1 系列的最后一个小版本。
  • 2020-12-25,TiDB 3.0.20 发布,这是 TiDB 3.0 系列的最后一个小版本。

星辰考古:TiDB v3.x 忆水木_tiup_02

(TiDB 3.0 与 2.1 的性能测试对比图)

TiDB 3.x 新特性

TiDB 3.x 历经两年打磨,产品性能和质量都改进很多,不过由于篇幅原因,这里不再列举优化项和修复项。

下面只摘录了部分重要的新特性,以供参考。


TiDB

  • 支持 View #8757
  • 支持 Window Function,支持所有 MySQL 8.0 中的窗口函数 #8630
  • 支持 RANGE/HASH PARTITION
  • 新增 SPLIT PARTITION TABLE 语法,支持分区表切分 Region 功能 #13929
  • 新增分区表自动更新统计信息的功能 #14566
  • 支持字符集从 utf8 转换到 utf8mb4 的功能
  • 默认字符集从 utf8 变为 utf8mb4 #7965
  • 新增 server-version 配置项来控制修改 TiDB server 版本的功能 #13906
  • 支持 admin show next_row_id ,方便获取下一行 ID #8242
  • 支持用 _tidb_rowid 做点查 #13416
  • information_schema.processlist 表中支持显示内存使用信息 #12801
  • 支持悲观事务模式(实验特性) #10297
  • 提高在悲观事务和乐观事务冲突情况下的性能 #10881
  • 新增基于角色的权限访问控制功能(RBAC)(实验特性)

批注

  1. 关于 RBAC 的相关内容,请访问官方文档: https://docs.pingcap.com/zh/tidb/stable/role-based-access-control
  2. 为提升系统安全性,企业版新增特性:IP 白名单功能;Audit log 功能;加密存储。


PD

  • 新增从单个节点重建集群的功能
  • 将 Region 元信息从 etcd 移到 go-leveldb 存储引擎,解决大规模集群 etcd 存储瓶颈问题 #1237
  • 将 etcd 版本升级到 3.4.3 稳定版本,注意升级后只能通过 pd-recover 工具降级 #2058
  • 更改 PD 的 copyright 信息 PingCAP, Inc 为 TiKV Project Authors #2777

批注:

查询 etcd 的版本:

curl -s http://localhost:2379/version
  • 1.
# TiDB v3.0.20
{"etcdserver":"3.4.3","etcdcluster":"3.4.0"}

# TiDB v8.1.0
{"etcdserver":"3.4.31","etcdcluster":"3.4.0"}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.


TiKV

  • 引入了新的存储引擎 Titan #3985
  • 统计信息中新增对 Blob 文件大小的统计 #5060
  • 将内存分配库的默认值由 tikv_alloc/default 改成 jemalloc #6206


TiFlash

  • 初始版本 (3.1.0-beta.2)


参数、配置项

  • 新增 Database 维度的 QPS 监控项, 可以通过配置项 record-db-qps 开启 #9151
  • 新增变量 tidb_allow_remove_auto_inc,默认禁止删除列 AUTO INCREMENT 属性 #12145


监控

  • 新增 /debug/zip HTTP 接口,获取 TiDB 实例的信息,方便排查问题
  • /mvcc/key/{db}/{table}/{handle} API 的返回结果添加 Region ID 信息 #11557
  • 支持通过 /info/all 接口获取所有 TiDB 节点的 binlog 状态 #13187
  • 新增 TiKV summary 监控面板,方便查看集群状态
  • 新增 TiKV trouble_shooting 监控面板,删除重复项,方便排查问题
  • 新增 TiKV details 监控面板,方便调试排查问题
  • 新增 BR 组件的 Grafana 监控 #1093


TiDB Ansible

  • 修改操作系统版本限制,仅支持 CentOS 7.0 及以上,Red Hat 7.0 及以上版本的操作系统 #733
  • 优化 table-regions.py 脚本,按表显示 leader 分布 #739

批注:

对于生产环境的操作系统的版本选择,推荐 RHEL / CentOS 7.9 或者 RHEL / Rocky Linux 8.10。 测试环境可以选择 RHEL / Rocky Linux 9.4, TiDB 都是支持的。

对于 TiDB v3 系列,当时仍可以用相对“成熟”的 TiDB Ansible 来进行部署,然鹅,TiDB Ansible v3.0.20 也是最后一个版本,后面就归档弃用了。


TiDB 3.x 安装部署

同一时期,TiUP 神器“横空出世”,之前介绍过 TiUP 相关内容,详情戳这里:

  • 震惊!数据库小白装国产数据库只需10分钟!
  • TiDB 7.x 源码编译之 TiUP 篇
  • TiUP:TiDBAer 必备利器

这里我们使用 TiUP 来部署 TiDB v3.0.20。

[shawnyan@centos7 ~]$ tiup cluster list
Name    User  Version  ...
----    ----  -------  ...
mytidb  tidb  v3.0.20  ...
  • 1.
  • 2.
  • 3.
  • 4.

查看基础信息。

[shawnyan@centos7 ~]$ mysql -uroot -h127.0.0.1 -P4000
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.25-TiDB-v3.0.20 MySQL Community Server (Apache License 2.0)

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [(none)]> select version(), tidb_version()\G
*************************** 1. row ***************************
     version(): 5.7.25-TiDB-v3.0.20
tidb_version(): Release Version: v3.0.20
Git Commit Hash: 9ab0bbf9a012aaf8ae2d3e1eee2a321e03a0d5c1
Git Branch: heads/refs/tags/v3.0.20
UTC Build Time: 2020-12-25 04:33:21
GoVersion: go version go1.13 linux/amd64
Race Enabled: false
TiKV Min Version: v3.0.0-60965b006877ca7234adaced7890d7b029ed1306
Check Table Before Drop: false
1 row in set (0.001 sec)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.

(皮一下,这里用了系统自带的 MariaDB 客户端连接了兼容 MySQL 的 TiDB 数据库)

$ curl -s localhost:10080/info | jq
{
  "is_owner": true,
  "version": "5.7.25-TiDB-v3.0.20",
  "git_hash": "9ab0bbf9a012aaf8ae2d3e1eee2a321e03a0d5c1",
  "ddl_id": "eba21fb1-4c74-4043-be6d-f082ed730794",
  "ip": "127.0.0.1",
  "listening_port": 4000,
  "status_port": 10080,
  "lease": "45s",
  "binlog_status": "Off"
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.


部分差异

TiDB 每个版本都包含了大量的新特性和优化点,这里无法面面俱到,只分享一些重要的差异,抛砖引玉。


ROOT 权限

TiDB v3.0.20 默认 root 用户的权限有 25 项,而 v8.1.0 中 root 用户的权限有 31 项。

SELECT PRIVILEGE_TYPE 
FROM information_schema.USER_PRIVILEGES 
WHERE GRANTEE = "'root'@'%'";
  • 1.
  • 2.
  • 3.
-- TiDB 3.0.20
Select
Insert
Update
Delete
Create
Drop
Process
References
Alter
Show Databases
Super
Execute
Index
Create User
Trigger
Create View
Show View
Create Role
Drop Role
CREATE TEMPORARY TABLES
LOCK TABLES
CREATE ROUTINE
ALTER ROUTINE
EVENT
SHUTDOWN

-- TiDB 8.1.0
CREATE TABLESPACE
RELOAD
FILE
CONFIG
REPLICATION CLIENT
REPLICATION SLAVE
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.


I_S.processlist 表结构

TiDB v3 支持在 processlist 表显示内存使用情况。而在 TiDB v8 中我们可以看到更多信息,增加了 DIGEST,DISK,RESOURCE_GROUP,SESSION_ALIAS 等字段。

-- TiDB 3.0.20
MySQL [(none)]> select * from information_schema.processlist;
+------+------+-----------+------+---------+------+-------+----------------------------------------------+------+----------+
| ID   | USER | HOST      | DB   | COMMAND | TIME | STATE | INFO                                         | MEM  | TxnStart |
+------+------+-----------+------+---------+------+-------+----------------------------------------------+------+----------+
|   15 | root | 127.0.0.1 | NULL | Query   |    0 | 2     | select * from information_schema.processlist |    0 |          |
+------+------+-----------+------+---------+------+-------+----------------------------------------------+------+----------+
1 row in set (0.003 sec)

-- TiDB 8.1.0
MySQL [(none)]> select * from information_schema.processlist;
+------------+------+-----------------+------+---------+------+------------+--------...+----------...+------+------+----------+----------------+---------------+
| ID         | USER | HOST            | DB   | COMMAND | TIME | STATE      | INFO   ...| DIGEST   ...| MEM  | DISK | TxnStart | RESOURCE_GROUP | SESSION_ALIAS |
+------------+------+-----------------+------+---------+------+------------+--------...+----------...+------+------+----------+----------------+---------------+
| 3305111560 | root | 127.0.0.1:19364 | NULL | Query   |    0 | autocommit | select ...| 4b5e7cdd5...|    0 |    0 |          | default        |               |
+------------+------+-----------------+------+---------+------+------------+--------...+----------...+------+------+----------+----------------+---------------+
1 row in set (0.001 sec)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.


全局变量

TiDB v3.0.20 共有 531 个全局变量,其中以 tidb_ 开头的变量 42 个。

而 TiDB v8.1.0 中,共有 655 个全局变量,其中以 tidb_ 开头的变量 271 个,以 pd_ 开头的变量 1 个,以 tikv_ 开头的变量 1 个,以 tiflash_% 开头的变量 7 个。

-- TiDB 3.0.20
MySQL [mysql]> select count(*) from mysql.GLOBAL_VARIABLES;
+----------+
| count(*) |
+----------+
|      531 |
+----------+
1 row in set (0.002 sec)

MySQL [(none)]> select * from mysql.GLOBAL_VARIABLES where VARIABLE_NAME like 'tidb_%';
+------------------------------------+----------------+
| VARIABLE_NAME                      | VARIABLE_VALUE |
+------------------------------------+----------------+
| tidb_hash_join_concurrency         | 5              |
| tidb_stmt_summary_history_size     | 24             |
| tidb_txn_mode                      | pessimistic    |
| tidb_stmt_summary_refresh_interval | 1800           |
| tidb_union_concurrency             | 4              |
| tidb_hashagg_final_concurrency     | 4              |
| tidb_build_stats_concurrency       | 4              |
| tidb_opt_correlation_exp_factor    | 1              |
| tidb_index_lookup_join_concurrency | 4              |
| tidb_enable_table_partition        | auto           |
| tidb_index_join_batch_size         | 25000          |
| tidb_store_limit                   | 0              |
| tidb_init_chunk_size               | 32             |
| tidb_opt_join_reorder_threshold    | 0              |
| tidb_opt_correlation_threshold     | 0.9            |
| tidb_hashagg_partial_concurrency   | 4              |
| tidb_ddl_reorg_worker_cnt          | 4              |
| tidb_max_delta_schema_count        | 1024           |
| tidb_max_chunk_size                | 1024           |
| tidb_projection_concurrency        | 4              |
| tidb_disable_txn_auto_retry        | 1              |
| tidb_constraint_check_in_place     | 0              |
| tidb_auto_analyze_start_time       | 00:00 +0000    |
| tidb_enable_cascades_planner       | 0              |
| tidb_backoff_lock_fast             | 100            |
| tidb_index_lookup_concurrency      | 4              |
| tidb_enable_stmt_summary           | 0              |
| tidb_auto_analyze_end_time         | 23:59 +0000    |
| tidb_opt_insubq_to_join_and_agg    | 1              |
| tidb_skip_isolation_level_check    | 0              |
| tidb_enable_window_function        | 1              |
| tidb_retry_limit                   | 10             |
| tidb_scatter_region                | 0              |
| tidb_index_serial_scan_concurrency | 1              |
| tidb_index_lookup_size             | 20000          |
| tidb_auto_analyze_ratio            | 0.5            |
| tidb_distsql_scan_concurrency      | 15             |
| tidb_enable_fast_analyze           | 0              |
| tidb_backoff_weight                | 2              |
| tidb_skip_utf8_check               | 0              |
| tidb_ddl_reorg_batch_size          | 256            |
| tidb_ddl_error_count_limit         | 512            |
+------------------------------------+----------------+
42 rows in set (0.002 sec)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.


配置项

对比 TiDB v3.0.20 和 v2.1.19 配置项的差异变化如下。

>   "cors": "",
>     "disable-error-stack": true,
>     "record-plan-in-slow-log": 1
>     "require-secure-transport": false,
>     "cluster-verify-cn": null
>     "status-host": "0.0.0.0",
>     "record-db-qps": false
>     "max-memory": 0,
<     "enable-update-stats": true,
>     "bind-info-lease": "3s",
>     "memory-guard-ratio": 0.1
>     "max-batch-size": 128,
>     "overload-threshold": 200,
>     "max-batch-wait-time": 0,
>     "batch-wait-size": 8,
>     "region-cache-ttl": 600,
>     "store-limit": 0
>     "strategy": "range"
>   "pessimistic-txn": {
>     "enable": true,
>     "max-retry-count": 256
>   "max-index-length": 3072,
>   "alter-primary-key": false,
>   "stmt-summary": {
>     "enable": false,
>     "max-stmt-count": 200,
>     "max-sql-length": 4096,
>     "refresh-interval": 1800,
>     "history-size": 24
>   "enable-table-lock": false,
>   "delay-clean-table-lock": 0
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.


TiDB 3.x 专栏文章

19年6月,TUG 正式成立。

19年7月,TiDB 社区论坛上线。

22年2月,TiDB 社区专栏板块上线。

我从 TiDB 专栏的 1300 余篇文章中找出了几篇 TiDB 3.x 时期的精品文章分享给大家。

  • 19.5.30, PingCAP 故事|势高,则围广:TiDB 的架构演进哲学 (https://tidb.net/blog/80c688a5)
  • 20.4.14, 知乎已读服务的前世今生与未来 (https://tidb.net/blog/6efdbb9f)
  • 20.4.14, TiDB 3.0:窗口函数初体验 (https://tidb.net/blog/a523b8ec)
  • 20.4.14, TiDB 3.0.5 性能压测 (https://tidb.net/blog/cb1c5ea3)
  • 21.1.18, 继续,来看看 TiDB 3.0 在 AP 方面的进步 (https://tidb.net/blog/fcde3ba6)
  • 21.8.25, 数据总量 40 亿+,报表分析数据 10 亿+,TiDB 在中通的落地与进化 (https://tidb.net/blog/3da1aed9)
  • 21.9.16, 贝壳金服 TiDB 在线跨机房迁移实践 (https://tidb.net/blog/7c3878a1)
  • 21.9.22, TiDB 分区表优化实践 (https://tidb.net/blog/0279fbc9)
  • 21.11.19, TiDB和MySQL的锁一些分析比对 (https://tidb.net/blog/1c1a2ab7)
  • 22.12.28, 为什么我们要从MySQL迁移到TiDB? (https://tidb.net/blog/1577d0b0)
  • 23.12.26, 一个 39.3T 的集群从TiDB v3.1.0迁移升级到 TiDB v7.1.2 的实践 (https://tidb.net/blog/0629c299)


未完待续

在 TiDB 3.x 时期(2019~2020)还有几件重要的事情:

  • 19年9月,一体化数据同步平台 TiDB Data Migration 1.0 GA 发版
  • 19年10月,第三届 TiDB Hackathon 成功举办。

星辰考古:TiDB v3.x 忆水木_https_03

(1st place of TiDB Hackathon 2019, project: Unified Thread Pool)

  • 20年3月,TiDB 源码贡献者突破 400 人。

星辰考古:TiDB v3.x 忆水木_.net_04

(TiDB contributor growth)

“In open source, we feel strongly that to really do something well, you have to get a lot of people involved.”

如今,TiDB 及其生态项目累计超过 2267 位开源贡献者,覆盖 49 个国家和地区,是全球基础架构领域的顶级开源项目。

  • 20年5月,TiDB 4.0 GA 发版。

下期,我们继续讨论 TiDB v4。


-- / END / --

👉 这里可以找到我

  • 微信公众号:@少安事务所 (mysqloffice)
  • ITPUB 博客:@少安事务所
  • 墨天轮:@严少安
  • PGFans: @严少安
  • TiDB 专栏:@ShawnYan

如果这篇文章为你带来了灵感或启发,就请帮忙点『赞』or『转发』吧,感谢!(๑˃̵ᴗ˂̵)