在 TiDB 集群架构中,TiDB Server 作为前端的 SQL 处理组件,负责接收并解析来自应用程序的 SQL 请求。TiDB 完全兼容 MySQL 5.7 语法,这使得现有的 MySQL 用户可以无缝迁移到 TiDB,并继续使用他们熟悉的 SQL 语句进行操作。
TiDB Server 的一个重要特性是**无状态**设计。数据不存储在 TiDB Server 上,而是存储在 TiKV/TiFlash 集群中。TiDB Server 的任务是处理 SQL 语句的生命周期:包括**解析**语法、**编译**查询、**优化**执行路径,以及生成最终的**执行计划**。生成的执行计划会被下发到 TiKV(TiDB 的分布式存储引擎)执行,确保高效的数据操作。
由于 TiDB Server 无状态,它具备出色的**横向扩展性**。在高并发场景下,当大量 session 会话集中访问某个 TiDB Server 节点时,可以通过简单地增加新的 TiDB Server 节点来扩展集群的吞吐能力。这种横向扩展机制可以迅速均衡集群中的负载,减少单个节点的压力,保持系统的稳定性与高效性。
当用户发起会话连接 TiDB 时,首先到达的是 TiDB Server。TiDB Server 作为 SQL 请求的前端处理组件,当会话数激增,导致节点资源不足时,可以通过**动态扩容**来增加 TiDB Server 节点,从而分担负载。由于 TiDB Server **不存储数据**,扩容可以快速有效地分流各节点的会话压力。而在会话数量下降时,还可以灵活地**回收节点**,以提高资源利用率。
对于一条 SQL 语句,TiDB Server 不会立即执行,而是首先对 SQL 进行**解析**和**编译**,生成一个**执行计划**。执行计划类似于一个操作指南,指引 TiDB 该如何执行 SQL,例如是否应该使用索引或进行全表扫描。TiDB Server 的角色就是将 SQL 转换为执行计划,随后通过该计划在后端的 TiKV 或 TiFlash 上执行数据操作。
在数据插入过程中,TiDB Server 还负责将表数据转换为**键值对(key-value)\**格式。与传统数据库逐行存储不同,TiDB 以键值对的方式组织数据。TiDB Server 将表数据转换为键值对后,分发到 TiKV 或 TiFlash 存储引擎中,后者会将这些键值对进一步组织成多个\**Region**,以实现分布式存储。
此外,TiDB Server 还处理一系列的 **DDL(数据定义语言)** 操作,如建表、创建索引等。值得注意的是,TiDB 的 DDL 操作不会阻塞线上业务,确保了系统的高可用性和稳定性。
TiDB Server 另一个重要功能是**垃圾回收(GC)**。当 TiKV 或 TiFlash 中的表数据经历多次更新时,会产生大量历史版本数据。随着历史版本的增加,存储占用会不断扩大,并且可能导致查询性能下降。为此,TiDB Server 会定期(默认每 10 分钟)对 TiKV 和 TiFlash 中的历史数据进行清理,删除不再需要的旧版本记录,进而提升查询性能并减少存储开销。