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

目录

 一 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 是分布式事务和 ??的基础,先了解这个概念

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Web 3.0时代,重塑教育与学习方式的可能性

随着科技的快速发展和互联网的普及,教育领域也面临着巨大的机遇和挑战。Web 3.0时代的到来为教育与学习方式带来了全新的可能性。在这个数字化时代,我们可以探索和利用Web 3.0技术,重塑教育的方式,提供更个性化、互动性和灵活性的…

餐饮业油烟在线监测系统的具体应用 安科瑞 许敏

摘要:本文利用物联网技术,构建了一套餐饮企业智能油烟在线监测系统,该系统前台由厨房端和管道端组成,通过网关接入云平台管理系统,实时监控烟道阀门的启闭、变频风机的启停与风速及功率调节、油烟浓度数据等。结合动态…

RabbitMQ安装及简单使用

说明:RabbitMQ(官网:)是一门异步通讯技术,使用异步通讯技术,可解决同步通讯的一些问题。 安装 本文介绍在云服务器上安装RabbitMQ,操作系统是CentOS 7,远程连接工具是WindTerm&…

opencv -10 基础运算之 图像加权和(图像融合图像修复视频合成)

什么是图像加权和? 所谓图像加权和,就是在计算两幅图像的像素值之和时,将每幅图像的权重考虑进来,可以用公式表示为: dst saturate(src1 𝛼 src2 𝛽 𝛾)式中,satu…

css通过子元素选择父元素

伪类:has选择父元素 td:has(> .unfoldTable){//可选中所有td下包含unfoldTable的class标签的td属性color: red; }td:has(> div){//可选中所有td下包含div标签的td属性color: red; } 特殊举例分析: 个别UI框架个别标签通过事件直接生成或者无法选中的情况。…

SpringAMQP使用

说明:SpringAMQP(官网:https://spring.io/projects/spring-amqp)是基于RabbitMQ封装的一套模板,并利用了SpringBoot对其实现了自动装配,使用起来非常方便。安装和原始使用参考:http://t.csdn.cn…

SpringCloud(五)Gateway 路由网关

一、路由网关 官网地址:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/ 我们需要连接互联网,那么就需要将手机或是电脑连接到家里的路由器才可以,而路由器则连接光猫,光猫再通过光纤连接到互联网&a…

按键控制led变化

文章目录 按键控制led变化一、简介二、代码三、仿真代码四、仿真结果五、总结 按键控制led变化 一、简介 使用按键控制开发板上一个led灯的亮灭,当按键按下的时候led灯就亮,当再一次按下按键的时候led就不亮了。由于按键存在抖动,按键松开的…

idea 有时提示找不到类或者符号,日志报java: 找不到符号的解决

解决一&#xff1a; idea maven编译成功&#xff0c;运行失败提示找不到符号&#xff0c;主要是get和set方法找不到符号&#xff0c;此时就是idea的lombok版本冲突 IDEA版本导致的Lombok失效&#xff0c;需要更新lombok版本到1.18.14及之后版本得到解决 <dependency>&…

Linux:squid透明代理

在传统代理上进行修改并添加网卡 这次不使用手动代理&#xff0c;而是把网关搞成代理 在下面这个链接里的文章实验下进行修改 Linux&#xff1a;squid传统代理_鲍海超-GNUBHCkalitarro的博客-CSDN博客 完成以后不用再win10上去配置&#xff0c;代理的那一步&#xff0c;然后…

3、Java入门教程【数据类型】

一、概述 java中数据类型分为两大类&#xff1a;【基本数据类型】和【引用数据类型】 二、基础数据类型 数据类型含义默认值取值范围存储大小&#xff08;字节&#xff09;整型byte字节型0-128 到 1271整型short短整型0-2^15 到 2^15-12整型int【默认】整形0-2^31 到 2^31-14…

1186. 删除一次得到子数组最大和;1711. 大餐计数;1834. 单线程 CPU

1186. 删除一次得到子数组最大和 解题思路&#xff1a;如果没做过还不是很好想&#xff0c;当时自己第一反应是双指针&#xff0c;结果是个动态规划的题。 核心就是dp的定义&#xff0c;dp[i][k]表示以arr[i]结尾删除k次的最大和。看到这里其实就有一点思路了 dp[i][0]表示以…

⛳ Git安装与配置

Git安装配置目录 ⛳ Git安装与配置&#x1f3ed; 一&#xff0c;git的安装&#x1f3a8; 1&#xff0c;下载git&#x1f463; 2&#xff0c;下载完成之后&#xff0c;双击安装即可。&#x1f4bb; 3&#xff0c;更改安装目录&#xff08;没有中文且没有空格&#xff09;&#x…

Netty核心技术十一--用Netty 自己 实现 dubbo RPC

1. RPC基本介绍 RPC&#xff08;Remote Procedure Call&#xff09;:远程 过程调用&#xff0c;是一个计算机 通信协议。该协议允许运 行于一台计算机的程序调 用另一台计算机的子程序&#xff0c; 而程序员无需额外地为这 个交互作用编程 两个或多个应用程序都分 布在不同的服…

【已解决】html元素如何使字体占据相同的元素显得整齐

本博文源于自身的亲身实践&#xff0c;让html的文本元素对齐&#xff0c;如果不让其对齐就会变得很丑陋&#xff0c;如下图&#xff0c;那么如何设置才能让元素占据相同呢&#xff1f; 文章目录 1、问题来源2、问题解决思路3、问题解决方案4、问题完整源码及效果 1、问题来源 …

摩尔投票算法(Moore‘s Voting Algorithm)及例题

摩尔投票算法&#xff08;Moores Voting Algorithm&#xff09;及例题 摩尔投票算法简介摩尔投票算法算法思想摩尔投票算法经典题目169. 多数元素229. 多数元素 II6927. 合法分割的最小下标 上午打力扣第 354 场周赛最后十五分钟用摩尔投票算法直接秒了第三题。 摩尔投票算法简…

使用原生Redis命令实现分布式锁

推荐文章&#xff1a; 1、springBoot对接kafka,批量、并发、异步获取消息,并动态、批量插入库表; ​ 2、SpringBoot用线程池ThreadPoolTaskExecutor异步处理百万级数据; 3、java后端接口API性能优化技巧 4、SpringBootMyBatis流式查询,处理大规模数据,提高系统的性能和响应…

一零六四、世界杯数据可视化分析(阿里云天池赛)

目录 赛制官方链接 活动背景 活动时间&#xff1a;即日起-12月31日17点 数据说明 世界杯成绩信息表&#xff1a;WorldCupsSummary 世界杯比赛比分汇总表&#xff1a;WorldCupMatches.csv 世界杯球员信息表&#xff1a;WorldCupPlayers.csv 代码实现 赛制官方链接 世界杯…

Git 学习笔记

Git 仓库中的提交记录保存的是你的目录下所有文件的快照&#xff0c;就像是把整个目录复制&#xff0c;然后再粘贴一样&#xff0c;但比复制粘贴优雅许多&#xff01; Git 希望提交记录尽可能地轻量&#xff0c;因此在你每次进行提交时&#xff0c;它并不会盲目地复制整个目录。…

使用typora+PicGo+Gitee简单实现图片上传功能

本文通过配置PicGoGitee来实现typora图片上传功能&#xff0c;系统是window 注意下载的清单有&#xff1a;PicGo&#xff0c;node.js&#xff0c;配置有&#xff1a;PicGo&#xff0c;node.js&#xff0c;gitee&#xff0c;typora 看着复杂实际上并不难&#xff0c;只是繁琐&am…