TiDB 约每六个月发布一个长期支持版本(LTS),会引入新功能、改进、缺陷修复和安全漏洞修复,下一个即将发布的 LTS 版本为 TiDB 8.5 LTS。虽然版本还未正式 release,但是从当前已发布的一些 DMR 版本以及 TiDB 社区活动中,我们也能基本了解 TiDB 8.5 将有哪些新特性,本文主要内容摘自 TiDB 杭州社区活动中内核产品经理 Roger Song 相关分享。
重点关注场景
- 大规模集群
TiDB 自 v7 版本引入资源管控功能以来,已经有越来越多的企业和用户选择将 TiDB 作为资源池来使用,将多套业务系统放在一套 TiDB 集群里面,实现多业务合并的方案。
还有一些企业的业务属于典型的 SaaS 业务,在建模方式和需求上与多业务合并类似。这些场景对 TiDB 作为一个超大规模集群来稳定支撑业务提出了新的挑战,通常数据量会在 500TB 以上、100万张表或分区不等。
在这样规模的集群中要保证稳定运行,TiDB 会面临更多的挑战,比如常驻资源占用(如内存占用)、内部处理效率(如统计信息更新)、管理与调优(多租户管理及可观测性)等。
- 大语言模型(LLM)
在 AI 时代的背景下,TiDB 在技术发展和应用上展现出了其前沿性。在大语言模型的场景中,TiDB 不断的探索如何更好的支撑大模型相关的应用。TiDB 希望能在作为一款关系型数据库的基础之外,也逐步向 AI 基础设施迈进。这样,用户可以使用一套 TiDB 数据库来同时满足 OLTP 账务交易、OLAP 实时分析以及对 AI 类应用的支持。
- 金融核心业务
以杭州银行为代表的金融核心业务场景正在大面积的采用 TiDB 作为底层数据库进行有效支撑。金融核心场景主要的挑战有:1. 降低交易延时;2. 保证稳定性(如执行计划稳定等)。因此,进一步提升交易性能和稳定性也是新版本的重中之重。
TiDB v8.5 LTS 主要更新
8.5 是一个 LTS 版本,其中包含的新特性基本上都在 8.2 ~8.4 DMR 版本中包含,LTS 版本中也可能会包含一些 GA 特性。那么这些版本中到底具体包含哪些新特性呢?以下分别从稳定性和高可用、性能和扩展性、SQL、数据库管理及可观测性几个方面来分别说明。
稳定性和高可用
- TiProxy
- 支持设置流量转发策略(v8.2.0) - 之前版本中 TiProxy 只支持 Round Robin 轮询机制来分配连接,新版本支持从多个维度(包括状态、连接数、健康度、内存、CPU 和地理位置)对 TiDB 节点进行评估和排序,并支持通过 policy 配置项配置这些负载均衡策略的优先级。
- 管理虚拟 IP(v8.3.0)- 新版本中 TiProxy 内置了虚拟 IP 管理功能,配置后支持自动切换虚拟 IP,而无需依赖外部平台或工具。这简化了 TiProxy 的部署,降低了数据库接入层的复杂度。
- 流量捕捉和回放 EXP(v8.4.0) - 新版本中 TiProxy 可以将流量捕捉并写入文件,然后使用这个文件重放流量,并可以控制流量的倍数。这项功能适合场景的有:升级或迁移前验证、集群变动前验证、集群容量测试。
- 落盘与下推
- 并行 hash agg 支持落盘(v8.2.0) - 之前的版本对内存占用较多的算子大部分都实现了算子落盘,新版本对遗留的并行 hash agg 也支持了算子落盘,这样保证了所有内存占用多的算子都实现了算子落盘。
- 部分 JSON 表达式支持下推(v8.2.0)- 如 JSON_ARRAY_APPEND、JSON_MERGE_PATCH、JSON_REPLACE。
- Projection 默认下推 (v8.3.0) - 以前版本从 TiKV 获取数据到 TiDB 需要把整行数据获取上来,现在只需要对应的投影列即可,一方面减少了网络流量,另一方面也减少了内存消耗。
- 部分日期类型表达式支持下推 (v8.3.0)
- 流式获取游标结果(v8.3.0)
- 当应用代码通过 Cursor Fetch 获取结果集时,TiDB 通常会先将完整结果保存至 TiDB 内存,再分批返回给客户端。如果结果集过大,会触发落盘。新版本中 TiDB 会随着客户端的读取逐步将数据读到 TiDB 节点。在处理较大的结果集时,这将减少 TiDB 节点的内存使用,提升集群的稳定性。
- 优化器统计信息
- 统计信息加载效率提升(v8.2.0) - SaaS 类业务应用中可能存在大量的数据表,不但会拖慢初始统计信息的加载速度,也会增加高负载情况下同步负载的失败率。新版本从并发模型、内存分配方式等多个角度优化了统计信息的加载过程,降低延迟,提升吞吐。
- 统计信息只收集必要的列(v8.3.0) - 以前版本中收集统计信息默认会收集表上所有列,但其实只有少数列的统计信息才是有用的。在现在的版本中,通过一个内存结构来实时跟踪并记录哪些列是需要被更新的,后续的统计信息更新只会涉及这些列,从而加快统计信息的更新。
- 并发收集任务和自适应扫描并行度(v8.4.0)- 以前版本中自动统计信息收集只允许一个任务,现在可以允许设置多个任务;另一方面,以前版本统计信息收集时对 TiKV 扫描其并发度是一个固定值,现在会根据 CPU 核数和集群规模自适应并发度。这 2 方面都可以提升统计信息更新的效率。
- 管理大量执行计划绑定(v8.3.0)
- 在之前的版本中,从产品设计上就不允许大量的执行计划绑定。从稳定性提升的角度,期望更多的具备自动化绑定的能力。尤其在 OLTP 系统中,希望已经被验证过的执行计划能持久化,从而减少执行计划突变的情况。8.3 版本夯实了执行计划绑定的底层架构实现,可以保证至少数十万级别的执行计划绑定不会出现任何问题。
- 实例级执行计划缓存 EXP(v8.4.0)- 之前版本中执行计划缓存都是 session 级别,8.4 版本增加了实例级别执行计划缓存功能(实验特性),当前只支持查询类的语句的缓存。实例级执行计划缓存预计在 9.1 版本中 GA,届时会增加相关系统视图用于查询执行计划缓存信息。
- 增强资源组管理能力
- 支持为后台任务设置上限百分比(v8.4.0) - 之前版本中会识别哪些是后台任务并以低优先级运行,但这个低优先级可能还是不够,比如在集群空闲时后台任务仍然可能会占用较多的资源。8.4 中可以给后台任务设置百分比上限,意味着所有后台任务只能使用每个 TiKV 对比百分比 的 CPU 资源。
- 高优先级任务获取更多资源(v8.4.0) - 之前版本中资源组也有 priority 的概念,但策略相对比较保守。在新版本中,高优先级任务会获得更多的资源,而低优先级会比原来运行的更慢。此功能在 TiKV 上添加了开关控制,可以动态调整。
- 大查询分阶段计算消耗(v8.4.0) - 在之前版本中,如果有一个大的查询,其 RU 的结算是在执行完成后,因此在运行时不受资源管控。8.4 版本通过将这种大查询进行分阶段计算消耗,可以使得能够尽量控制其资源使用。
- 扩展 Runaway Query 能力范围
- 增加 “处理行数” 和 “用量(RU)” 作为条件(v8.4.0) - 之前版本对 Runaway Query 的识别只能通过执行时间,但这种方式可能会存在误判的情况,比如当整个集群繁忙时所有查询都会变得更慢。现在版本中增加了对处理行数和 RU 使用作为条件,可以更精准的判断。
- 把 Runaway Queries 放入特定资源组(v8.4.0) - 之前版本中对识别为 Runaway 的语句有几种策略,包括 DryRun、CoolDown。但 CoolDown 并不一定能限制的很好。8.4 版本中可以允许把识别到的 Runway Queies 放入一个有限的资源组,这样可以更好的限制资源使用。
- 日志记录限流(v8.4.0) - 满足条件的 Runaway Queries 可能出现一瞬间特别多的情况,为了避免日志记录过多做了一个限流的优化。
性能和扩展性
- 优化大集群场景
- 批量建表性能提升 20X+(v8.3.0) - 以前版本中建表是串行操作,在大规模集群中表数量非常多,因此 8.3 版本中实现了建表的并行操作。
- 系统视图查询优化(v8.3.0) - 当表和对象数量特别多时,系统视图查询起来会变得更慢,在 8.3 版本对此做了相应的优化。
- 新增 Region 打散策略(v8.4.0)- 以前版本在导数时只能指定表是否提前打散,新版本中增加更细粒度的策略。
- 执行性能优化
- 并行排序(v8.2.0) - 以前版本是单并发的排序,8.2 版本支持并行排序。
- 优化 KV 请求批处理策略(v8.3.0)- 之前版本中 TiDB 的批处理策略效率不高,8.3 版本中 TiDB 在现有的 KV 请求批处理策略基础上引入更高效的策略。
- 并行获取 TSO(v8.4.0) - 新版本可以并发的向 PD 获取 TSO 请求。
- 删除语句只获取必要的列(v8.4.0) - 删除时只从 TiKV 获取需要的列,同上述 Projection 下推功能。
- 优化缓存表场景性能(v8.4.0) - cache table 是之前版本就具备的功能,新的版本中会把它作为一个重要的功能去优化。
- Hash Join 算法演进(v8.4.0) - 新版本中对 Hash Join 换了一个新的算法,比原来的性能更高。
- 逻辑导入支持 prepare 接口(v8.4.0)
SQL
- 分区表全局索引(v8.4.0)- 8.4 版本中分区表创建 global index 正式 GA。TiDB 针对分区维护的场景还做了特殊优化,比如在 truncate 或 drop partition 时不需要重建 global index,而是通过后台任务慢慢清理。
- 向量搜索 EXP(v8.4.0)- 8.4 引入向量能力,增加 vector 数据类型,type 是最常用的 float32 类型、dimension 最大 16383、支持常用的 vector 比较及操作符和函数。向量索引类型在实验特性中支持 HSNW(GA 时可能会支持带参数的 HSNW、SCANN等其他索引类型)。
数据库管理及可观测性
- 切换资源组引入权限控制(v8.2.0) - 新版本中增加了对资源组切换行为的管控,只有被授予动态权限的数据库用户才能切换到其他资源组,以加强对系统资源的保护。
- 日志脱敏支持“标记”(v8.3.0) - 基于标记后的日志,可以在展示日志时决定是否对被标记信息进行脱敏处理,从而提升日志脱敏功能的灵活性。
- TiKV 的 TOP SQL 按“表”或“数据库”进行聚合(v8.4.0)- 之前版本只能按 SQL 聚合,但在多业务融合的场景中主要 CPU 消耗可能是直接来自于某个业务。基于表或数据库进行聚合可以更快的看出是哪个业务导致。
- 将 CPU 时间(TiDB&TiKV)系统表中显示(v8.4.0)- 当前用户在 TiDB 诊断上的常见难点场景有热点 Region、热点 SQL、节点 CPU 使用率高等,之前版本主要依赖 TopSQL 进行分析。新版本中把 TiDB 和 TiKV 的 CPU 时间拆分出来并添加到 STATEMENT_SUMMARY 和 PROCESSLIST 中,方便用户更快的命中异常的 SQL 语句和 session。