前情回顾
在前面的章节中,我们共同梳理了 TiDB v1/v2/v3 的相关内容。
本节将继续讨论 TiDB v4.0 大版本,在该版本中 TiDB 集群架构没有太大变化,不过 TiFlash 重要程度进一步提升,下图为 TiDB HTAP 形态架构,其中包含 TiFlash 节点。
TiDB v4 时间线
TiDB v3.x 的时间线是 2019.1–2020.12,TiDB v4.x 的时间线来到了 2020.1–2021.12。
- 2020-01-17,TiDB 4.0.0-beta 发布。
- 2020-05-28,TiDB 4.0 GA。TiDB v4.0 在稳定性、易用性、性能、安全和功能方面进行了大量的改进。
- 2020-12-21,TiDB 4.0.9 发布。
- 2021-01-15,TiDB 4.0.10 发布。
- 2021-12-17,TiDB 4.0.16 发布,这是 TiDB v4 系列的最后一个小版本。
20 年共发布 16 个小版本,21 年共发布 7 个小版本。
(TiDB v4.0 与 v3.0 的 TPC-C 性能测试对比图)
(TiDB v4.0 与 v3.0 的 TPC-H 性能测试对比图)
TiDB v4 新特性
TiDB v4 引入 70 余项重要新特性,以下是几项关键功能:
热点调度支持更多维度。热点调度在决策时,除了根据写入/读取流量作为调度依据外,新引入 key 的维度。可以很大程度改善原有单一维度决策造成的 CPU 资源利用率不均衡的问题。
TiFlash 是 TiDB 为完善 Realtime HTAP 形态引入的关键组件,TiFlash 通过 Multi-Raft Learner 协议实时从 TiKV 复制数据,确保行存储引擎 TiKV 和列存储引擎 TiFlash 之间的数据强一致。TiKV、TiFlash 可按需部署在不同的机器,解决 HTAP 资源隔离的问题。
注:
TiFlash 是 TiDB 生态中的核心组件,从 TiDB 3.1 引入,于 22.04.01 正式开源,随 4.0 正式 GA。
TiDB Dashboard:DBA 通过 TiDB Dashboard UI 可以快速了解集群的集群拓扑、配置信息、日志信息、硬件信息、操作系统信息、慢查询信息、SQL 访问信息、诊断报告信息等,帮助 DBA 通过 SQL 快速了解、分析系统的各项指标。
TiDB 热力图,来源: https://asktug.com/t/topic/813071
TiUP 是 4.0 版本中新推出的包管理器的工具,主要用于管理 TiDB 生态内的所有的包,提供组件管理、本地部署、集群管理、镜像管理、离线部署、性能测试等功能,将安装、部署、运维 TiDB 工具化,提升 DBA 部署、运维 TiDB 的效率。
悲观事务正式 GA 并作为默认事务模式提供,支持 Read Committed 隔离级别以及 SELECT FOR UPDATE NOWAIT 语法。
支持大事务,最大事务限制由 100 MB 提升到了 10 GB,同时支持乐观事务和悲观事务。
TiCDC 从 v4.0.6 起成为正式功能,可用于生产环境。TiCDC 是一款通过拉取 TiKV 变更日志实现的 TiDB 增量数据同步工具,具有将数据还原到与上游任意 TSO 一致状态的能力,同时提供开放数据协议 (TiCDC Open Protocol),支持其他系统订阅数据变更。
图为 TiCDC 架构图
图为 TiCDC 集群及节点内部组件的设计图
下面按 TiDB, TiKV, PD, TiFlash, TiCDC 组件分别摘录了部分重要新特性,以供参考。
TiDB
- 新增 SQL Binding 的自动捕获和自动演进功能 #13199 #12434
information_schema.tables
表新增TIDB_ROW_ID_SHARDING_INFO
列,输出列的 RowID 打散相关的信息(例如:表 A 指定SHARD_ROW_ID_BITS
,该列的值为 “SHARD_BITS={bit_number}”) #13418- 支持在
CREATE TABLE
语句中指定 auto_random 选项 #16813 - AUTO RANDOM 被移出实验特性并正式 GA (TiDB 4.0.3)
- 支持将列属性 AUTO_INCREMENT 变更为 AUTO_RANDOM #24608
- 新增
DDLJobs
系统表,用于查询 DDL 任务详细信息 #14837 - 新增 Sequence 功能 #14731 #14589 #14674 #14442
- 新增大小写不敏感的排序规则,用户可在新集群上启用 utf8mb4_general_ci 和 utf8_general_ci #33
- 支持 uft8_unicode_ci 和 utf8mb4_unicode_ci 排序规则 #22558
- 增强
RECOVER TABLE
语法,现在该语法支持恢复被 Truncate 的表 #15398 - 新增
Flashback
命令,支持恢复被 Truncate 的表。 - 新增 SQL 语法 BACKUP/RESTORE 来进行数据备份恢复 #15274 #16960
- 支持
show table partition regions
语法 #17294 - 支持新增分区时自动分裂 Region 的功能 #17665
- 新增动态修改、更新配置项的功能,配置项由 PD 持久化存储 #14750 #14303 #14830
- 支持使用
SHOW CONFIG
语法显示 PD 和 TiKV 的配置 #16475 - 支持
SET CONFIG
语句进行 PD/TiKV 节点配置修改 #16853 - 新增系统自动根据负载均衡策略从不同角色上读取数据的功能,且新增
leader-and-follower
系统变量用于控制开启此功能 #14761 - 默认打开
Coprocessor cache
#16710 - 默认打开
tidb_allow_batch_cop
#18552 - 默认打开执行信息的收集 #18518
- 支持会话和全局变量
sql_select_limit
#17604 - 添加
txn-entry-size-limit
配置项,用于限制事务中单个 key-value 记录的大小 #21843 - 在 v4.0 中将
tidb_multi_statement_mode
的默认值从 WARN 更改为 OFF。建议使用客户端库的多语句功能。#25749 - 支持在 INSERT 语句中使用
MEMORY_QUOTA()
hint #18101 - 支持在广播 Join 中使用外连接 #19664
- 对于自动提交语句的重试转换到悲观锁模式 #19796
- 使用标准错误替换 TiDB 中的错误码和错误信息 #19888
- 支持接受来自 MySQL 8.0 客户端的连接 #19959
- Grafana 面板支持多集群 #22534
- Grafana 升级到 v7.5.11 以解决安全漏洞
TiKV
- 升级 RocksDB 的版本到 6.4.6
- 新增从 Follower 副本读取数据的功能
- 支持将动态修改配置的结果持久化存储到硬盘 #6684
- 支持基于负载的 Region split #7623
- 为错误定义错误码 #8387
- 支持日志输出为 JSON 格式 #8382
注:
TiDB 3.0.20 中内置 RocksDB v5.18.3,升级到 TiDB 4.0.16 后, RocksDB 版本升级到 v6.4.6。
在作者的印象中,PingCAP 从不避讳使用了开源组件,如 RocksDB, etcd, ClickHouse 等。
TiDB 源于开源,拥抱开源,贡献开源,海纳百川,与世界开发者协同科技创新。
本文只讨论 TiDB 相关技术内容,就不提套壳、马甲、超过 100% 兼容之类的事情了。
PD
- 新增根据存储节点负载信息优化热点调度的功能
- 新增 Placement Rules 功能,通过组合不同的调度规则,精细控制任意一段数据的副本的数量、存放位置、存储主机类型、角色等信息
- 新增通过 UI 访问集群热点数据分布功能 #2086
- member API 返回信息新增部署路径和组件版本信息 #2130
- pd-ctl 新增 component 命令用于修改、查看组件配置信息 (experimental) #2092
- 支持将动态修改配置的结果持久化存储到硬盘 #2153
- 移除 config manager 以使其它组件自行控制它们的配置 #2349
- 支持 JSON 格式日志 #2565
- PD 客户端中添加
GetAllMembers
函数,用于获取 PD 成员信息 #2980 - 添加了配置项
enable-redact-log
,可以设置将日志中的用户数据脱敏 #3266
TiFlash
- 存储引擎中的粗糙索引默认开启
- 支持运行在 ARM 架构
- 在 TiFlash 中支持在广播 Join 中使用外连接
- 支持
CAST
函数下推 - 添加了配置项
security.redact_info_log
,可以设置将日志中的用户数据脱敏 - 新增工具用于检测当前
tiflash replica
的状态
TiCDC
自 v4.0.6 起,TiCDC 成为正式功能,可用于生产环境
- 支持通过
cdc cli
来管理同步任务 (changefeed) #546 - 支持输出 maxwell 格式的数据 #869
- 为 maxwell 协议默认开启 old value 特性 #1144
- 支持快照级别一致性复制 #932
- 默认启用 unified sorter 特性 #1230
- 在 capture 元信息中添加版本信息和在 changefeed 元信息中创建该 changefeed 的 CLI 版本 #1342
- 若任务的暂停同步时间超过 1 天,再次启动该任务时需要二次确认 #1497
- 遇到无法恢复的 DML 错误立即退出,不进行重试 #1724
- 为 EtcdWorker 添加 tick 频率限制,防止 PD 的 etcd 写入次数过于频繁影响 PD 服务 #3112
TiDB v4 兼容性变化
TiDB
- 修改配置项
log.enable-slow-log
的类型,由整数型改为布尔类型 #14864 - 调整修改系统表
mysql.user
中password
列名为authentication_string
,与 MySQL 5.7 保持一致(该变动会导致升级后不能回退) #14598 txn-total-size-limit
配置项的默认值由 1GB 调整为 100MB #14522- 新增动态修改、更新配置项的功能,配置项由 PD 持久化存储 #14750 #14303 #14830
- 当
tidb-server
状态端口被占用时由原来打印一条告警日志改成拒绝启动 #15177 - 去掉了特别为开启 Binlog 时定义的事务容量上限 (100 MB),现在事务的容量上限统一为 10 GB,但若开启 Binlog 且下游是 Kafka,由于 Kafka 消息大小的限制是 1 GB,请根据情况调整
txn-total-size-limit
配置参数 #16941 - 移除慢查询日志和 statement summary 表中的敏感信息 #18130
- 禁止在 sequence 缓存中出现负数 #18103
CLUSTER_INFO
表中不再显示 tombstone 状态的 TiKV 和 TiFlash 节点 #17953- 诊断规则
current-load
变更为node-check
#17660 - 修改
drop partition
和truncate partition
的参数 #18930 - 为
add partition
操作添加状态检查 #18865 - 废弃配置文件中
enable-streaming
配置项 #21055 - 以下 Bug 修复涉及执行结果变化,可能引起兼容性变化:
- 修复了
greatest(datetime) union null
返回空字符串的问题 #26532 - 修复了
having
可能执行错误的问题 #26496 - 修复了当
between
表达式两边的 collation 不一致会导致查询结果错误的问题 #27146 - 修复了
extract
函数的参数是负数时查询结果错误的问题 #27236 - 修复了当
group_concat
函数包含非 bin 的 collation 时查询结果错误的问题 #27429 - 修复将 Apply 算子转为 Join 时漏掉列信息的问题 #27233
- 修复将非法字符串转为 DATE 类型时的非预期行为 #26762
- 修复开启 New Collation 时多列的
count distinct
返回结果错误的问题 #27091
- 修复了
TiKV
- 新增
readpool.unify-read-pool
配置项,默认值为 True,用于控制点查是否共用 Coprocessor 的处理线程 - 调整
unify-read-pool
配置项的方式,仅在新部署的集群时默认启用,旧集群保持原来的方式 #7059 - 默认关闭 hibernate region #7618
- 将加密相关的配置移到 security 分类下,即调整配置项
[encryption]
为[security.encryption]
#7810 - 减少开启加密时的 I/O 开销和锁冲突。该修改向下不兼容。如果需要降级至 v4.0.9 以下,需要将
security.encryption.enable-file-dictionary-log
配置为false
,并在降级前重启 #9195 - 在 v4.0.16 以前,当把一个非法的 UTF-8 字符串转换为 Real 类型时会直接报错。自 v4.0.16 起,TiDB 会依照该字符串中的合法 UTF-8 前缀进行转换 #11466
注:
关于 Unnify Read Pool 的内容,我们在上文 星辰考古:TiDB v3.x 忆水木 的文末有所提及,细心的小伙伴可能已经注意到了。
这里再推荐一篇文章:
TiDB 4.0 新 Feature 原理及实践:统一读线程池 https://tidb.net/blog/56f2a0cd
PD
- 持久化
store-limit
配置项,弃用store-balance-rate
配置 #2557
其他
oom-action
参数设置为 cancel 时,当查询语句触发 OOM 阈值后会被 kill 掉,升级到 4.0 版本后除了 select 语句,还可能 kill 掉 insert/update/delete 等 DML 语句。- 4.0 版本增加了 rename 时对表名长度的检查,长度限制为 64 个字符。升级后 rename 后的表名长度超过这个限制会报错,3.0 及之前的版本则不会报错。
- 4.0 版本增加了对分区表的分区名长度的检查,长度限制为 64 个字符。升级后,当你创建和修改分区表时,如果分区名长度超过这个限制会报错,3.0 及之前的版本则不会报错。
- 4.0 版本对 explain 执行计划的输出格式做了改进,需要注意是否有针对 explain 制订了自动化的分析程序。
- 4.0 版本支持 Read Committed 隔离级别。升级到 4.0 后,在悲观事务里隔离级别设置为 READ-COMMITTED 会生效,3.0 及之前的版本则不会生效。
- 4.0 版本执行
alter reorganize partition
会报错,之前的版本则不会报错,只是语法上支持没有实际效果。 - 4.0 版本创建
linear hash partition
和 subpartition 分区表时实际不生效,会转换为普通表,之前的版本则转换为普通分区表。
TiDB 3.0.20 升级到 4.0.16
在上文中我们搭建了 TiDB 3.0.20 作为 PoC 环境,本文基于此环境升级到 4.0.16 版本。
注意事项
- 从 TiDB 3.0 开始已经支持使用 TiUP 管理集群,如果你还在使用 TiDB Ansible,需先使用 TiUP 纳管集群,参考
tiup cluster import
。 - TiDB 目前暂不支持版本降级或升级后回退。如需将 3.0 之前的版本升级到最新 LTS 版本,需先升级到 TiDB 4.0,再进行后续升级操作。
- 升级前,需确认集群中没有正在运行的 DDL 操作,且升级过程中,也要避免 DDL 请求。
- TiDB 4.0 新增了排序规则支持框架,由参数
new_collations_enabled_on_first_bootstrap
控制,该参数默认关闭,但需注意,从 TiDB v6 开始该参数默认开启,更多内容可参考: TiDB 6.x 新特性解读 | Collation 规则
升级速览
- 升级前,检查集群状态。
- 在中控节点执行升级。
- 升级完成后,检查集群状态。
这里可以看到新增的 UI Dashboard 运行在 83 节点上。
- 连接 tidb-server 查看版本信息。
直观变化
- 默认 Schema 新增
METRICS_SCHEMA
。
它是基于 Prometheus 中 TiDB 监控指标的一组视图。每个表的 PromQL(Prometheus 查询语言)的源均可在 INFORMATION_SCHEMA.METRICS_TABLES
表中找到。
- TiDB 状态端口输出信息增加。
- ROOT 用户权限增加。
TiDB v3.0.20 中 ROOT 用户默认权限 25 项,升级后,TiDB v4.0.16 中有 28 项,新增三个权限。
TiDB v4 系列的新功能、兼容性变化介绍,以及升级演示就到这里了。
总结
依惯例,我们再看下 TiDB v4 时期(2020-2021) 的几件重要事情:
- 2020.03,教大家从零到一写分布式数据库的 Talent Plan Courses 正式发布
- 2020.05,电子书《TiDB in Action 4.0》由 102 作者在 48 小时内完稿并上线,目录: https://book.tidb.io/SUMMARY.html
- 2020.09,PingCAP 团队的论文《TiDB: A Raft-based HTAP Database 》入选 VLDB 2020 ,成为业界第一篇 Real-time HTAP 分布式数据库工业实现的论文
- 2020.10,TiDB 培训认证项目两周年,TiDB 4.0 PCTA/PCTP 认证项目上线
- 2020.11,完成 2.7 亿美元的 D 轮融资
- 2020.12,TiDB 通过信通院分布式数据库性能与基础能力两项评测
- 2020.12,TiDB 社区 AskTUG 成员突破 5300 人,27 人获得 MVA 荣誉称号
- 2021.01,PingCAP 连续两年在 CNCF 全球贡献排行榜中位列中国企业第一位,全球排名第 6 位
- 2021.04,面向企业级核心场景的 TiDB 5.0 GA 发版
如果用一个词来总结 TiDB 1.0 到 4.0 的这 6 年,一定是“创业维艰”。国产基础软件领域,尤其是数据库赛道,国内长年使用国际领先的商业软件或国际通用的开源软件,在一片红海中从零全新打造国产数据库,推行商用,投产几百家客户的生产环境,并得到资本市场的认可,这是 国产基础软件的骄傲。
【星辰考古】系列的四个章节就到这里。
下一期,我们开启新篇章,【星辰往事】,共同讨论 TiDB v5.x/v6.x 的内容。
素材来源
本文素材来自 PingCAP 官方网站及网络,包括但不局限于:
#tidb #pingcap #htap #国产数据库
🌻 往期精彩 ▼
- [Oracle]
- [Oracle 数据库全面升级为 23ai]
- [python-oracledb 已率先支持 Oracle 23ai]
- [一文带你了解 Oracle 23ai 新特性 Vector 的基础用法]
- [MySQL]
- [MySQL 9.0 的 VECTOR 文档更新]
- [MySQL 9.0.0 新鲜出炉!支持向量类型]
- [「合集」MySQL 8.x 系列文章汇总]
- [如何选择适合的 MySQL Connector/J 版本]
- [TiDB]
- [星辰考古:TiDB v3.x 忆水木]
- [星辰考古:TiDB v2.x 回忆杀]
- [敢于公布BUG的国产数据库才是好数据库]
- [PG]
- [[RL9] Rocky Linux 9.4 搭载 PG 16.1]
- [即将告别PG 12,建议升级到PG 16.3版本]
- [后 EL 7 时代,PG 16 如何在 CentOS 7 上运行]
– / END / –