RocksDB笔记 -- 整体架构

news/2024/11/22 10:28:46/

RocksDB是由Facebook开发的存储引擎, 它最初的目标是用于快速存储, 特别是Flash存储. 一个基于C++开发keys-values存储引擎库.

整体架构

RocksDB由这三个基本结构组成: memtable, sstfile 和 logfile. 其中:

  1. memtable是一个内存数据结构, 新的写入会插入到memtable中, 同时可选择性地写入到logfile中.
  2. logfile是一种顺序写入文件(sequentially-written).
  3. 当所有的memtable都被写满后, memtable里面的数据将会转存储到一个sstfile文件中.并且相关的logfile将会安全删除. (将内存数据安全存储到文件上)
  4. 在sstfile中的数据将会通过排序方式存储以方便相关键值.

MemTable

默认memtable是基于跳表实现的.
新的写入会插入数据到memtable, 一旦memtable被写满将会变为immutable并且被新的memtable替换. 之后会将该memetable的内容刷新(flush)到一个SSTfile文件中, 当内容都刷新到SSTfile后该memtable将会被销毁(destroyed).

一些影响memtable的选项(opions):

  1. AdvancedColumnFamilyOptions::memtable_factory: memtable的工厂对象. 通过特殊化工厂对象能够改变memtable的实现, 并且提供实现特殊化的选项(specific options) [默认: SkipListFactory]
  2. ColumnFamilyOptions::write_buffer_size: 单个memtable的大小(默认: 64MB)
  3. DBOptions::db_write_buffer_size: 将整个memtables写入列组. 通过memtables管理整个内存空间(默认: 0 (Disabled).
  4. DBOptions::write_buffer_manager: 用户可以提供他们自己的写入缓存管理俩控制整个memtable的内存使用情况. 覆盖db_write_buffer_size操作. (默认: nullptr)
  5. AdvancedColumnFamilyOptions::max_write_buffer_number: 在memtables刷新到SST files之前, 在内存中设置memtables的最大数量. (默认: 2)
  6. AdvancedColumnFamilyOptions::max_write_buffer_size_to_maintain: 以字节形式在内存中存储写入历史的总数. 包括: 当前memtable的大小, 密封但未刷新的memtables 以及 保留刷新过的memtables. Tips: RocksDB will try to keep at least this much history in memory - if dropping a flushed memtable would result in history falling below this threshold, it would not be dropped. (默认: 0)

Skiplist MemTable

基于跳表的memtable一般能够拥有兼具读写, 随机访问以及顺序扫描的较好性能. 
Tips: it provides some other useful features that other memtable implementations don’t currently support, like Concurrent Insert and  Insert with Hint.

HashSkiplist MemTable

哈希跳表以哈希表的形式组织数据, 另外每个哈希桶都是一个跳表. 另外这每个哈希桶作为排序过的单链表 (为了减少查询时的比较次数). 还有一种好的使用方法是结合上述数据结构并且通过使用PlainTable SST格式以及在RAMFS存储数据的方式.

当要查询或者插入某个键时, 使用目标键的前缀选项检索. prefix_extractor常常被用来查找哈希桶. 在哈希桶中, 所有比较都是用键来完成的.

然而, 这种基于哈希的memtables在扫描多个需要复制和排序的前缀时会比较慢并且消耗更多内存.

Flush

以下情况会在memtable刷新时被触发:

  1. 在写入后, memtable的大小超过了ColumnFamilyOptions::write_buffer_size设置的大小
  2. 所有通过整个列组的memtable大小超过了DBOtptions::db_write_buffer_size设置的大小  或者 DBOptions::write_buffer_manager 发起一个刷新信号. 这两种情况下最大的memtable将会被刷新.
  3. 整个WAL文件的大小超过了DBOptions::max_total_wal_size设置的大小. 这种情况下, 保存最久数据的memtable会被刷新, 这是为了能够清除来自这些memtable的WAL 文件数据.

以上情况会在memtable没写满之前执行刷新. 之所以要这样做是因为生成的SST文件一般要比相关的memtable小. 另外就是压缩问题, 在memtable中的数据是未经压缩的数据, 这也是为什么memtable要比SST文件大的原因.

SST File

这个文件的格式是基于块表的(BlockBasedTable)
格式如下所示:

<beginning_of_file>
[data block 1]
[data block 2]
…
[data block N]
[meta block 1: filter block]                  (see section: “filter” Meta Block)
[meta block 2: index block]
[meta block 3: compression dictionary block]  (see section: “compression dictionary” Meta Block)
[meta block 4: range deletion block]          (see section: “range deletion” Meta Block)
[meta block 5: stats block]                   (see section: “properties” Meta Block)
…
[meta block K: future extended block]  (we may add more meta blocks in the future)
[metaindex block]
[Footer]                               (fixed size; starts at file_size - sizeof(Footer))
<end_of_file>

该文件包含一个名叫BlockHandles的内部指针, 它的结构如下所示:

offset:         varint64
size:           varint64

关于SST file的更多细节我会专门写一篇博客说明, 关于它的内容今天就简要说明一下. 
 

参考:

RocksDB Overview · facebook/rocksdb Wiki · GitHub
MemTable · facebook/rocksdb Wiki · GitHub
Rocksdb BlockBasedTable Format · facebook/rocksdb Wiki · GitHub
 


http://www.ppmy.cn/news/146132.html

相关文章

bing必应壁纸下载器

自己写的一个简单的必应壁纸获取工具&#xff0c;可以自动获取必应壁纸并设置为桌面。 界面如图 下载地址 https://wjk.lanzous.com/ibf8xyb

大写数字时钟电脑壁纸下载

壁纸名称&#xff1a;冷高轮时间 壁纸样式&#xff1a;梵高数字动态时钟&#xff0c;王思聪吃热狗数字动态时钟&#xff0c;手势数字动态时钟&#xff0c;大写数字动态时钟&#xff0c;中文汉字动态时钟&#xff0c;麻将数字动态时钟&#xff0c;扑克数字动态时钟 电脑壁纸下…

HarmonyOS | 鸿蒙系统内置原生壁纸下载

点击上方蓝字 关注后回复 壁纸 获取所有精美壁纸 下载方式 长按二维码关注 逆锋起笔 回复【壁纸】立刻获取高清壁纸

iOS 15 内置原生壁纸下载

iOS 15 2048PX x 2048PX 下载方式 长按二维码关注 逆锋起笔 回复【壁纸】立刻获取高清壁纸

苹果 iPhone 13 内置原生壁纸下载

下载方式 长按二维码关注 逆锋起笔 回复【壁纸】立刻获取高清壁纸 iOS 15 内置原生壁纸下载 macOS 12 内置原生壁纸下载 Windows 10 最新版壁纸下载 17 张程序员壁纸&#xff08;使用频率很高&#xff09; 华为 MatePad 系列&#xff1a;绝版精美壁纸一套 今日福利 赠送如下书籍…

下载王者壁纸

王者英雄都非常绚丽夺目&#xff0c;下面就是爬取壁纸的源码&#xff1a; ​ ​ import requests import os import json from lxml import etree from fake_useragent import UserAgent import logginglogging.basicConfig(levellogging.INFO, format%(asctime)s - %(levelna…

win10 聚焦每日壁纸 Bing每日壁纸 下载

给大家推荐一个获取win10 聚焦每日壁纸 Bing每日壁纸的方法&#xff0c;遇到喜欢的壁纸终于可以马上下载了 方法&#xff1a; 到 Microsoft Store 软件商城&#xff0c;搜索 Dynamic theme 下载即可 软件极简风&#xff0c;与win10设置界面相似&#xff0c;使用简单&#…

苹果电脑壁纸打包下载,macbook自带壁纸下载

Mac Book自带壁纸原图下载&#xff08;100张&#xff09; 访问密码&#xff1a;206902