1 TiDB Server 的架构
TiDB Server是无状态的,可在一个TiDB数据库中启动多个TiDB Server,可通过负载均衡软件如LVS、HAProxy、F5等提供统一的接入地址,客户端可将连接均匀分摊到多个TiDB Server上。
TiDB Server 不存储数据。

- Protocol Layer、Parse、Compile:SQL的解析和编译,生成SQL语句的执行计划,交给Executor
- Executor、DistSQL、KV:分批执行SQL的执行计划
- Transaction、KV:事务的执行
- PD Client、TiKV Client:与PD、TiKV交互
- schema load、worker、start job:online DDL(DDL语句不阻塞读写)
- memBuffer:缓存读取的数据及元数据、登录的认证信息、统计信息等
- GC:垃圾回收
2 TiDB Server 的主要功能
- 处理客户端的连接——Protocol Layer(协议层)完成
- SQL 语句的解析和编译——由Parse、Compile完成,生成执行计划,交给Executor执行
- 关系型数据与KV的转化
- SQL语句的执行——普通SQL:Executor、DistSQL、KV;事务:Transaction、KV
- 在线DDL的执行——schema load、worker、start job
- 垃圾回收——GC
3 SQL 语句的解析和编译 - Parse
Parse模块:通过词法分析(lex)、语法分析(yacc) 生成 AST抽象语法树
给Compile模块

4 SQL 语句的解析和编译 - Compile
Compile模块:根据AST抽象语法树,生成可执行计划。
-
验证:语法验证,如要查询的表在数据库中是否存在等合法性验证。
-
逻辑优化:依据关系型代数的一些等价交换的规则,做逻辑变化。(在SQL语句层面上的优化)
-
物理优化:根据逻辑优化的结果,考虑数据的物理分布、大小,决定用哪个算子。(走索引还是全表扫描?等)

5 关系型数据与KV的转化
将关系型数据(表)转化为键值对(key-value):
- 聚簇表(使用表名+表的主键)
- 非聚簇表(不用表的主键,自己生成rowId)
Region是key-value的一个存储单位,一个Region达到96MB后会分裂为两个,就能分布式的存储在不同TiKV结点。
6 SQL读写相关模块
- 对于较复杂的SQL(e.g.,范围查询、表连接、嵌套查询)
- 为避免较复杂的SQL与TiKV存取的耦合度太高,通过DistSQL将对TiKV的请求封装,提供一个单表的select方法。
- DistSQL涉及单张表,但可能涉及多个Region。
- 简单的SQL请求(点查如利用主键索引或唯一索引进行等值查询等)通过KV模块完成。
- 涉及事务的SQL,由Transaction负责二阶段提交。需要PD Client向PD获取时间戳TSO。
TiKV Client 接收KV的row kv request、处理DistSQL的复杂sql的投影、过滤等。向TiKV集群发送读写请求。

7 在线DDL相关模块

-
Start job接收用户的DDL,并将此DDL作为一个job放在TiKV中的任务队列中。
-
多个TiDB Server中只有Owner的workers能取任务队列中的一个job执行,执行完成后放在历史队列中。
-
schema load将最新的所有表的schema信息同步到Owner缓存中。
多个TiDB Server可同时接收多个用户的在线DDL,但同一时刻只能有一个TiDB Server进行DDL操作。
TiDB Server中的Owner有任期,由选举产生。
why要将DDL放到TiKV?为了防止宕机后DDL丢失
8 GC机制与相关模块
TiDB Server回收事务,因为它实现了MVCC(多版本并发控制),所以是异地更新的。
被选为GC Leader的TiDB Server控制GC:
计算时间戳safe_point,GC保留 GC_life_time(当前时间到safe_point)内的数据。

9 TiDB Server的缓存
默认使用整个TiDB数据库的全部内存。
TiDB Server 缓存的组成部分:SQL的中间结果,线程缓存,元数据、统计信息
TiDB Server 缓存管理:tidb_mem_quota_query(控制查询默认使用的缓存阈值),oom-action(当SQL查询的内存使用超过阈值后怎么操作,停止执行还是记录日志)