# TiDB 集群总体架构

+ 由多个组件组成，每个模块相互通信，形成完整的`TiDB`系统
+ 基于 Raft 算法的 stateless 前端和 stateful 后端
+ 兼容MySQL
+ 每个集群层的水平可扩展性

![`smart`](./student-guide/diagram/TiDBClusterArchitectureDetail_aa_001_20221005.png)

------------------------------------------------------------------------------
TiDB Server：SQL 层暴露 MySQL 协议的连接端点，并负责接受客户端的连接、执行 SQL 解析和优化，最终生成分布式执行计划。TiDB server 本身是无状态的。在实际应用中，可以启动多个 TiDB 实例，并通过负载均衡组件（如 LVS、HAProxy 或 F5 ）提供统一的访问地址，客户端连接可以均匀地分布在多个 TiDB 实例上，以实现负载均衡。TiDB server 本身不存储数据，只解析 SQL 并将实际的数据读取请求转发给底层存储节点 TiKV（或 TiFlash）。

PD（Placement Driver）Server：整个 TiDB 集群的元数据管理模块，存储各个 TiKV 节点的实时数据分布和整体拓扑，提供 TiDB Dashboard 管理接口，支持分布式事务分配事务ID。 PD 不仅存储元数据，还根据 TiKV 节点实时上报的数据分布状态，向特定的 TiKV 节点发出数据调度命令，可谓整个集群的“大脑”。此外，PD 本身由至少3个节点组成，并具有高可用性。建议部署奇数个 PD 节点。

存储节点
  - TiKV Server：负责存储数据。在外部，TiKV 是一个分布式 key-value 存储引擎，提供事务处理服务。存储数据的基本单位是 Region。每个 Region 负责存储一个 Key Range内的数据（从 StartKey 到 EndKey 是左闭右开区间），每个 TiKV 节点负责多个 Region。TiKV 的 API 为 KV （Key-Value pair）级别的分布式事务提供了本地支持。默认提供 SI（快照隔离）隔离级别，这是 TiDB 在 SQL 层面支持分布式事务的核心。在 TiDB 的 SQL 层解析 SQL 后，SQL 的执行计划会转换为对 TiKV API 的实际调用。因此，数据存储在 TiKV 中。此外，TiKV 中的数据自动维护多个副本（默认为三个副本），自然支持高可用性和自动故障转移。
  - TiFlash：TiFlash是一种特殊的存储节点。与普通的TiKV节点不同，数据以列式存储在TiFlash中，主要功能是加速分析型场景。

SQL层可以独立扩展，通过扩容或缩容来适应 TiDB server 的负载。

存储层可以独立扩展，根据 TiKV 或 TiFlash 服务器的负载情况进行扩展或收缩。
