知识图谱初探- RocksDB存储结构
Posted fengye_ls2022
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识图谱初探- RocksDB存储结构相关的知识,希望对你有一定的参考价值。
前面有说neo4j的底层存储,现在我们再来看看另一个图数据库Nebula ,其底层存储用的 RocksDB。
RocksDB的数据写入过程:
写入步骤:
- 写入WAL(write ahead log),用来保证异常时的数据一致性。Rocksdb所在节点出现断电异常,节点死机 等情况,内存中的数据是会丢失的。WAL机制,能够在这种异常情况下尽可能挽回多的数据。
- 数据写入缓存,先保存入Memtable
- Memtable达到一定阈值,会切换为Immutable Memtable
- 后台进程对Immutable Memtable刷盘,生成Level 0 SST文件
- 后台进程将L0-SST文件合并生成下层SST文件
Memtable结构
Memtable默认实现是SkipList ,有序的跳跃表(类似链表,在单链表之上增加多层索引增加查找性能)结构,其基本结构单元如下:
class Node // LevelDB SkipList
const Key key_;
std::atomic<Node*> next_[1];
class Node // RocksDB InlineSkipList
std::atomic<Node*> next_[1];
如图看到其内存结构:
再来看SkipList本身结构
class SkipList
struct Node;
Node* const head_;
std::atomic<int> max_height_;
Node** prev_;
int32_t prev_height_;
class InlineSkipList
struct Node;
struct Splice;
Node* const head_;
std::atomic<int> max_height_;
Splice* seq_splice_;
struct Splice
int height_ = 0;
Node** prev_;
Node** next_;
;
InlineSkipList 多了seq_splice_,少了prev_数组,移动到Splice里面。
Splice里面的prev和next数组用来存储插入key的时候的前缀和后缀,从最高层向下比较,可以有效减少比较范围
SSTable结构
Hbase底层硬盘存储即基于SSTable结构,SST是Sorted String Table的简写
如图:
- Footer存储IndexBlock和MetaIndexBlock的位置,存储于SST文件末尾,占用48byte
- MetaIndexBlock存储MetaBlock的位置
- MetaBlock存储布隆过滤器的数据,占多个block
- IndexBlock存储DataBlock的位置
布隆过滤器Bloom Filter的作用是对于任意集合的key,基于BitMap可以用来构建一个bit数组的算法。给出任意key,这个bit数组可以用于决定这个key是不是可能存在或者绝对不存在于这个key集合,用来减少无用的查询次数,从而加快查询的速度。
以上是关于知识图谱初探- RocksDB存储结构的主要内容,如果未能解决你的问题,请参考以下文章