sheng的学习笔记-tidb框架原理

目录

TiDB整体架构

TiDB架构图

组件-TiDB Server

架构图 

流程

关系型数据转成kv

​编辑

组件-TiKV Server​

架构图

主要功能:

列簇

组件-列存储TiFlash

组件-分布式协调层:PD

PD架构图

路由

Region Cache

back off

TSO分配

概念

解决性能瓶颈

高可用设计

调度

信息收集

生成调度

执行调度

Label与高可用

事务

单行数据修改的流程

多行数据修改流程(分布式)

痛点(tidb 6.0以后版本优化)

内存悲观锁

原子性

MVCC和二段式提交

副本机制

region

raft日志

在线ddl

 读取数据

架构图

DML读流程

SQL的Parse与Compile

rocksDB查找数据

 热点小表缓存(cache table)

​编辑

读取时保证读的是主节点机制

IndexRead

leaseRead

Follower Read

Coprocessor

写入数据

架构图

DML写流程

rocksDB写入

RocksDB

流程

内存写入磁盘的流程 

raft日支复制过程:

propose阶段

append阶段

replicate阶段

commited阶段

apply阶段

集群选举

初始化的选举

运行过程中主节点发生异常的选举

多个从节点同时发起选举

基础概念

集群管理(TIME)

痛点(tidb 6.0以后版本优化):

解决方案

HTAP

什么是htap

‌‌OLTP(联机事务处理)和‌OLAP(联机分析处理)

传统解决方案

MPP架构

过滤

交换

连接

聚合步骤的数据交换

​编辑

使用场景

TiFlash

异步复制

一致性读取

智能选择

placement rule

痛点(tidb 6.0以后版本优化):

使用placement rule之后

tikv打标签

设置放置策略

建表语句中关联放置策略 

性能

top sql

痛点(tidb 6.0以后版本优化):

解决方案


TiDB整体架构

TiDB集群主要包括三个核心组件:TiDB Server,PD Server 和TiKV Server。此外,还有用于解决用户复杂 OLAP 需求的 TiSpark 组件和简化云上部署管理的 TiDB Operator组件

​TiDB作为新一代的NewSQL数据库,在数据库领域已经逐渐站稳脚跟,结合了Etcd/MySQL/HDFS/HBase/Spark等技术的突出特点,随着TiDB的大面积推广,会逐渐弱化OLTP/OLAP的界限,并简化目前冗杂的ETL流程,引起新一轮的技术浪潮。一言以蔽之,TiDB,前景可待,未来可期。

TiDB架构图

组件-TiDB Server

TiDB Server 负责接收 SQL 请求,处理 SQL 相关的逻辑并通过 PD Server找到存储计算所需数据的TiKV 地址,与 TiKV 交互获取数据,最终返回结果。TiDB Server 是无状态的,其本身并不存储数据,只负责计算,可以无限水平扩展,可以通过负载均衡组件(如LVS、HAProxy 或 F5)对外提供统一的接入地址

架构图 

  • protocol layer:协议层,处理客户端的连接
  • parse和compile:解析和编译sql,parse输出ast语法书给compile,compile做优化,输出执行计划
  • executor:compile的输出执行计划给executor,执行sql,根据不同类型,调用transaction,kv,DistSQL
  • DistSQL:对复杂的sql进行封装,比如多表范围查询,join,子查询等,输出是单表的计算任务
  • Transaction:处理事务
  • kv:根据主键,或者唯一索引等的点查,走这里
  • schema load和worker和start job:处理ddl执行
  • cache table:缓存写少读多数据
  • gc:垃圾回收,因为支持mvcc,在事务变更后,会将变更前的数据保存,为了防止这样的数据太多,定期清理

流程

关系型数据转成kv

聚簇表

组件-TiKV Server​

TiKV Server 负责存储数据,用于存储 OLTP 数据,采用 行存储格式,支持 事务机制,TiKV 本身是一个 分布式的 Key-Value 存储引擎。

存储数据的基本单位是 Region,每个 Region 负责存储一个 Key Range(从 StartKey 到 EndKey 的左闭右开区间)的数据,每个 TiKV 节点会负责多个 Region

TiKV 的 API 在 KV 键值对层面提供对分布式事务支持,默认提供了 SI (Snapshot Isolation) 的隔离级别。

TiDB 的 SQL 层做完 SQL 解析后,会将 SQL 的执行计划转换为对 TiKV API 的实际调用。

TiKV 支持高可用和自动故障转移,所有数据都会自动维护多副本(默认为三副本)。

架构图

主要功能:

  • 数据持久化:TiKV 在内部选择了基于 LSM-Tree 结构的 RocksDB 引擎(是由 Facebook 开源的一个非常优秀的单机 KV 存储引擎)作为数据存储引擎。可以简单的认为 RocksDB 是一个单机的持久化 Key-Value Map。
  • 分布式事务支持:TiKV 的事务采用的是 Google 在 BigTable 中使用的两阶段提交事务模型:Percolator。在每个 TiKV 节点上会单独分配存储锁的空间,称为 CF Lock。

  • 副本的强一致性和高可用性:采用 Multi-Raft 机制实现了多副本的强一致和高可用。TiKV 中存储的 Region 会自动分裂与合并,实现动态扩展,并借助 PD 节点可使 Region 在 TiKV 节点中灵活调度。

  • MVCC(多版本并发控制)。

  • Coprocessor(协同处理器)。

将 SQL 中的一部分计算利用协同处理器,下推到 TiKV 节点中完成(即算子下推)。充分利用 TiKV 节点的计算资源实现并行计算,从而减轻 TiDB Server 节点的计算压力。TiKV 节点将初步计算后的数据返回给 TiDB Server 节点,减少了网络带宽的占用

列簇

列簇(Column Family,简称CF)是一种数据存储结构,用于存储具有相同特征的数据列。

组件-列存储TiFlash

用于存储 OLAP 数据,和普通 TiKV 节点不一样的是,在 TiFlash 内部,数据是以 列存储格式,主要的功能是为分析型的场景加速。

tikv通过日志传输,将日志传给tiflash,当tikv的主节点挂了,但是tiflash不参与投票

tidb server接到申请,会根据类型自动路由到tikv或者tiflash,也可以手工指定

组件-分布式协调层:PD

PD (Placement Driver) 是整个 TiDB 集群的 元信息管理模块,负责存储每个 TiKV 节点实时的数据分布情况和集群的整体拓扑结构,提供 TiDB Dashboard 管控界面,并为分布式事务分配事务 ID。

PD 不仅存储集群元信息,同时还会根据 TiKV 节点实时上报的 数据分布状态,下发数据调度命令给具体的 TiKV 节点,可以说是 整个集群的“大脑” 。

此外,PD 本身也是由至少 3 个节点构成,拥有高可用的能力。建议部署奇数个 PD 节点。

PD架构图

PD集群也是主从结构的,有一个leader,另外的节点是follower。集成了ETCD,其Raft协议保证了数据的一致性。

PD中存储了数据的元数据信息,同时提供Region的调度功能。

PD提供全局时钟TSO的功能。

Store:集群中的存储实例,对应TiKV。

Region:数据的存储单元,负责维护存储的数据。包含多个副本,每个副本叫一个Peer。读写操作在主节点(leader节点)进行,相关信息通过Raft协议同步到follower节点。leader和follower之间组成一个group,就是raft group。

PD的主要功能:

  • 整个集群的TiKV的元数据存储
  • 分配全局ID和事务ID
  • 生成全局时间戳TSO
  • 收集集群中TiKV的信息,进行调度
  • 提供label,支持高可用
  • 提供TiDB Dashboard

路由

TiDB Server接收用户的SQL请求,执行器Executor通过TiKV Client与TiKV进行交互,TiKV Client需要先从PD获取到Region的元数据信息。

Region Cache

TiKV Client从PD获取Region的元数据信息,需要与PD进行交互,这会涉及到网络开销、数据传输,为了提高效率,减少数据的网络传输,TiKV Client本地可以将Region的元数据信息缓存起来,供下次使用,这个缓存是Region Cache。

back off

back off:TiKV Client从PD拿到leader信息后到Region进行读取,如果此时原有leader失效,变成follower了,则Region会反馈信息给TiKV Client,让TiKV Client找PD,获取最新的leader,重新去新的leader节点读取数据,这个过程就是back off。back off越多,读取数据的延迟就越高,效率越低。

TSO分配

概念

TSO = physical time logical time

TSO是一个int64的整数;physical time是物理时钟,精确到毫秒;logical time是逻辑时钟,将1号码的物理时钟划分成262144个逻辑时钟。

  1. tso 请求者 发送请求到pd client,
  2. pd client同步立刻返回一个对象
  3. 异步请求pd leader ,此时不是单个请求,在一段时间内的批量申请统一请求,减少网络代价
  4. tso 请求者虽然没有获取tso,可以进行解析编译等后续动作
  5. tso做完后续动作,调用wait等待tso的值,等到以后继续动作
  6. 如果tso没处理完,pd leader已经返回了tso,pd client先把值存在那,等着tso 请求者调用wait函数获取tso值

解决性能瓶颈

PD节点可能会宕机,PD需要将当前已分配的TSO记录存储到磁盘,防止宕机的时候数据丢失。

写磁盘是有磁盘IO的,每次分配一个TSO、写一次磁盘,性能会比较低。PD采用每次分配3秒钟的TSO,在内存缓存中记录了3秒钟的TSO缓存供高并发的TiDB Server排队取用,存储在磁盘的是时间区间,3秒钟写一次磁盘,以提高效率。写磁盘的数据会通过Raft协议同步到其他PD节点。

高可用设计

PD每次缓存3秒的TSO,磁盘3秒钟写一次,磁盘数据通过Raft协议同步到其他节点。

当leader节点宕机,leader节点的缓存会丢失,但磁盘的数据已同步到其他PD节点。其他PD节点因无主而会重新选举leader节点,新leader节点产生后,仅会知道磁盘中存储的数据,原leader中的缓存数据无法恢复。为了保证TSO的单调递增特性,新leader不会再从磁盘中存储的时间窗口内分配TSO,而是新启动一个3秒钟的时间窗口分配TSO。这会导致TSO不严格连续,但能保证TSO单调递增。

调度

信息收集

PD通过心跳收集TiKV的信息。主要包括:Store的心跳和Region的心跳。

Store心跳:报告tikv节点的情况

Region的心跳:报告region情况

生成调度

生成调度(operator)的主要关注的信息包括:

负载均衡、热点Region、集群拓扑、缩容、故障恢复、Region合并等。

执行调度

PD生成好operator后,会将operator发送到相关节点进行执行。

Label与高可用

DC:数据中心

Rack:机柜

对于Region1,由于有两个Region在同一个机柜,所以存在一个机柜坏了后Region1不可用的情况。

对于Region2,由于有两个Region在同一个数据中心,所以存在一个数据中心出问题后Region2不可用的情况。

对于Region3,分布在不同的数据中心、不同的机柜,所以就算一个数据中心出问题,Region3仍然可用。

label,PD的标签功能,主要用于标记一个Region如何分布,PD根据label选择将Region分配到哪里。

TiKV实例会记录自己的信息:server.labels

PD实例上配置label的规则,包括:副本数、隔离级别等信息

PD与TiKV配合使用即可实现label的分配和高可用。

事务

单行数据修改的流程

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值