# TiDB 体系架构

__*TiDB 特点*__

+ 水平扩容或缩容
+ 金融级高可用
+ 实时 `Hybrid Transactional and Analytical Processing (HTAP)`
+ 云原生的分布式数据库
+ 兼容 `MySQL`

![`smart`](./student-guide/diagram/TiDBClusterArchitectureNormal_aa_001_20220506.png)
-------------------------------------------------------------
分布式关系型数据库 TiDB, 是一款同时支持在线事务处理与在线分析处理 (`Hybrid Transactional and Analytical Processing, HTAP`) 的融合型分布式数据库产品,具备水平扩容或者缩容、金融级高可用、实时 HTAP、云原生的分布式数据库、兼容 MySQL 和 MySQL 生态等重要功能。

TiDB 的三大关键组件分别是 `Placement Driver (PD) server`, `TiDB server` 和 `TiKV server`。

其中, `Placement Driver (PD)` 集群是整个 TiDB 的控制中枢, 它负责产生全局 TSO 时间戳, 调度 `Region` 在 TiKV 节点中的分布, 收集 TiKV 节点的健康和分布状况, 另外, 它还为分布式事务分配事务 ID。PD 本身也是由至少 3 个节点构成, 拥有高可用的能力, 建议部署奇数个 PD 节点。

`TiDB server` 集群上是不存储业务数据的, 但是接收从客户端传来的 SQL 语句, 对 SQL 语句进行解析和编译, 最终产生执行计划就完全由它来负责了。 最后, `TiDB server` 负责执行这些执行计划到 TiKV 或者 TiFlash 存储引擎中去存取数据, 并且将结果集进行整理, 返回给客户端。最后, 关于 DDL 操作和老版本数据的回收（GC）也是 `TiDB server` 来完成的。TiDB 层本身是无状态的, 实践中可以启动多个 TiDB 实例, 通过负载均衡组件（如 `LVS`, `HAProxy` 或 `F5`）对外提供统一的接入地址, 客户端的连接可以均匀地分摊在多个 TiDB 实例上以达到负载均衡的效果。

数据主要以 `key-value` 形式存储在 TiKV 集群中, TiKV 集群主要负责数据的持久化, MVCC（多版本并发控制）, `coprocessor`（将算子下推到 TiKV 节点), 事务和其自身副本的高可用和强一致性功能（采用 `multi raft` 机制实现), 将在 TiKV 课程中进行详细的介绍。

这里, 我们还有一个组件 -- 列式存储引擎 TiFlash, 它主要通过扩展的 Raft 共识算法完成了与 TiKV 的数据同步, 实现了负载均衡, 强一致读取, TiFlash 支持实时更新。这样对于 OLTP 场景实现了分析查询业务隔离, 对于 OLAP 场景较大幅度提升查询效率。

下面,我们分别介绍 TiDB、TiKV、TiFlash 和 `Placement Driver (PD)` 的主要功能、实现原理和特点。