【TiDB理论知识 03】TiKV-持久化与数据读取

news2024/11/24 22:39:06

目录

 一 TiKV架构和作用

 二 数据持久化 

1 RocksDB:写入 

写入过程

第一步 :WAL 写日志 (磁盘日志)

第二步:写MemTable (内存中)

第三步 : 转存为immutable MemTable(内存中)

第四步: 刷盘 (从内存写磁盘)

RocksDB 写入磁盘

2 RocksDB 查询

查询过程

布隆过滤器 

3 RocksDB 列簇CF Column Families


  • TiKV架构和作用
  • TiKV持久化和读取
  • TiKV如何提供MVCC和分布式事务支持
  • TiKV基于Raft算法的分布式一致性
  • TiKV的Coprocessor

 一 TiKV架构和作用

 二 数据持久化 

TiKV数据持久化是靠集成在内部的rocksdb,在tikv中有两个rocksdb实例的,一个负责存储KV ,另一个负责存储 raft log 也就是复制日志

tikv 没有选择直接将数据 存储在磁盘上,而是将数据存储在一个成熟的存储引擎中 rocksdb

rocksdb 在tikv中就是负责数据落地,是一款非常优秀开源的单机的数据存储引擎,可以满足我们单机存储数据的需求,

你可以认为rocksdb 是一个很大的map ,其中存储了key value的键值数据

1 RocksDB:写入 

写入过程

通过一次数据写入了解数据写入全流程 比如要写(1,'Tom')这条数据到users表中

第一步 :WAL 写日志 (磁盘日志)

首先写数据之前先写日志, 即WAL机制( write ahead log)日志先写,WAL日志有两个,循环覆盖使用。

目的:先写日志是为了防止掉电内存数据丢失 ,crash recovery的能力 。当掉电时内存数据丢失,但是wal日志中还存在数据的操作日志,可以重读日志把数据恢复出来( crash safe)

相关参数 sync_log = true设置为true时 ,直接调用操作系统的fsync写入到磁盘中,不会经过操作系统的缓存。

第二步:写MemTable (内存中)

然后再写入到 MemTable ,MemTable是内存中的数据结构,一般采用跳跃表 /搜索树保证数据的有序性。

MemTable 同时服务于读和写 ,最新写入的数据在MemTable,即MemTable中的数据永远是最新的。 读的话也是从MemTable中读。

第三步 : 转存为immutable MemTable(内存中)

当数据追加到MemTable到达一定数量之后 即参数 write_buffer_size 设置大小后 ,就会转存到 immutable MemTable中 。

之后rocksdb重新开辟一个MemTable。 Immutable Memtable 这样就形成了 , Immutable Memtable 就是需要刷到磁盘的文件,所以 Immutable Memtable就是Memtable刷新到磁盘中 成为SST( SSD table)的一个中间状态。

为什么要有 Immutable Memtable ?

如果直接从 Memtable 刷新到磁盘 会有IO等待,客户端写入会有阻塞 。引入 Immutable Memtable是为了防止写阻塞的。

第四步: 刷盘 (从内存写磁盘)

Immutable Memtable有一个就会刷到磁盘。

如果刷盘较慢,当 Immutable Memtable 如果达到5个 就会触发流控 write stall 。write stall 是rocksdb的一个自我保护机制,客户端写入太快了,刷磁盘速度跟不上,就会出现限速,即写入MemTable的速度限制起来,从客户端的现象来看就是写入变慢了,通过日志可以看到现象。

如何解决:优化存储 或者 调高触发write stall 的参数值。

RocksDB 写入磁盘

磁盘中的文件是分层组织的,每一层 Level 1 Level 2.. Level n

Level 0 比较特殊,  Level 0就是 Immutable Memtable的一个复刻,内容都是是相同的,如果Level 0的文件达到 达到四个之后,就会触发compaction,每一层都会切割成一个一个的SST Table,就是咱们说的SST 文件,这里的每个SST 文件都是键值对,是按照Key排序的。

如果需要查找某个key,就会用二分查找法查找SST文件,如果在这个文件中则返回,如果不在则查找另一个文件。

SST文件是如何形成?

Level 0写满4个以后,就会往Level 1合并,合并的时候会压缩并按照key排序。当Level 0又写满4个,会重复上面的步骤。当Level 1达到256M之后就会往Level 2合并。

所以Level 0 的SST文件的大小 = immutable Table = MemTable = write_buffer_size

Level1 SST文件大小 = 4*write_buffer_size?

写入总结:

写日志(wal),写MemTable后一次写入就算完成了,其余的都是在后台完成。这样写入就会很快速,只需要一次磁盘IO 和内存IO 。相比于B+数 ,需要多次磁盘IO 找到数据位置。这样就将随机写转换为顺序写。

对于删除,更新操作:

不去实际删除实际的数据 ,只需要在memTable 中写入delete key = 123;更新操作同理。所以rocksdb对写入非常优化,每次写入不需要定位原来的数据在哪里,只需要把操作放到memTable 即可

2 RocksDB 查询

查询过程

相比于b+树来说 RocksDB查询会比较复杂 。

但是对于查询操作,就比较复杂,需要依次访问 blockCache -->MEMTable--> Immutable -->MEMTable,

blockCache 存储最近最常读的数据,如果数据在blockCache就直接从内存中读取返回,如果不在blockCache中 就继续往下找 MEMTable ,如果还是没有命中 继续找 Immutable MEMTable,如果还是没有命中继续向下找Level 0,因为新的数据永远在老的数据上面,所以查找到后可以直接返回

具体到某个SST文件 怎么读取 会把KEY 按最小值和最大值排序,如果在这个区间 读取,如果不在 继续想下层查找

布隆过滤器 

1978年发明

可以帮你判断这个集合中的元素是否存在 ,

如果布隆过滤器说这key在这个文件中,那么这个key 不一定在这个文件中。

如果布隆过滤器说这key不在这个文件中,那么这个key 一定不在这个文件中。

3 RocksDB 列簇CF Column Families

作用:可以将不同的表分开存储 ,RocksDB的数据分片技术。

写入的时候可以指定写入到那个列簇

如果写入的时候不指定列簇 默认的叫default 列簇

write (CF1,id name,age)

write (CF1,id addr,tel)

WAL日志不分,共享一份WAL日志

CF 是分布式事务和 ??的基础,先了解这个概念

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/771990.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JAVA集成国密SM4

JAVA集成国密SM4加解密 一、pom配置二、代码集成2.1、目录结构2.2、源码2.3、测试 三、遇到的坑3.1、秘钥长度3.2、转码问题 四、相关链接 国密算法概述:https://blog.csdn.net/qq_38254635/article/details/131801527 SM4对称算法 SM4 无线局域网标准的分组数据算…

线性表的链式存储结构以及顺序表和链表的比较

2.2线性表的链式存储结构 **链式存储结构:**结点在存储器中的位置是任意的,即逻辑上相邻的数据元素在物理上不一定相邻。 线性表的链式表示又称为非顺序映像或链式映像 这组存储单元既可以是连续的,也可以是不连续的,甚至是零散…

C++基础算法前缀和和差分篇

📟作者主页:慢热的陕西人 🌴专栏链接:C算法 📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言 主要讲解了前缀和和差分算法 文章目录 Ⅳ. 前缀和 和 差分Ⅵ .Ⅰ前缀和…

AtcoderABC244场

A - Last LetterA - Last Letter 题目大意 给定一个长度为N的字符串S,由小写英文字母组成,打印出S的最后一个字符。 思路分析 题目要求打印出字符串S的最后一个字符,可以直接通过访问S的最后一个元素来获取该字符。可以使用字符串的back()…

旅游卡小程序软件招商加盟代理

旅游卡小程序软件招商加盟代理 我国人民生活水平的提高,旅游业成为了人们生活中必不可少的一部分。旅游卡小程序软件作为旅游行业的重要组成部分,也日益受到人们的关注。如今,旅游卡小程序软件招商加盟代理已经成为了一个热门的投资创业项…

$.getScript()方法获取js文件

通过$.getScript(‘xxxx.js’)获取xxxx.js文件,这时的ajax是一个get请求的状态,如果进行了入参data的赋值那么他就会跟在url后面,同理获取json文件,css文件。 一开始没想起这茬。。。

使用PostgreSQL创建高级搜索引擎

​本文我们将探索PostgreSQL中的全文搜索功能,并研究我们能够复制多少典型搜索引擎功能。 如果您想跟随并尝试示例查询(我们建议这样做,这样更有趣),可以使用来自Kaggle的Wikipedia电影情节数据集执行代码示例。要导入…

C++day4 (拷贝构造函数、拷贝赋值函数、匿名对象、友元函数、常成员函数、常对象、运算符重载)

#include <iostream> #include <cstring> using namespace std;class mystring { private:char *str; //记录C风格字符串int size; //记录字符串的实际长度public://无参构造mystring():size(10){strnew char[size];//构造出一个长度为10的字符串strcpy(str,&…

第七章嵌套矢量中断控制器(Cortex-M7 Processor)

目录 第七章嵌套矢量中断控制器 7.1关于NVIC 7.2NVIC功能描述 7.2.1低功耗模式 7.2.2电平与脉冲中断 7.3NVIC程序员模型 7.3.1中断控制器类型寄存器 第七章嵌套矢量中断控制器 本章描述了嵌套矢量中断控制器(NVIC)。它包含以下部分: 关于NVIC在7-2页。NVIC功能描述见第7-…

【软考】系统架构设计风格分类的个人理解

个人适当学习了软考系统架构设计师中关于系统架构设计相关的内容&#xff0c;梳理了一下相关信息。 常见架构类型和常见分类 常见的软考中出现的系统架构列举如下&#xff1a; 分层架构管道-过滤器架构客户端-服务器架构模型-视图-控制器架构&#xff0c;即MVC架构事件驱动架…

Meta 最新发布 LLaMA 2(允许商业化)

文章目录 Llama 2 模型介绍Llama 2的核心点Llama 2的测评结果Llama 2的预训练预处理数据预训练设置和模型架构 Llama-2-chat 模型介绍Llama-2-chat 模型在帮助性和安全性上的表现Llama-2-chat 模型的训练过程 Llama 2 模型介绍 2023年7月18日&#xff0c;Meta 发布了Llama 2&a…

字节跳动后端面试,笔试部分

背景 笔者在刷B站的时候&#xff0c;看到了一个关于面试的实录&#xff0c;前半段是八股文&#xff0c;后半段是笔试部分&#xff0c;感觉笔试部分的题目还是挺有意思的&#xff0c;特此记录一下。 笔试部分 问题1&#xff1a;SQL 这题考的是 union all 的用法&#xff0c;在…

流程工业停机的实际成本

流程制造工厂面临着避免停机的巨大压力&#xff0c;因为这可能会严重影响企业的整体生产力、盈利能力和声誉。企业对计划外停机的原因和成本了解得越多&#xff0c;就能做更多的事情来帮助降低停机的发生率&#xff0c;并在停机发生时更好地做好应对准备。 图.石油炼化工厂&…

在Redis主从系统中使用哨兵

一、什么是哨兵 Redis的哨兵&#xff08;Sentinel&#xff09;是Redis分布式系统中的一种特殊角色&#xff0c;用于监控和管理Redis主从复制架构中的主节点&#xff08;master&#xff09;和从节点&#xff08;slave&#xff09;。 哨兵的主要功能是确保Redis系统的高可用性。它…

学校教室巡课,为何你总是出错?

教育是社会进步和个人发展的重要基石&#xff0c;而教师的教学质量和专业能力直接关系着教育的成效和学生的学习成果。为了促进教师的专业发展和提高教学质量&#xff0c;在线巡课系统应运而生。 通过在线巡课系统&#xff0c;巡课者可以远程观察教师的授课过程&#xff0c;并提…

Hugging Face开源库accelerate详解

官网&#xff1a;https://huggingface.co/docs/accelerate/package_reference/accelerator Accelerate使用步骤 初始化accelerate对象accelerator Accelerator()调用prepare方法对model、dataloader、optimizer、lr_schedluer进行预处理删除掉代码中关于gpu的操作&#xff0…

使用Jmeter做性能测试的注意点

目录 一、性能测试注意点 二、性能指标分析 一、性能测试注意点 1. 用jmeter测试时使用BeanShell脚本获取随机参数值&#xff0c;会导致请求时间过长&#xff0c;TPS过低。应改为使用csv读取参数值&#xff0c;记录的TPS会更加准确。 注&#xff1a;进行性能测试时&#xff0…

EMC学习笔记(十七)PCB设计中的安规考虑

PCB设计中的安规考虑 1 概述2.安全标识2.1 对安全标示通用准则2.2 电击和能量的危险2.3 PCB上的熔断器2.4 可更换电池 3.爬电距离和电气间隙4.涂覆印制板4.1 PCB板的机械强度4.2 印制电路板的阻燃等级4.3 热循环试验与热老化试验4.4 抗电强度试验4.5 耐划痕试验 5.布线和供电 1…

C# 属性

文章目录 实例属性静态属性只读属性&#xff1a;内部只读属性&#xff1a;动态计算值的属性方式一&#xff1a;主动计算方式二&#xff1a;被动计算 快速生成属性的方法&#xff1a;输入propfull&#xff0c;按两下tab键&#xff0c;然后再按tab键一次修改有底纹的字段&#xf…

LeetCode141.环形链表

141.环形链表 目录 141.环形链表一、哈希表二、双指针 一、哈希表 最容易想到的方法就是遍历所有节点&#xff0c;每次遍历到一个节点的时候&#xff0c;判断该节点此前是否被访问过 我们可以使用哈希表来存储所有已经访问过的节点 每次到达一个节点&#xff0c;如果该节点已…