从零开始学TiDB(1) 核心组件架构概述

首先TiDB深度兼容MySQL 5.7

1. TiDB Server

SQL语句的解析与编译:首先一条SQL语句最先到达的地方是TiDB Server集群,TiDB Server是无状态的,不存储数据,SQL 发过来之后TiDB Server 负责 解析,优化,编译 这条SQL语句,并生成执行计划。

处理客户端的连接:TiDB Server 还有一个特点是可以横向扩展,当并发很高,会话数很多,TiDB Server可以横向扩展增加节点,分走一部分会话。

关系数据与KV的转化:由于 TiDB 存储的数据不是行数据,是键值对 KV,所以当insert的时候还会做 行数据变成KV类型数据的转化。 所以region由一个个的键值对组成。

OnlineDDL:DDL语句不会阻塞线上的业务。

垃圾回收:一行数据修改频繁,经历了多次修改,之前修改的版本会保留下来。久而久之就会给数据库带来压力,TiDB Server 会进行自动垃圾回收(我们叫它GC)

智能选择:通过预测SQL,来确定是访问列存版本还是行存版本。

2. 数据存储节点-TiKV

TiKV 里面存储的数据并不是建的表,当写数据的时候,会经过 TiDB Server 把数据分成一个个的region (每个region在96M-144M之间)。并且为region创建副本,默认是三副本。

所以TiKV的作用就是存储打散的数据 ,并创建多副本保证高可用。所以如果空间不够的时候可以通过添加TiKV的方式来解决。

持久化:

TiKV中运行着rocksdb这个单机的KV存储引擎。 rocksdb 有两个实例

一个是rocksdb kv:存储KV类型的数据。

一个是rocksdb raft: 存储指令,对表的DML操作,都先存在rocksdb raft 中,再由rocksdb kv 进行应用。

强一致性和高可用性:

通过Raft协议,保证region在另外的TiKV中也有副本 。在三个副本中,只有一个副本负责读写,成为leader副本。其它的副本不能读写,复制同步leader副本。

MVCC:

MVCC实现数据库隔离性。

支持事务:

算子下推:

分布式数据库的优势,虽然数据存在多个节点中,会有一定的网络延迟,但每个节点都有CPU,每个节点可以处理一部分计算功能。

3. 列存组件-TiFlash

TiFlash 存的数据和TiKV里面的region是一样的,不过TiKV是行存储,TiFlash是列存储。

TiFlash也参与复制,TiFlash 的数据和TiKV是一样的,引入TiFlash 是为了分析型业务 的性能。

4.集群大脑 PD

当访问数据的时候,比如一条SQL 要进行全表扫描,经过TiDB Server后生成了执行计划,现在去找这张表组成的region 在个TiKV 或哪几个TiKV 上面? 这就需要 region和TiKV 的映射关系(我们叫他元数据),元数据就存储在PD节点上。

并且每个SQL 都有一个开始时间,也存储在PD上,我们叫它(TSO)

如果是事务提交,也会记录事务开始时间和事务结束时间。

当一张表存储在TiKV中,经过长期的运行,这张表越来越大, 这张表过分的集中在某个TiKV中,这时候DML会集中到某个TiKV中,所以 region和TiKV会以一定的时间间隔向PD汇报自己的状况,读写压力等。PD会根据信息进行调度。

相关推荐
#HakunaMatata23 分钟前
Java 中 List 接口的学习笔记
java·学习·list
Magnetic_h29 分钟前
【iOS】OC高级编程 iOS多线程与内存管理阅读笔记——自动引用计数(三)
笔记·学习·ios·objective-c·cocoa
cwtlw2 小时前
CSS学习记录11
前端·css·笔记·学习·其他
cwtlw3 小时前
如何创建maven工程
java·笔记·后端·学习·maven
半夏知半秋4 小时前
unity打包流程整理-Windows/Mac/Linux平台
windows·笔记·学习·macos·unity·游戏引擎
君逸~~4 小时前
RK3568(二)——字符设备驱动开发
linux·驱动开发·笔记·学习·rk3568
Octopus20774 小时前
【C++】AVL树
开发语言·c++·笔记·学习
奶香臭豆腐5 小时前
C++ 泛编程 —— 函数模板(中)
开发语言·c++·学习
●VON5 小时前
go语言的成神之路-标准库篇-os标准库
linux·运维·服务器·开发语言·后端·学习·golang
虾球xz5 小时前
游戏引擎学习第41天
学习·算法·游戏引擎