写点什么

Rocksdb 原理简介

  • 2023-05-25
    北京
  • 本文字数:1392 字

    阅读完需:约 5 分钟

本文分享自天翼云开发者社区《Rocksdb原理简介》,作者:l****n

 

Rocksdb 作为当下 nosql 中性能的代表被各个存储组件(mysql、tikv、pmdk、bluestore)作为存储引擎底座,其基于 LSM tree 的核心存储结构(将随机写通过数据结构转化为顺序写)来提供高性能的写吞吐时保证了读性能。同时大量的并发性配置来降低 compaction 的影响。



涉及到的几个核心文件:


WAL

WriteAheadLog,rocksdb 的日志,保存 memtable 中的信息。当 memtable 转化为 immutable memtable 并且 Flush 到 L0 层之后,之前 WAL 的会被清理,即于删除 DB 目录下的 log 文件。

在 RocksDB 中每一次数据的更新都会涉及到两个结构,一个是内存中的 memtable(后续会刷新到磁盘成为 SST),第二个是 WAL。

WAL 主要的功能是当 RocksDB 异常退出后,能够恢复出错前的内存中(memtable)数据,因此 RocksDB 默认是每次用户写都会刷新数据到 WAL。每次当当前 WAL 对应的内存数据(memtable)刷新到磁盘之后,都会新建一个 WAL。

所有的 WAL 文件都是保存在 WAL 目录(options.wal_dir),为了保证数据的状态,所有的 WAL 文件的名字都是按照顺序的(log_number)。


MANIFEST

在 RocksDB 中 MANIFEST 保存了存储引擎的内部的一些状态元数据,简单来说当系统异常重启,或者程序异常被退出之后,RocksDB 需要有一种机制能够恢复到一个一致性的状态, 而这个一致性的状态就是靠 MANIFEST 来保证的.

MANIFEST 在 RocksDB 中是一个单独的文件,而这个文件所保存的数据基本是来自于 VersionEdit 这个结构.

MANIFEST 包含了两个文件,一个 log 文件一个包含最新 MANIFEST 文件名的文件,Manifest 的 log 文件名是这样 MANIFEST-(seq number),这个 seq 会一直增长.只有当 超过了指定的大小之后,MANIFEST 会刷新一个新的文件,当新的文件刷新到磁盘(并且文件名更新)之后,老的文件会被删除掉。这里可以认为每一次 MANIFEST 的更新都代表一次 snapshot。


CURRENT

记录当前最新的 MANIFEST 文件编号


Memtable

常驻于内存中,在 WAL 写之后,记录具体的 key-value 数据。在 RocksDB 中,每个 ColumnFamily 都有自己的 Memtable,Column Family 之间互不影响。而在 RocksDB 中 Memtable 有多种实现,SkipList/HashSkipList/HashLinkList/Vector,默认的实现为 SkipList(只有 skiplist 可以并发插入)。memtable 大小以及个数可以由指定的参数进行控制:

write_buffer_size 表示 memtable 的大小

max_write_buffer_number 表示内存中最多可以同时存在多少个 memtable 的个数


Immutable memtable

当 memtable 被写满之后会生成一个新的 memtable 继续接受 IO,旧的 memtable 就会变成 immutable memtable,为只读的状态,且开始由后台线程 Flush 到磁盘的 L0 层 sst。


SST

核心 key-value 的存储文件,比如 DB 目录下的 000023.sst 文件。默认分为 L0~L7 层,当满足一定条件时(本层 sst 总大小超过配置大小、WAL 文件超过一定值)后台开启 compaction 任务,从当前层和下一层选取若干 sst,做合并,并写入新的 sst 文件。


CcolumnFamily

RocksDB 3.0 中加入了 Column Family 特性,加入这个特性之后,每一个 KV 对都会关联一个 Column Family,其中默认的 Column Family 是 "default"。Column Family 主要是提供给 RocksDB 一个逻辑的分区。从实现上来看不同的 Column Family 共享 WAL,而都有自己的 memtable 和 SST,同时拥有自己的配置。这就意味着我们可以快速方便的设置不同的属性的 Column Family 以及快速删除对应的 Column Family。但是因为 Column Family 共享 WAL,可能会咬住 WAL,让 WAL 快速增长从而触发 memtable 的强制 Flush。

 

用户头像

还未添加个人签名 2022-02-22 加入

天翼云是中国电信倾力打造的云服务品牌,致力于成为领先的云计算服务提供商。提供云主机、CDN、云电脑、大数据及AI等全线产品和场景化解决方案。

评论

发布
暂无评论
Rocksdb原理简介_存储_天翼云开发者社区_InfoQ写作社区