RocksDB介绍:一个比LevelDB更彪悍的引擎

2023-11-05

关于LevelDB的资料网上还是比较丰富的,如果你尚未听说过LevelDB,那请稍微预习一下,因为RocksDB实际上是在LevelDB之上做的改进。本文主要侧重在架构上对RocksDB对LevelDB改进的地方做个简单介绍并添加一些个人的看法,更详细的信息读者可参考其官网:http://rocksdb.org/

RocksDB是在LevelDB原来的代码上进行改进完善的,所以在用法上与LevelDB非常的相似。如下,就是简单的把原来Leveldb信息替换为Rocksdb,从继承的角度看,Rocksdb就像是Leveldb的后辈。

RocksDB:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "rocksdb/db.h"
 
rocksdb :: DB * db ;
rocksdb :: Options options ;
options . create_if_missing = true ;
 
rocksdb :: Status status = rocksdb :: DB :: Open ( options , "/tmp/testdb" , & db ) ;
 
assert ( status . ok ( ) ) ;
 
status = db -> Get ( rocksdb :: ReadOptions ( ) , key1 , & value ) ;
status = db -> Put ( rocksdb :: WriteOptions ( ) , key2 , value ) ;
status = db -> Delete ( rocksdb :: WriteOptions ( ) , key1 ) ;
 
delete db ;
 

LevelDB:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "leveldb/db.h"
 
leveldb :: DB * db ;
leveldb :: Options options ;
options . create_if_missing = true ;
 
leveldb :: Status status = leveldb :: DB :: Open ( options , "/tmp/testdb" , & db ) ;
 
assert ( status . ok ( ) ) ;
 
status = db -> Get ( leveldb :: ReadOptions ( ) , key1 , & value ) ;
status = db -> Put ( leveldb :: WriteOptions ( ) , key2 , value ) ;
status = db -> Delete ( leveldb :: WriteOptions ( ) , key1 ) ;
 
delete db ;
 

RocksDB虽然在代码层面上是在LevelDB原有的代码上进行开发的,但却借鉴了Apache HBase的一些好的idea。在云计算横行的年代,开口不离Hadoop,RocksDB也开始支持HDFS,允许从HDFS读取数据。而LevelDB则是一个比较单一的存储引擎,有点我就是我,除了我依然只有我的感觉。也是因为LevelDB的单一性,在做具体的应用的时候一般需要对其作进一步扩展。

RocksDB支持一次获取多个K-V,还支持Key范围查找。LevelDB只能获取单个Key

RocksDB除了简单的Put、Delete操作,还提供了一个Merge操作,说是为了对多个Put操作进行合并。站在引擎实现者的角度来看,相比其带来的价值,其实现的成本要昂贵很多。个人觉得有时过于追求完美不见得是好事,据笔者所测(包括测试自己编写的引擎),性能的瓶颈其实主要在合并上,多一次少一次Put对性能的影响并无大碍。

RocksDB提供一些方便的工具,这些工具包含解析sst文件中的K-V记录、解析MANIFEST文件的内容等。有了这些工具,就不用再像使用LevelDB那样,只能在程序中才能知道sst文件K-V的具体信息了。

RocksDB支持多线程合并,而LevelDB是单线程合并的。LSM型的数据结构,最大的性能问题就出现在其合并的时间损耗上,在多CPU的环境下,多线程合并那是LevelDB所无法比拟的。不过据其官网上的介绍,似乎多线程合并还只是针对那些与下一层没有Key重叠的文件,只是简单的rename而已,至于在真正数据上的合并方面是否也有用到多线程,就只能看代码了。

RocksDB增加了合并时过滤器,对一些不再符合条件的K-V进行丢弃,如根据K-V的有效期进行过滤。

压缩方面RocksDB可采用多种压缩算法,除了LevelDB用的snappy,还有zlib、bzip2。LevelDB里面按数据的压缩率(压缩后低于75%)判断是否对数据进行压缩存储,而RocksDB典型的做法是Level 0-2不压缩,最后一层使用zlib,而其它各层采用snappy。

在故障方面,RocksDB支持增量备份和全量备份,允许将已删除的数据备份到指定的目录,供后续恢复。

RocksDB支持在单个进程中启用多个实例,而LevelDB只允许单个实例。

RocksDB支持管道式的Memtable,也就说允许根据需要开辟多个Memtable,以解决Put与Compact速度差异的性能瓶颈问题。在LevelDB里面因为只有一个Memtable,如果Memtable满了却还来不及持久化,这个时候LevelDB将会减缓Put操作,导致整体性能下降。笔者目前写的引擎在这方面竟然跟RocksDB不谋而合,这里偷偷乐一下,呵呵。

看完上面这些介绍,相比LevelDB是不是觉得RocksDB彪悍的不可思议,很多该有的地方都有,该想的都想到了,简直不像在做引擎库,更像是在做产品。不过虽然RocksDB在性能上提升了不少,但在文件存储格式上跟LevelDB还是没什么变化的, 稍微有点更新的只是RocksDB对原来LevelDB中sst文件预留下来的MetaBlock进行了具体利用。

个人觉得RocksDB尚未解决的地方:

  1. 依然是完全依赖于MANIFEST,一当该文件丢失,则整个数据库基本废掉。
  2. 合并上依然是整个文件载入,一些没用的Value将被多次的读入内存,如果这些Value很大的话,那没必要的内存占用将是一个可观的成本。

关于这两个问题,尤其是后面那个问题,笔者已有相应的解决方案,至于结果如何只等日后实现之后再作解说了。


转自:http://tech.uc.cn/?p=2592

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RocksDB介绍:一个比LevelDB更彪悍的引擎 的相关文章

  • rocksdb的原子flush

    如果始终启用 WAL xff0c 则无需使用原子刷新选项 启用 WAL 后 xff0c 单个 WAL 文件用于捕获对所有列族的写入 因此 xff0c 恢复的数据库 xff08 通过在崩溃 恢复路径中重播 WAL 日志 xff09 保证在所有
  • rocksdb的设置选项和基本调整

    除了在 RocksDB 上使用基本操作编写代码外 xff0c 您可能还对如何调整 RocksDB 以实现所需的性能感兴趣 在本页中 xff0c 我们将介绍如何进行初始设置 xff0c 该设置应该足以满足许多用例的需求 RocksDB 有许多
  • rocksdb的wal配置

    wal配置 数据库 xff1a xff1a wal dir DBOptions wal dir设置 RocksDB 存储预写日志文件的目录 xff0c 该目录允许将 WAL 存储在与实际数据不同的目录中 数据库 xff1a xff1a WA
  • 【数据库】Redis和RocksDB、levelDB的区别

    区别 Redis 是一个服务 xff0c 独立的进程 xff0c 用户的程序需要与它建立连接才能向它发请求 xff0c 读写数据 RocksDB 和LevelDB 是一个库 xff0c 嵌入在用户的程序中 xff0c 用户程序直接调用接口读
  • std::numeric_limits 出错

    not enough actual parameters for macro max for std numeric limits
  • ubuntu2004/1804安装编译RocksDB

    Linux Ubuntu下载依赖 Upgrade your gcc to version at least 4 8 to get C 11 support Install gflags First try sudo apt get inst
  • RocksDB介绍:一个比LevelDB更彪悍的引擎

    关于LevelDB的资料网上还是比较丰富的 如果你尚未听说过LevelDB 那请稍微预习一下 因为RocksDB实际上是在LevelDB之上做的改进 本文主要侧重在架构上对RocksDB对LevelDB改进的地方做个简单介绍并添加一些个人的
  • Windows下 VS2015编译RocksDB

    VS2015编译RocksDB RocksDB 是一个来自 facebook 的可嵌入式的支持持久化的 key value 存储系统 也可作为 C S 模式下的存储数据库 但主要目的还是嵌入式 RocksDB 基于 LevelDB 构建 1
  • 【RocksDB】Ubuntu20.04下编译rocksdb

    前言 我在刚学rocksdb的时候是在2022年 但是网上的资源很少 查了好久才把rocksdb安装成功 在这里向大家分享一下我的经历 安装过程中也报了很多错误 希望大家不要迷路 首先 在虚拟机里面安装依赖的包以及组件 总共七个依赖包和组件
  • MySQL · 特性分析 · MyRocks简介

    http mysql taobao org monthly 2016 08 03 RocksDB是facebook基于LevelDB实现的 目前为facebook内部大量业务提供服务 经过facebook大量工作 将RocksDB作为MyS
  • 读写锁 share_mutex

    实现一个Windows下的共享锁 读写锁 一 作者 tyc611 cublog cn 2008 11 18 在Windows Vista Server 2008之前 Windows没有提供共享锁 通俗称为读写锁 只能靠自己实现 但从Wind
  • CODIS原理 之 数据迁移流程[2.X]

    CODIS原理 之 数据迁移流程 2 X 分类 源码剖析设计思路 1173 0 作者 邹祁峰 邮箱 Qifeng zou job hotmail com 博客 http blog csdn net qifengzou 日期 2016 08
  • Rocksdb 代码学习 写流程1(WriteBatch写,WriterThead调度Writer)

    1 几个需要使用的相关类 1 Slice 主要用来装数据的 就两个成员变量data size 就是用装key和value的值 长度 以及一些处理函数 class Slice public Create an empty slice Slic
  • MariaDB 10.2 和 Openssl 1.1.0e 出现“不完整类型 MD5_CONTEXT”错误

    我无法在 CentOS 7 中构建启用 RocksDB 的 MariaDB 10 2 它有以下编译错误 root mariadb 10 2 mysys ssl my md5 cc In function void md5 result MD
  • Kafka Streams:如何使用 persistenceKeyValueStore 从磁盘重新加载现有消息?

    我的代码当前使用 InMemoryKeyValueStore 这避免了对磁盘或 kafka 的任何持久化 我想使用rocksdb Stores persistentKeyValueStore 以便应用程序将从磁盘重新加载状态 我正在尝试实现
  • Rocksdb.errors.RocksIOError:IO错误:锁定文件时:sample.db/LOCK:资源暂时不可用

    如何删除rocksDB上的锁 我尝试运行以下代码但出现以下错误 Running on http 127 0 0 1 5000 Press CTRL C to quit Restarting with stat Traceback most
  • Kafka Streams - 低级处理器 API - RocksDB TimeToLive(TTL)

    我正在尝试使用低级处理器 API 我正在使用处理器 API 对传入记录进行数据聚合 并将聚合记录写入 RocksDB 但是 我想保留在rocksdb中添加的记录仅在24小时内处于活动状态 24 小时后 记录应被删除 这可以通过更改 ttl
  • RocksDb sst 文件的 GUI 查看器

    我正在与 Kafka 合作 将数据保存到rocksdb 中 现在我想看看 Kafka 创建的数据库键和值 我下载了 FastNoSQL 并尝试但失败了 该文件夹包含 sst 文件 日志文件 当前文件 身份文件 锁定文件 日志文件 清单文件
  • ROCKSDB 由于rocksdb_max_row_locks 无法获取锁

    我尝试将 CSV 加载到 Rocksdb 数据库中 但失败并显示以下错误 Got error 10 Operation aborted Failed to acquire lock due to rocksdb max row locks
  • 我可以将 flink RocksDB 状态后端与本地文件系统一起使用吗?

    我正在探索使用 FlinkrocksDb 状态后端 文档似乎暗示我可以使用常规文件系统 例如 file data flink checkpoints 但代码 javadoc 仅在此处提到 hdfs 或 s3 选项 我想知道是否可以将本地文件

随机推荐

  • 文件编译【上】

    1 程序的翻译环境和执行环境 翻译环境 在翻译环境中 源文件被翻译为可执行的机器指令 执行环境 实际执行代码的环境 2 编译与链接 组成一个程序的每个源文件通过编译过程分别转换成目标代码 object code 每个目标文件由链接器 lin
  • AR联机初探+官方项目代码解析

    学AR也有一小段时间了 今天给大家分享一下如何让两部以上的设备查看到相同的增强现实景象 在这里作者就以苹果官方的示例来进行解析 一定要把代码下载了和文章对照着看 不然会懵 官方项目代码地址 https developer apple com
  • 前后端连接超时设置

    在application properties中添加 server servlet session timeout 60 单位为秒 在前端添加 ajax timeout 6000 6秒钟 url xxxxxxxxx type post su
  • mxnet for java_如何为mxnet安装R包?

    我曾经使用过R中的 mxnet 软件包 我有一个旧的安装 我可以在R 3 4x中使用它 但现在我想切换到最新的R版本 R 3 5本地 我很乐意在rstudio上使用它 Cloud 包裹在CRAN上 不是吗 现在我尝试按照包裹的说明page
  • 关于microsoft Store被删除了重新下载的问题

    分享一条连接 https jingyan baidu com article 4ae03de3b59d223eff9e6b39 html 另外补充一点 microsoftStore无法联网问题 https www pianshen com
  • 大数据是如何影响何改变我们生活的?

    大数据是如何影响何改变我们生活的 网上一则违法广告 普通市民可能一瞥而过 如今却逃不过重庆工商情报信息工作平台的 法眼 这正是因为重庆市工商局运用大数据 云计算 互联网 等技术手段 在全国工商系统率先建立的重庆工商情报信息工作平台 同样 重
  • 十分钟搭建一个EFK集群

    快速部署搭建ELK ELK 介绍 环境信息 架构 二进制部署 一 系统初始化 二 elasticsearch安装 所有节点 三 filebeat安装使用 四 nginx安装 五 kibana 安装 六访问elasticsearch出现yel
  • 卡方分布的latex代码

    网上没找到答案 自己看了一些还是mathcal字体比较像 最终选择mathcal字体 LaTeX LaTeX LATE X代码 编译示例 mathcal X 2 4 X
  • 深度理解取余/取模运算,你得知道这些...

    大家在日常编程或者学习中都会经常接触到取余 取模运算 那么计算机中取余 取模运算究竟是怎么定义的 读完本篇文章 相信你一点会有很大收获 文章目录 step 1 你可能不知道的四种 取整 方式 1 1 C语言中本质是 向0取整 1 2 flo
  • SpaCy下载及安装

    1 官网给的命令快速安装基本没用 结果就是一直拒绝你的连接 官网 https spacy io 官网是说用下面的两行命令就能够快速安装并使用spacy了 第一行命令是可以很快就成功 但是第二行就来坑了 报错如下图 报错内容是 request
  • 虚拟机的一些命令

    cd 目录名 cd 上一层目录 cd 回到跟目录 ls 当前目录下的内容 ls 目录名 指定目录下的内容 ls a 当前目录下的内容 隐藏内容 ls l 详细列出指定目录或者当前目录下的内容 pwd 查看当前所在的目录 创建目录 mkdir
  • kafka 由于网络原因,最后报错打开的文件过多 (org.apache.zookeeper.ClientCnxn)停止结束服务,求教! --- 采坑

    kafka 运行好好地 今天一用发现有一台服务停了 最后查看日志发现为网络原因 打开文件过多 代理停止 求教大佬解决方案 2019 05 01 17 59 08 224 INFO Socket error occurred 192 168
  • 开关电源基础03:正激和反激开关电源拓扑(1)-正激拓扑

    说在开头 关于薛定谔的波动方程 2 全新的量子理论诞生不到一年 很快面临着粒子和波动的内战 矩阵力学从直接观测到的原子谱线出发 引入矩阵的数学工具 建立了整个新力学的大厦 它强调观测到的分立性 跳跃性 同时又坚持以数学为唯一导向 不为日常生
  • 2016.6.5 计算机网络考试要点第一章之计算机网络性能

    1 8计算机网络性能指标 1 速率 比特率或数据率 比特是计算机中数据量的单位 也是信息论中使用的信息量的单位 意思是 一个二进制数字 因此一个比特就是二进制数字中的一个1或0 当数据率较高时 就可以用kb s k 10的3次方 千 Mb
  • Scanner类中next和nextLine方法的区别

    Scanner类中next和nextLine方法的区别 nextInt next nextDouble 从左往右扫描数据 在扫描到第一个有效字符之前会自动过滤结束标记符 扫描结束标记是 空格 tab键 回车符 不会过滤回车符 nextLin
  • MVC综合案例

    pojo Dept package com qf webpro pojo import java io Serializable public class Dept implements Serializable private int d
  • lua 协同程序(coroutine)

    本文主要是根据菜鸟教程的lua协同程序 coroutine 优化出来的文章 对于网上的lua协同程序的文章 觉得菜鸟教程里的lua协同程序 coroutine 比较完善 但还是有一些地方没有说清楚 对于像我这样的新手学习起来 还是不能完全解
  • python学习之Python count()函数详解

    大家好 依旧是你们的萧萧啊 Python中的count 函数是一种非常常用的方法 用于统计某个元素在列表 元组或字符串中出现的次数 它的使用非常简单 只需要传入要统计的元素作为参数即可 在本篇博客中 我将详细介绍count 函数的用法 并且
  • 数据结构1.1线性表的实现(顺序存储结构)

    一 1 顺序表的优点 1 存储空间连续 方便随时访问 2 结构简单 易于理解 3 易于尾插或尾删和修改 2 顺序表的缺点 1 顺序存储空间容易溢出 不便扩充 2 插入和删除必须移动大量元素 二 顺序表的定义 1 数组静态分配 一开始就定下大
  • RocksDB介绍:一个比LevelDB更彪悍的引擎

    关于LevelDB的资料网上还是比较丰富的 如果你尚未听说过LevelDB 那请稍微预习一下 因为RocksDB实际上是在LevelDB之上做的改进 本文主要侧重在架构上对RocksDB对LevelDB改进的地方做个简单介绍并添加一些个人的