首页 > 技术文章 > 二、TiDB Server 架构原理

angelia-wang 2021-12-15 17:35 原文

1 TiDB Server 的架构

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

TiDB Server 不存储数据。

image-20211209211859266
  • 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 的主要功能

  1. 处理客户端的连接——Protocol Layer(协议层)完成
  2. SQL 语句的解析和编译——由Parse、Compile完成,生成执行计划,交给Executor执行
  3. 关系型数据与KV的转化
  4. SQL语句的执行——普通SQL:Executor、DistSQL、KV;事务:Transaction、KV
  5. 在线DDL的执行——schema load、worker、start job
  6. 垃圾回收——GC

3 SQL 语句的解析和编译 - Parse

Parse模块:通过词法分析(lex)、语法分析(yacc) 生成 AST抽象语法树 给Compile模块

image-20211209213623468

4 SQL 语句的解析和编译 - Compile

Compile模块:根据AST抽象语法树,生成可执行计划。

  • 验证:语法验证,如要查询的表在数据库中是否存在等合法性验证。

  • 逻辑优化:依据关系型代数的一些等价交换的规则,做逻辑变化。(在SQL语句层面上的优化)

  • 物理优化:根据逻辑优化的结果,考虑数据的物理分布、大小,决定用哪个算子。(走索引还是全表扫描?等)

image-20211209214011779

5 关系型数据与KV的转化

将关系型数据(表)转化为键值对(key-value):

  • 聚簇表(使用表名+表的主键)
  • 非聚簇表(不用表的主键,自己生成rowId)

Region是key-value的一个存储单位,一个Region达到96MB后会分裂为两个,就能分布式的存储在不同TiKV结点。

6 SQL读写相关模块

  1. 对于较复杂的SQL(e.g.,范围查询、表连接、嵌套查询)
    • 为避免较复杂的SQL与TiKV存取的耦合度太高,通过DistSQL将对TiKV的请求封装,提供一个单表的select方法。
    • DistSQL涉及单张表,但可能涉及多个Region。
  2. 简单的SQL请求(点查如利用主键索引或唯一索引进行等值查询等)通过KV模块完成。
  3. 涉及事务的SQL,由Transaction负责二阶段提交。需要PD Client向PD获取时间戳TSO。

TiKV Client 接收KV的row kv request、处理DistSQL的复杂sql的投影、过滤等。向TiKV集群发送读写请求。

image-20211210165335959

7 在线DDL相关模块

image-20211210165444841
  • 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)内的数据。

image-20211210170628780

9 TiDB Server的缓存

默认使用整个TiDB数据库的全部内存。

TiDB Server 缓存的组成部分:SQL的中间结果,线程缓存,元数据、统计信息

TiDB Server 缓存管理:tidb_mem_quota_query(控制查询默认使用的缓存阈值),oom-action(当SQL查询的内存使用超过阈值后怎么操作,停止执行还是记录日志)

推荐阅读