课程名称:1.6 Read and Write data in the TiDB database platform(TiDB 中的读写流程)

学习时长:20min

课程收获:

本课程主要包括 TiDB 架构的简单介绍、各个组件的作用,以及读写请求在 TiDB 中的过程

课程内容:

学习目标: 对 TiDB 整体架构以及读写路程有大概的了解
关键知识点: TiDB 架构;读写流程

TiDB整体架构

imageimage.jpg1237×646 97.8 KB

三大组件:

    1. TiDB:负责SQL处理组件
    1. TiKV:负责存储组件
    1. PD:负责调度组件

TiDB可以很好的跟spark结合,通过TiSpark做为入口,可以像使用spark一样使用TiDB

TiDB

imageimage.jpg1247×652 133 KB

SQL 层,对外暴露 MySQL 协议的连接 endpoint,负责接受客户端的连接,执行 SQL 解析和优化,最终生成分布式执行计划。TiDB 层本身是无状态的,实践中可以启动多个 TiDB 实例,通过负载均衡组件(如 LVS、HAProxy 或 F5)对外提供统一的接入地址,客户端的连接可以均匀地分摊在多个 TiDB 实例上以达到负载均衡的效果。TiDB Server 本身并不存储数据,只是解析 SQL,将实际的数据读取请求转发给底层的存储节点 TiKV(或 TiFlash)。

TiKV

imageimage.jpg1248×605 58.4 KB

目前是一个基于**引擎修改实现的分布式KV存储引擎,具有高度分层的特性,底层的KV存储上层实现了Raft协议实现了保证数据一致性,上层实现了MVCC特性实现事务的多版本控制,上层Transaction事务层实现事务相关内容,TIKV分布式强一致的存储引擎不依赖分布式文件系统实现的。

负责存储数据,从外部看 TiKV 是一个分布式的提供事务的 Key-Value 存储引擎。存储数据的基本单位是 Region,每个 Region 负责存储一个 Key Range(从 StartKey 到 EndKey 的左闭右开区间)的数据,每个 TiKV 节点会负责多个 Region。TiKV 的 API 在 KV 键值对层面提供对分布式事务的原生支持,默认提供了 SI (Snapshot Isolation) 的隔离级别,这也是 TiDB 在 SQL 层面支持分布式事务的核心。TiDB 的 SQL 层做完 SQL 解析后,会将 SQL 的执行计划转换为对 TiKV API 的实际调用。所以,数据都存储在 TiKV 中。另外,TiKV 中的数据都会自动维护多副本(默认为三副本),天然支持高可用和自动故障转移。

PD

imageimage.jpg1254×681 80.9 KB

主要负责全局事务ID的分配,实现region以及leader的调度,实现均衡。
整个 TiDB 集群的元信息管理模块,负责存储每个 TiKV 节点实时的数据分布情况和集群的整体拓扑结构,提供 TiDB Dashboard 管控界面,并为分布式事务分配事务 ID。PD 不仅存储元信息,同时还会根据 TiKV 节点实时上报的数据分布状态,下发数据调度命令给具体的 TiKV 节点,可以说是整个集群的“大脑”。此外,PD 本身也是由至少 3 个节点构成,拥有高可用的能力。建议部署奇数个 PD 节点。

4.0中提供了pd dashboad的功能

TiDB中SQL读写处理流程

imageimage.jpg1245×678 87.4 KB

读请求在TiDB中的处理过程

1.客户端与TiDB建立连接并发送请求给TiDB
2.TiDB接受客户端发送的请求获取客户端发送的SQL语句
3.TiDB负责parses和compiles阶段文本解析,并生成AST语法树进行优化
4.TiDB与PD交互获取start_ts信息
5.TiDB根据执行计划与table元信息生成executor执行器
6.TiDB通过gRPC请求的方式将coprocessor请求发送给TiKV层
7.TiKV接到请求并按照请求过滤数据,并将数据返回给TiDB
8.TiDB接收到所有返回结果之后,整理汇总数据
9.TiDB将整理的结果返回给客户端

写请求在TiDB中的处理过程

1.客户端与TiDB建立连接并发送请求给TiDB
2.TiDB接受客户端发送的请求获取客户端发送的SQL语句
3.TiDB负责parses和compiles阶段文本解析,并生成AST语法树进行优化
4.TiDB与PD交互获取start_ts信息
5.TiDB根据执行计划与table元信息生成executor执行器
6.TiDB发起commit请求
7.参照percolator论文进行二阶段提交,prewrite阶段以及commit阶段,TiDB会在二阶段提交的commit阶段像TiKV请求获取commit_ts
8.TiKV将结果返回给TiDB
9.TiDB将结果返回给客户端

对比读请求和写请求

  1. 读请求主要像PD请求一次ts即可
  2. 写请求会请求两次tso,一次start_ts,一次commit_ts
  3. 写请求会涉及二阶段提交以及分布式事务相关内容