TiDB进阶篇-TiKV架构

news/2024/5/19 15:53:35 标签: tidb

简介

简要的介绍下TiKV的架构。

底层存储RocksDB

RocksDB的写操作

 

在写入WAL的时候为了防止操作系统写入的时候有缓存,要设置操作系统的参数sync_log=true,也就是说只要有数据就执行刷写到磁盘,就不会存储到操作系统的缓存了。MemTable的数据到达一定的大小以后,就会刷写到immutable里面。

level 0的数据就是 immutable是什么数据就会存储什么数据。

如果level 0到达4个以后,就会启动内部的compation操作(数据压缩加数据排序的操作),(每一层的level数据都是排好顺序的),查找的时候是根据二分查找的方法进行对应的数据查找,写的时候都是顺序写,包括它的删除操作也是一条写记录,但是查找的时候,就会过滤掉有删除标志的数据。

RocksDB的读操作

Block Cache是读取数据的缓存。每一个level里面的SST文件都记录了一个最大值和最小值,查找数据的时候,先比对最大值和最小值,如果在这个范围内,那么就会使用二分查找的方法进行数据查找。

RocksDB的Colume Families

这里也就是说他们的key-value一类的数据放在不同的Colume Family中,如果不执行Colume Family那么默认就会到default的Colume Family中,这个就是RocksDB的分片技术。

分布式事务 

分布式事务前提

1.先从PD得到一个开始的时间。

2.如果在用户commit的时候锁的信息才写入到TiKV中,那么这个就是乐观锁(这里之前修改的数据是在内存,只有用户commit的时候才会写入锁的信息)在用户commit的时候就会执行prewrite步骤。

3.如果想修改的操作提前让其他的用户知道,那么在用户修改的时候就已经把锁的信息写入到 TiKV中。

4.在写任何操作的时候,都会在default的后面直接添加数据,包括增删改查。

5.write里面的Colume Family信息是最近的一次数据完成的事务操作的记录信息。write记录以后,然后在Lock的Colume Family添加一条删除锁的记录。

6.用户读取信息的时候会先在write中查找最新的完成操作的记录,然后再到default中查找数据。

注意事项

 

TiDB解决分布式事务的原理

1.prewrite操作会写入对应节点的default里面,并且会写入Lock数据(分布式事务的第一行加主锁,其他的条数加从锁,也就是存储了主锁的指向)。

2.在主锁节点的事务完成以后,如果从锁的数据节点发生了宕机,那么数据节点重启以后,会找到主锁对应的节点是否事务完成了,如果完成了,那么他会更具主锁上面的事务是否完成来修复自己节点的数据。

MVCC(解决事务上锁读数据的问题)

也就是说自己事务读取的数据是自己执行时间之前的数据,多版本并发控制来管理每一个客户端,不同时间看到不同的数据。

Raft和Muti Raft(分布式数据一致性) 

 

日志复制

 

 

raft的commit以后并不代表用户的commited已经成功了。 

 

当数据真正写入到rocksdb kv以后,那么表示用户的commited完成了。 

 

Raft Leader选举 

 

选举相关超时参数 

 

TiKV写入 

数据写入

TiDB Server的写请求会发送给raftstore pool。

 raftstore pool会把写请求,装换成raft log。

使用raft协议同步数据。

然后执行raft 的commit ,apply pool将raft log写入到rocksdb kv中,那么用户的commit 就完成了。

数据读取 

数据读取的时候要找到region的leader位置。

ReadIndex Read 

读取数据的时间线图 

数据只有apply以后才能够查看到。

Lease Read 

由于读取数据的时候要找到对应的leader才行,那么要想优化。

在指定的心跳时间内,那么在重新选举的时候,那么它都是leader。

Follower Read 

上面的两种都只能读取leader的数据,这种就可以读取Follower的数据。

 

在leader的修改

在follower

 

在所有的修改比如1-97的修改,它们一定都会在 1-97之前

Coprecessor

如果不使用Coprecessor,那么很多的聚合操作都会给TiDB

 

有了Coprecessor,那么计算就会下推到TiKV节点(算子下推)。


http://www.niftyadmin.cn/n/226185.html

相关文章

ModuleNotFoundError:No module named “te_fusion“

Asecend Tensor Compiler简称ATC,昇腾张量编译器,主要是将开源框架的网络模型或Ascend IR定义的单算子描述文件(json格式)转换为昇腾AI处理器支持的om格式 场景描述:ONNXRuntime调用CANN后端执行时,报了没有找到te_fusion的error&#xff0c…

多模态模型技术综述

多模态架构导语1. Image2Text1.1 图像数据集准备1.2 图像to文本的生成模型1.2.1 M2 模型(Meshed—Memory Transformer)Memory-Augmented EncoderMeshed Decoder2. text2Image2.1 生成对抗网络(GAN)2.1.1 文本生成图像基础GAN2.1.2…

RPC调用框架简单介绍

一.Thrift Apache Doris目前使用的RPC调度框架。Thrift是一款基于CS(client -server)架构的RPC通信框架,开发人员可以根据定义Thrift的IDL(interface decription language)文件来定义数据结构和服务接口,灵活性高,支持…

linux环境下,使用binlog模式恢复mysql数据(mysql数据库中的一张表误删了怎么找回?)。

linux环境下,使用binlog模式恢复mysql数据(mysql数据库中的一张表误删了怎么找回?)。 问题:linux中开启binlog模式下,mysql数据库中的一张表误删了怎么找回? 1.首先在mysql中查看是否开启binl…

安装kaldi遇到问题的解决办法

1、OpenFst问题 Checking compiler g ... Checking OpenFst library in ... ***configure failed: Could not find file /include/fst/fst.h: you may not have installed OpenFst. See ../tools/INSTALL *** 1 2 3 4 经过查看其他人的做法,我到kaldi.tools 目录下…

盐边县高堰沟灌区综合信息化管理系统及平台建设-案例分享

项目背景 盐边县南部降雨逐年减少,可用水源有限,部分村庄的水源取自仅20亩的山坪塘,常常因降雨量小而蓄不满水,出现“人争水、地缺水”的现象,且支渠及以下渠系基本为土渠,渗漏损失严重。为解决不同程度的工…

在java中调用Groovy

Groovy是什么? Groovy 是 用于Java虚拟机的一种敏捷的动态语言,既可以用于面向对象编程,又可以用作纯粹的脚本语言。 Groovy是JVM的一个替代语言(替代是指可以用 Groovy 在Java平台上进行 Java 编程),使用…

深入理解bean(1)——极简解释@resource注入和手动注入的差别

问了GPT几十分钟,把一些关于bean的概念了解了一下,记录在这里。 给出一个接口和其实现类代码: public interface MyInterface {void doSomething(); }public class SpecificImpl implements MyInterface {private DataSource dataSource;pr…