0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Rocksdb原理简介

冬至子 来源:天翼云开发者社区 作者:l**n 2023-06-01 17:17 次阅读

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

image.png

涉及到的几个核心文件:

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。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • SST
    SST
    +关注

    关注

    0

    文章

    68

    浏览量

    34971
  • FLUSH
    +关注

    关注

    0

    文章

    4

    浏览量

    5401
收藏 人收藏

    评论

    相关推荐

    DAC简介

    文章目录一、DAC简介一、DAC简介
    发表于 08-09 08:18

    FPGA简介

    (06)FPGA资源评估1.1 目录1)目录2)FPGA简介3)Verilog HDL简介4)FPGA资源评估5)结语1.2 FPGA简介FPGA(Field Programmable Gate
    发表于 02-23 06:31

    NoOs简介

    NoOs文章目录NoOs简介代码目录API 说明移植快速上手更多示例License简介NoOs 名字的寓意取自于:“NoOs is not an operating system”。NoOs 的目标是提供类似RTOS的开发方式,代码量比.
    发表于 03-01 07:52

    基于全HDD aarch64服务器的Ceph性能调优实践总结

    1 简介作为一个统一的分布式存储系统,Ceph为应用程序提供了对象,块和文件系统接口。考虑到TCO,我们搭建了一个全HDD的Ceph集群(每个节点11个HDD + 1个SSD),它在存储利用率,性能
    发表于 07-05 14:26

    运放型号简介

    运放型号简介 CA3130 高
    发表于 04-17 20:34 1358次阅读

    运放型号简介

    运放型号简介
    发表于 06-30 19:21 2785次阅读

    手机简介

    手机简介
    发表于 12-19 10:27 555次阅读

    Windows CE简介、特点及应用

    Windows CE简介、特点及应用 一、Windows CE简介  
    发表于 01-11 08:43 3518次阅读

    ISE10.1使用简介

    ISE10.1使用简介 ISE10.1使用简介
    发表于 02-18 18:16 9次下载

    Proteus示波器简介

    Proteus 中示波器的操作 简介简介基于 proteus7.8 版本
    发表于 03-22 11:19 15次下载

    RocksDB】TransactionDB源码分析

    摘要: RocksDB版本:v5.13.4 1. 概述 得益于LSM-Tree结构,RocksDB所有的写入并非是update in-place,所以他支持起来事务的难度也相对较小,主要原理就是利用
    发表于 07-23 14:02 1830次阅读
    【<b class='flag-5'>RocksDB</b>】TransactionDB源码分析

    看图了解RocksDB

    的压力,临时空间占用大。一般多采用level合并的方式。每个level都有max大小,超出后会触发本level与下一level的文件合并到一起。不同level的合并是可以并发执行的。对rocksdb做个
    发表于 11-15 16:28 150次阅读
    看图了解<b class='flag-5'>RocksDB</b>

    POE简介

    POE简介
    发表于 11-01 08:27 0次下载
    POE<b class='flag-5'>简介</b>

    存储系统中的算法:LSM树设计原理

    通过学习相关资料,我发现 Apache BookKeeper 底层存储引擎用的是 Facebook 开源的 RocksDB,而 RocksDB 又是基于 Google 开源的 LevelDB 改造的,而 LevelDB 的核心是一个叫做 LSM 树(Log Structu
    的头像 发表于 11-03 11:32 644次阅读

    FST 简介

    FST 简介
    发表于 11-14 21:08 0次下载
    FST <b class='flag-5'>简介</b>