RocksDB 架构

news2024/12/26 21:34:15

文章目录

    • 1、RocksDB 摘要
      • 1.1、RocksDB 特点
      • 1.2、基本接口
      • 1.3、编译
    • 2、LSM - Tree
      • 2.1、Memtable
      • 2.2、WAL
      • 2.3、SST
      • 2.4、BlockCache
    • 3、读写流程
      • 3.1、读取流程
      • 3.2、写入流程
    • 4、LSM-Tree 放大问题
      • 4.1、放大问题
      • 4.2、compaction

RocksDB 是 Facebook 针对高性能磁盘开发开源的嵌入式持久化存储系统,采用了 WAL 机制和 LSM Tree 结构。RocksDB 所有类型的数据都是采用追加写,没有更新文件的操作。比较适合使用基于 Append Only 的高性能分布式文件系统。

1、RocksDB 摘要

1.1、RocksDB 特点

  • 基于 LevelDB
  • 嵌入式 KV 存储引擎
  • 针对写密集型场景而提出的解决方案。例:日志系统、海量数据存储、海量数据分析
  • 紧凑型存储。相同的数据量,更少的空间占用。
  • 基于 LSM-Tree 的存储结构。
    • 内存:MemTable
    • 磁盘:SST | WAL

1.2、基本接口

  • Open
  • Get:获取 key
  • Put:存放 key
  • Delete:删除 key,具体在 compaction 中删除
  • SingleDelete:针对从未修改过的 key,比 delete 删除快
  • Merge:合并新写入的数据。带来大量的读数据请求,提前获取 Merge 的增量数据,然后进行合并。
  • Iterator:通过给定的 key 批量获取符合条件的 KV 记录。

1.3、编译

# 1、RocksDB
git clone https://github.com/facebook/rocksdb.git
cd rocksdb
# 编译成调试模式
make
# 编译成发布模式
make static_lib 

# 压缩库 Ubuntu
# gflags
sudo apt-get install libgflags-dev
# snappy
sudo apt-get install libsnappy-dev
# zlib
sudo apt-get install zlib1g-dev
# bzip2
sudo apt-get install libbz2-dev
# lz4
sudo apt-get install liblz4-dev
# zstandard
sudo apt-get install libzstd-dev

2、LSM - Tree

RocksDB 架构基于 LSM-Tree, log structured merge tree 存储结构,其核心就是利用顺序写来提升写性能。

LSM-Tree 组成

  • 内存:可写的 MemTable + 只读的 Immutable Memtable
  • 磁盘:WAL + 多层级 SST

LSM-Tree VS B+ Tree

  • LSM-Tree:顺序写,追加更新。问题:数据冗余,需要后台线程 compaction
  • B+ Tree:随机写,就地更新。问题:磁盘随机 IO < 磁盘顺序 IO,且锁粒度大

接下来,从整体上先介绍 RocksDB 架构图,如图所示:
在这里插入图片描述

用户的数据需要同时写到内存中的 Memtable 数据结构和磁盘 WAL 日志。可写的 Memtable 用于快速索引查询的缓存数据,并采用了跳表数据提升查找数据的速度。定时转换成只读的 Immutable Memtable,保存到 SST 文件中(flush 磁盘操作)。在此期间,若出现服务故障,重启系统会从 WAL 中将数据通过 Redo 的方式回复到 Memtable。

为了定期 compact (合并压缩)数据,将 Immutable Memtable 分为多个层次。Level 0 层允许数据重复,文件间无序,文件内部有序;Level 1 ~ Level N 没有数据重复,跨层可能有重复,文件间是有序的。数据逐层愈冷,压缩程度愈高。SST 文件为每一层的主要存储方式。

读取数据时,先读内存 Memtable,若没有再读磁盘 SST 文件。

参考论文:Chen G J, Wiener J L, Lyer S, et al. Realtime data processing at facebook[C]. Proceedings of the 2016 International Conference on Management of Data. 2016: 1087-1098.

2.1、Memtable

Memtable 内存数据结构,其中的数据总是最新的。同时服务于读和写,写操作先插入 Memtable;读数据先查询 Memtable。当 Memtable 写满,修改为只读的 Immutable Memtable,并被新的 Memtable 替换。后台线程会该 Immutable Memtable 异步落盘(flush)到一个 SST 文件,落盘后销毁 Memtable。

Memtable 基于跳表实现。跳表是多层级有序链表,其特点是:

  • 从最高层次开始跳跃查找,并记录跳跃路径,查询时间O(logn)
  • 找到待插入位置后,插入节点,并随机层高
  • 根据跳跃路径,构建层级链表关系
    在这里插入图片描述

跳表应用场景

  • 范围查询
  • 快速有序地列出所有的节点
  • 并发粒度非常低。相较红黑树加锁整棵树,只将相邻的结点操作加锁

重要参数

#  一个 memtable 的大小
write_buffer_size
# 管理 memtable 使用的总内存数
db_write_buffer_size
# 刷盘到 SST 文件的最大 memtable 数
max_write_buffer_number

复习:其他常见的层级数据结构

  • 跳表:多层级有序链表
  • B+ 树:叶子节点包含所有的数据,非叶子节点只包含索引 key 信息
  • 时间轮:按照定时任务到期时间轻重缓急进行分层

2.2、WAL

WAL, Write Ahead Log。RocksDB 中的 DML 操作同时写入内存 Memtable 和磁盘 WAL 日志文件。当系统崩溃时,WAL 日志可以完整恢复 Memtable 中的数据,以保 WAL中的数据通过 redo 的方式恢复到 Memtable。

重要参数

# WAL 文件的最大大小
DBOptions::max_total_wal_size
# WAL 文件的删除时间
DBOptions::WAL_ttl_seconds

2.3、SST

SST, Sorted String Table,有序键值对集合,是 LSM - Tree 在磁盘中的数据结构。与 B+ Tree 就地更新不同(找到元数据所在页并修改值),LSM-Tree 直接 append 写到磁盘,再同通过合并的方式取出冗余数据。

为了加快 key 的查询速度

  • 建立索引
  • 布隆过滤器(Bloom Filter):判断某个字符串一定不在该集合,若该字符串存在,可能有误差。
    • 原理:位图 + N 个哈希算法。key 经过 N 个哈希后,若对应的位图是 0,则 key 不存在
    • 场景限制:不支持删除 key,而 SST 本身不会被修改,所以可以使用。

SST 文件格式

  • Footer:程序启动位置,存储 IndexBlock 和 MetaIndexBlock 的位置
  • IndexBlock:存储 DataBlock 的位置
  • MetaIndexBlock:存储了过滤元数据、属性信息、压缩字典索引的位置
  • DataBlock:存储有序的数据记录
    在这里插入图片描述
引用论文:Cho M, Choi W, Park S H. A Study on WAF reduction and SST file size on RocksDB[C]. Proceedings of the Korea Information Processing Society Conference. Korea Information Processing Society, 2017: 709-712

2.4、BlockCache

背景:内核 page cache 不可定制。因此,用户可以在内存中指定 RocksDB 缓存块,传一个 Cache 对象给 RocksDB 实例。一个缓存对象可以在同一个进程的多个 RocksDB 实例之间共享。块缓存存储未压缩过的块,也可以设置块缓存去存储压缩后的块。

RocksDB 两种类型的缓存都通过分片来减轻锁冲突,容量被平均分配到每个分片,分片间不共享空间。默认情况下,每个缓存会被分成 64 个分片,每个分片至少 512 B。

默认情况下,索引和过滤块都在 BlockCache 外面存储,用户可以选择将它们缓存在 BlockCache 中;

  • LRUCache:基于 LRU 算法,lru 列表 + 哈希表。
  • ClockCache:基于 Clock 算法,clock 指针 + 环形列表 + 哈希表。

与 LRU 缓存比较,Clock 缓存有更好的锁粒度。LRU 缓存读取数据时,需要对所有分片加互斥锁,因为需要更新的 LRU 列表;而在 Clock 缓存上读取数据时,不需要申请该分片的互斥锁,只需要搜索并行的哈希表。只有在插入的时候需要每个分片的锁,锁粒度更小。因此,一定环境下,Clock 缓存性能更好。

3、读写流程

3.1、读取流程

  • 先读内存 memtable
  • 若不存在,读磁盘 SST
    在这里插入图片描述

SST 查找流程

  • FindFiles。从 SST 文件中查找,如果在 L0,那么每个文件都得读,因为 L0 不保证 key 不重叠;如果在更深的层,key 保证不重叠,每层只需要读一个 SST 文件即可。L1 开始,每层可以在内存中维护一个 SST 的有序区间索引,在索引上二分查找即可。
  • LoadIB + FBIB, index block是 SST block 的索引;FB, filter block 是一个布隆过滤器,可以快速排除 key 不在的情况,因此优先加载。
  • SearchIB。二分查找 index block,找到对应的 block
  • SearchFB。用布隆过滤器过滤,如果没有,则返回;
  • LoadDB。加载 block 到内存;
  • SearchDB。block 中继续二分查找;
  • ReadValue。找到 key 后读数据。若考虑 WiscKey KV 分离的情况,还需要去 vLog 中读取

3.2、写入流程

  • 写入磁盘 WAL 文件
  • 写入内存 memtable
  • memtable 大小达到阈值后,冻结成 immutable memtable。后续的写入交给新的 memtable 和 WAL
  • 后台 compaction 线程,将 immutable memtable 落盘成 level 0 的 SST,持久化后释放对应的 WAL
  • 若插入新的 SST 后,当前层 Li 的总文件大小超出阈值,会从 level i 挑出一个文件和 level i + 1 层的重叠文件合并,直到所有层的大小都小于阈值。合并过程中,保证 level 1 以后各 SST 的 key 不重叠

4、LSM-Tree 放大问题

4.1、放大问题

  • 读放大:描述物理读取的字节数相较于返回的字节数之比。RocksDB 读取操作需要分层依次查找,直到找到对应数据,该过程可能涉及多次 IO
  • 写放大:描述磁盘上存储的数据字节数相较于数据库包含的逻辑字节数之比。所有的写入操作都是顺序写,而不是就地更新,无效数据不会马上被清理掉。
  • 空间放大:描述实际写入磁盘的数据大小和程序要求写入的数据大小之比。为了减小读放大和空间放大,RocksDB 采用后台线程合并数据的方式来解决,但会造成对同一条数据多次写入磁盘

4.2、compaction

rocksdb 默认采用 leveled compaction(leveled & tiered)合并算法。compaction 操作会造成写放大,但会减少读放大,空间放大。

除 L0 外,其他层级不会出现重复数据。

  • leveled:每一层只有一个文件,且每一层文件大小是上一层的 10 倍
  • tiered:将文件分成拆分成大小相同的部分

将相邻层的重复数据进行合并。同时,也可以并行 compaction
在这里插入图片描述

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

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

相关文章

如何防止用户打开浏览器开发者工具?

大家好&#xff0c;我是前端西瓜哥。作为一名前端开发&#xff0c;在浏览一些网页时&#xff0c;有时会在意一些交互效果的实现&#xff0c;会打开开发者工具查看源码实现。 但有些网站做了防窥探处理&#xff0c;打开开发者工具后&#xff0c;会无法再正常进行网页的操作。 …

Jeston与Px4(四)

ROS控制PX4 上一节里我们已经将mavros和仿真gazebo搭建完毕&#xff0c;这一节将通过ros来实现对接PX4固件的目标 文章目录ROS控制PX41、搭建PX4开发固件环境1、搭建PX4开发固件环境 “永远不要使用sudo来修复权限问题&#xff0c;否则会带来更多的权限问题&#xff0c;需要重…

PMP项目管理引论介绍

目录1. 指南概述和目的1.1 项目管理标准1.2 道德与专业行为规范2 基本要素2.1 项目2.2 项目管理的重要性2.3 项目、项目集、项目组合以及运营管理之间的关系2.3.1 概述2.3.2. 项目组合与项目集管理2.3.3. 运营管理2.3.4. 组织级项目管理和战略2.3.5. 项目管理2.3.6. 运营管理与…

下载BSP并编译内核

前提&#xff1a;用到的开发板100ask_imx6ull 下载BSP 100ask_imx6ull 开发板的 BSP 都保存在 Git 站点上&#xff0c;通过 repo 命令进行统一管理。配置 repo git config --global user.email "user100ask.com" book100ask:~$ git config --global user.name &qu…

spring源码篇(3)——bean的加载和创建

spring-framework 版本&#xff1a;v5.3.19 文章目录bean的加载bean的创建总结getBean流程createBean流程doCreateBean流程bean的加载 beanFactory的genBean最常用的一个实现就是AbstractBeanFactory.getBean()。 以ApplicationContext为例&#xff0c;流程是: ApplicationCon…

01 C语言计算

C语言计算 1、变量 用途&#xff1a;需要存放输入的数据 定义格式&#xff1a;数据类型 变量名&#xff08;用于区分其他变量&#xff09; 变量名格式&#xff1a;只能由字母/下划线/数字构成&#xff0c;首位不能是数字&#xff1b;且变量名不能是标识符 **变量赋值和初始…

Python每日一练(20230305)

目录 1. 正则表达式匹配 ★★★ 2. 寻找旋转排序数组中的最小值 II ★★★ 3. 删除排序链表中的重复元素 II ★★ 1. 正则表达式匹配 给你一个字符串 s 和一个字符规律 p&#xff0c;请你来实现一个支持 . 和 * 的正则表达式匹配。 . 匹配任意单个字符* 匹配零个或多个…

格式化字符串之在栈上修改got表,执行system(“/bin/sh“)

题目自取&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1sZyC-d47cnrjQ0rmRNLbSg?pwdiung 提取码&#xff1a;iung 这是一题改got表的格式化字符串的例题 这里介绍下pwntools里的一个脚本 fmtstr_payload&#xff1a; 举个例子&#xff0c; payload fmtstr_payl…

谷歌浏览器被hao123网页(或其他网页)劫持了,怎么办?(已解决)

文章目录1、前言2、解决方案2.1、方案一&#xff1a;删除目标内容2.2、方案二&#xff1a;修改浏览器启动时内容2.3、方案三&#xff1a;重命名2.4、方案四&#xff1a;修改WMI脚本2.5、方案五&#xff1a;火绒修复3、总结1、前言 今天打开chrome浏览器&#xff0c;莫名转到hao…

【CMU15-445数据库】bustub Project #2:B+ Tree(下)

Project 2 最后一篇&#xff0c;讲解 B 树并发控制的实现。说实话一开始博主以为这块内容不会很难&#xff08;毕竟有 Project 1 一把大锁摆烂秒过的历史x&#xff09;&#xff0c;但实现起来才发现不用一把大锁真的极其痛苦&#xff0c;折腾了一周多才弄完。 本文分基础版算法…

【uni-app教程】八、UniAPP Vuex 状态管理

八、UniAPP Vuex 状态管理 概念 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态&#xff0c;并以相应的规则保证状态以一种可预测的方式发生变化。 应用场景 Vue多个组件之间需要共享数据或状态。 关键规则 State&#xff1a…

Linux系统配置nginx

下载安装包wget -c http://nginx.org/download/nginx-1.19.1.tar.gz安装gcc安装包yum install gcc-c安装pre-devel依赖库yum -y install pcre-devel安装openssl依赖库yum -y install openssl openssl-devel解压tar -zxvf 目录名 nginx-1.23.1.tar.gz -C 另外一个目录&#xff0…

QT配置安卓环境(保姆级教程)

目录 下载环境资源 JDK1.8 NDK SDK ​安装QT 配置环境 下载环境资源 JDK1.8 介绍JDK是Java开发的核心工具&#xff0c;为Java开发者提供了一套完整的开发环境&#xff0c;包括开发工具、类库和API等&#xff0c;使得开发者可以高效地编写、测试和运行Java应用程序。 下载…

基于Vue3和element-plus实现一个完整的登录功能

先看一下最终要实现的效果:登录页面:注册页面:(1)引入element-plus组件库引入组件库的方式有好多种,在这里我就在main.js全局引入了.npm i element-plus -Smain.js中代码:import { createApp } from "vue"; //element-plus import ElementPlus from "element-pl…

Linux基础篇(七)-- 用户管理

1 创建普通用户 1、创建用户 在 Linux 系统里&#xff0c;root 账户&#xff08;超级管理员&#xff09;拥有整个系统至高无上的权限&#xff0c;比如新建和添加用户。一般我们登录系统时都是以普通账户的身份登录的&#xff0c;要创建用户需要 root 权限&#xff0c;…

项目:手把手实现高并发内存池

一.前言&#xff08;一&#xff09;.项目简介高并发内存池&#xff08;ConCurrentMemoryPool&#xff09;&#xff0c;其原型是google的开源项目tcmalloc。全称是thread-cache-malloc&#xff0c;即线程缓存malloc。应用场景是多线程环境下管理内存&#xff0c;相较于malloc库函…

Mysql数据库的(超详细)安装及环境变量的配置

一、 下载MySQL Mysql官网下载地址&#xff1a;https://downloads.mysql.com/archives/installer/ 1. 选择需要的版本点击Download进行下载 本篇文章选择的8.0.26版本 二、 安装MySQL 1. 选择设置类型 双击运行mysql-installer-community-8.0.26.msi&#xff0c;这里选择是…

GoldenGate(OGG)高可用XAG介绍

XAG介绍: Oracle Grid Infrastructure提供了高可用组件去管理实现集群上面服务的高可用&#xff0c;Oracle Grid Infrastructure agent&#xff08;XAG&#xff09;是Oracle Grid Infrastructure的一个管理组件&#xff0c;通过接口AGCTL在Oracle RAC集群上为应用程序(GoldenG…

【14】linux命令每日分享——userdel删除账号

大家好&#xff0c;这里是sdust-vrlab&#xff0c;Linux是一种免费使用和自由传播的类UNIX操作系统&#xff0c;Linux的基本思想有两点&#xff1a;一切都是文件&#xff1b;每个文件都有确定的用途&#xff1b;linux涉及到IT行业的方方面面&#xff0c;在我们日常的学习中&…

Visual Studio 高级调试-企业版三大特性

前言前面两篇博客主要介绍了Visual Studio 高级调试-代码调试和Visual Studio 高级调试-Dump分析&#xff0c;这几篇博客的目的都是为了帮助大家更好的认识和使用Visual Studio&#xff0c;Visual Studio企业版订阅价格为每月250美元&#xff0c;很多同学想知道企业版有哪些特别…