RocksDB架构

1、rocksdb是什么?

RocksDB中文网 | 一个持久型的key-value存储

rocksdb是一种KV存储引擎,常用于数据库存储数据,无法直接使用,没有提供sql命令,通过调用rocksdb提供的api进行数据库的读写等操作。

rocksdb是以leveldb为基础开发的,都使用了LSM Tree来存储数据,

设计目标:满足使用需求的同时,提供高性能的存储,相比leveldb提供了很多额外的特性,优化性能

官网链接:Home · facebook/rocksdb Wiki · GitHub

2、LSM Tree是什么

存储架构|聊聊 LSM Tree 强悍的设计 - 墨天轮

rocksdb设计架构 - 知乎

LSM-Tree全称Log Structured Merge Tree,是一种分层、有序、面向磁盘的数据结构,其核心思想是充分利用磁盘的顺序写性能要远高于随机写性能这一特性,将批量的随机写转换为一次性的顺序写。

LSM-Tree的写入操作,类似于普通的日志写入方式,以Append的模式追加,删除操作Append一条删除的日志;修改操作Append一条新key-value。

LSM-Tree有内存组件和硬盘组件两部分。

内存组件:包含Memtable和Immutable MemTable,Memtable内部使用红黑树或者跳表来保证结构的有序性

  • Memtable:数据直接写入MemTable;
    • MemTable提供了k-v数据的写入、读取和删除接口。
      按key顺序存储,以便被合并到SSTable后仍然有序
  • Immutable MemTable: 不可写,被冻结的MemTable,待被合并到硬盘;
    • 当MemTable达到一定阈值后,将其冻结成Immutable MemTable,并生成新的MemTable

硬盘组件:包含不同Level的SSTable(sorted string table)

  • Level越低,数据越新,容量越少;反之Level越高,数据越旧,容量越大;
  • 低Level的SSTable被合并到高Level的SSTable,合并过程中会做删除操作(相同key删除旧值保留新值);
  • SSTable中除了数据块,还含有索引块,便于块内数据的快速查找;

WAL

WAL(Write-Ahead-Log)预写日志,用于保证宕机时数据不丢失。
写入数据时,同时写入MemTable和WAL;由于WAL是顺序写,速度很快。
当程序宕机时,可以从WAL恢复数据到MemTable

SSTable

SSTable(sorted string table)是Immutable MemTable在磁盘上的存储,内部按key顺序排列。
为了加快SSTable的查询速度,在SSTable中增加索引信息(如下图),可以快速定位key并查到其value

一个SSTable将由多个被称为Segment的排序文件组成

 LSM-Tree SSTable合并策略

磁盘中低Level的SSTable被合并到高Level中,合并过程中,可以做删除操作,降低磁盘使用。

  • Leveling Merge Policy:

    • 每个level仅有1个组件,L0和L1合并,合并到L1中;
    • 由于组件较少,查询性能较高,LevelDB和RocksDB使用该策略;
  • Tiering Merge Policy:

    • 每个Level有N个组件,合并后生成Level+1的一个新组件;
    • 由于可以降低合并的频率,写入性能较高;

LSM-Tree的读取效率并不高

  • 先查找内存Memtable和Immutable,找到即返回;
  • 然后分别查找磁盘L0 SSTable->L1 SSTable->...,找到即返回;

空间放大:space amplification
如果一项数据更新了多次,这项数据可能会存储在多个不同的SSTable中,甚至一项数据的不同部分的最新内容存储在不同的SSTable中。
这样一份数据在磁盘中存储了多份副本,而老的副本是过时的,数据实际占用的空间比有效数据大。
LSM Tree将这一现象称为空间方法(space amplification)。

读放大:read amplification
空间方法的现象导致LSM Tree查找时,从最老-->最新逐个level查询SSTable;如果目标数据不在最底层的level N中,那么我们就读取和查询了所有的SSTable.
LSM Tree将这种读取和查找了无关SSTable的现象称为读放大(read amplification)。

LSM-Tree读取的优化

从查找过程可以看出,LSM-Tree的读取速度要比其他结构慢,若遇到“读放大”,则查询速度则是灾难性的。
故需要使用一些索引技巧进行优化:

LevelDB Manifest文件

manifest文件记录所有的SSTable信息,比如Level、最小key、最大key等,可以用于快读定位目标SSTable。

这样在查找时,先将SSTable的manifest读到内存中再进行判断,不用整个SSTable读入。

SSTable的索引块

每个SSTable文件中加入索引块,索引块中记录key及其offset,key按顺序排列。

这样在查找时,先在索引中二分查找key和offset,然后再到SSTable中读取key-value。

SSTable的布隆过滤器

对SSTable指定布隆过滤器,判定一个SSTable是否包含特定的建,以减少访问磁盘次数。

这样在查找时,根据BloomFilter可以快速确定某个key是否在当前SSTable中。

SSTable compaction

将多个SSTable合并为一个SStable,删除旧数据或标记为已删除的数据,降低空间放大;
同时,减少SSTable,降低读放大。

B+树的特点:插入和搜索的性能很高,算法的时间复杂度是O(logn)

学大数据必懂系列之LSM-Tree-腾讯云开发者社区-腾讯云

LSM-Tree 概念解析

2、rocksdb是什么

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

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

相关文章

聊聊spring-cloud的负载均衡

聊聊spring-cloud的负载均衡 1. 选择合适的负载均衡算法2. 合理设置超时时间3. 缓存服务实例列表4. 使用断路器5. 使用缓存Spring Cloud负载均衡组件对比RibbonLoadBalancerWebClient对比 总结 在微服务架构中,负载均衡是非常重要的一个环节,可以有效地提…

S32K144 GPIO外设分析

1. S32K144 GPIO外设特性 下面的内容来自于S32K用户手册的翻译,或者网上关于S32K系列的一些pdf文件介绍。有些内容可能会出现理解不到位或者翻译错误方面,如果大家有疑问最好可以查阅用户手册。 GPIO和PORT的数量 从用户手册,对于PCR&#x…

React Dva项目中路由跳转的方法

接下来 我们来看看路由跳转 先打开 我们Dva项目 然后我们需要在routes 下创建一个自己的路由,如果您尚未掌握在Dva项目中创建路由,可以参考我的文章 React 在Dva项目中修改路由配置,并创建一个自己的路由 然后 我的项目有两个路由 router.js…

ASFF Learning Spatial Fusion for Single-Shot Object Detection 论文学习

1. 解决了什么问题? 目标检测取得了显著成绩,但是检测不同尺度的目标仍然是一个挑战。金字塔或多层级特征是解决目标检测中尺度变化的常用手段。但对于单阶段目标检测器而言,各特征尺度之间不一致性制约了算法的表现。与图像金字塔相比&…

VMware Workstation 18 Tech Preview - 增强的 Windows 11 虚拟机安全性

VMware Workstation 18 Tech Preview - 增强的 Windows 11 虚拟机安全性 VMware Workstation Tech Preview 2023 请访问原文链接:https://sysin.org/blog/vmware-workstation-18/,查看最新版。原创作品,转载请保留出处。 作者主页&#xf…

Pytorch个人学习记录总结 07

目录 神经网络-非线性激活 神经网络-线形层及其他层介绍 神经网络-非线性激活 官方文档地址:torch.nn — PyTorch 2.0 documentation 常用的:Sigmoid、ReLU、LeakyReLU等。 作用:为模型引入非线性特征,这样才能在训练过程中…

[k8s] command和args

k8s中的command和args可以覆盖docker镜像中的entrypoint和cmd。其中,k8s-command可以覆盖docker-entrypoint,k8s-args可以覆盖docker-cmd。参考Difference between Docker ENTRYPOINT and Kubernetes container spec COMMAND? 了解一下entrypoint的意义…

Spring 更简单的读取和存储对象

目录 1.存储 Bean 对象 1.1 前置⼯作:配置扫描路径 1.2 添加注解存储 Bean 对象 1.2.1 Controller(控制器存储) 1.2.2 Service(服务存储) 1.2.3 Repository(仓库存储) 1.2.4 Component&a…

C++---string

String C语言中的字符串和C中的string类标准库中的string类string类的常用接口string类对象的常见构造string类对象的容量操作string类对象的访问及遍历操作 C语言中的字符串和C中的string类 在C语言中,字符串是一个字符数组,它以空字符\0结尾&#xff…

【数据结构】朴素模式匹配 KMP算法

🎇【数据结构】朴素模式匹配 & KMP 算法🎇 🌈 自在飞花轻似梦,无边丝雨细如愁 🌈 🌟 正式开始学习数据结构啦~此专栏作为学习过程中的记录🌟 文章目录 🎇【数据结构】朴素模式匹配 & K…

【数据架构】Data Fabric 架构是实现数据管理和集成现代化的关键

D&A 领导者应该了解数据编织架构的关键支柱,以实现机器支持的数据集成。 在日益多样化、分布式和复杂的环境中,数据管理敏捷性已成为组织的任务关键优先事项。为了减少人为错误和总体成本,数据和分析 (D&A) 领导者需要超越传统的数据…

MyBatis操作数据库

1.MyBatis是什么? MyBatis 是⼀款优秀的持久层框架,它⽀持⾃定义 SQL、存储过程以及⾼级映射。MyBatis 去除了⼏乎所有的 JDBC 代码以及设置参数和获取结果集的⼯作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接⼝和 Java POJO&#xf…

【机器学习】吃瓜教程 | 西瓜书 + 南瓜书 (1)

文章目录 一、绪论1、什么是机器学习?2、基本术语3、假设空间4、归纳偏好5、发展历程 二、模型评估与选择A、一种训练集一种算法2.1 经验误差 与 过拟合2.2 评估方法a) 留出法b) 交叉验证法c) 自助法d) 调参与最终模型 2.3 性能度量a) 错误率与精度b) 查准率、查全率…

matlab dot()函数求矩阵内积,三维 ,多维 详解

matlab dot()函数求矩阵内积,三维 ,多维 详解 Cdot(A,b,X),这个参数X 只能取1,或者2。1 表示按列,2表示按行,如果没有参数。默认按列。 1)按列优先计算 Cdot(A,B)dot(A,B,1)[a1*b1a4*b4 ,a2*b2a5*b5 ,a…

视频拼接得AI三维生成方案-开端(一)

想使用二维得图像生成三维得空间图像,英伟达有完整得方案,开源,但是三维拼接不一样,只需要二维,并且要实时,如何生成是我每天都在思考得东西。 cnn 提取特征器和自编码 在训练细胞神经网络时,问…

大数据分析案例-基于LightGBM算法构建乳腺癌分类预测模型

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

jmeter软件测试实验(附源码以及配置)

jmeter介绍 JMeter是一个开源的性能测试工具,由Apache软件基金会开发和维护。它主要用于对Web应用程序、Web服务、数据库和其他类型的服务进行性能测试。JMeter最初是为测试Web应用程序而设计的,但现在已经扩展到支持更广泛的应用场景。 JMeter 可对服务…

AcWing 244. 谜一样的牛—树状数组、二分

题目链接 AcWing 244. 谜一样的牛 题目描述 分析 这道题挺巧妙的,感觉树状数组方面的题就是比较难想,先分析一下样例,样例中每头牛前面比自己低的牛的数量分别为 0 1 2 1 0牛的高度是1~n的排列,如何分析出每头牛的高度呢&…

API Testing 一个基于 YAML 文件的开源接口测试工具

目录 前言: 如何使用? 本地模式 服务端模式 文件格式 后续计划 前言: API Testing 是一个基于 YAML 文件的开源接口测试工具,它可以帮助开发者快速地进行接口测试。 在选择工具时,可以从很多方面进行考量、对比…

【历史上的今天】7 月 20 日:人类登上月球;数据仓库之父诞生;Mac OS X Lion 发布

整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来。 今天是 2023 年 7 月 20 日,在 2005 年的今天,时任微软全球副总裁的李开复加盟谷歌担任谷歌全球副总裁及中国区总裁。谷歌公司在发布聘请李开复消息的同…