本文分享自天翼云开发者社区《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。

Rocksdb原理简介的更多相关文章

  1. storm 原理简介及单机版安装指南——详细版【转】

    storm 原理简介及单机版安装指南 本文翻译自: https://github.com/nathanmarz/storm/wiki/Tutorial 原文链接自:http://www.open-op ...

  2. Java进阶(二十四)Java List集合add与set方法原理简介

    Java List集合add与set方法原理简介 add方法 add方法用于向集合列表中添加对象. 语法1 用于在列表的尾部插入指定元素.如果List集合对象由于调用add方法而发生更改,则返回 tr ...

  3. kafka原理简介并且与RabbitMQ的选择

    kafka原理简介并且与RabbitMQ的选择 kafka原理简介,rabbitMQ介绍,大致说一下区别 Kafka是由LinkedIn开发的一个分布式的消息系统,使用Scala编写,它以可水平扩展和 ...

  4. InheritableThreadLocal类原理简介使用 父子线程传递数据详解 多线程中篇(十八)

      上一篇文章中对ThreadLocal进行了详尽的介绍,另外还有一个类: InheritableThreadLocal 他是ThreadLocal的子类,那么这个类又有什么作用呢?   测试代码 p ...

  5. Nginx 负载均衡原理简介与负载均衡配置详解

    Nginx负载均衡原理简介与负载均衡配置详解   by:授客  QQ:1033553122   测试环境 nginx-1.10.0 负载均衡原理 客户端向反向代理发送请求,接着反向代理根据某种负载机制 ...

  6. Nginx 反向代理工作原理简介与配置详解

    Nginx反向代理工作原理简介与配置详解   by:授客  QQ:1033553122   测试环境 CentOS 6.5-x86_64 nginx-1.10.0 下载地址:http://nginx. ...

  7. Linux DNS原理简介及配置

    Linux DNS原理简介及配置 DNS简介 DNS原理 域名解析的过程 资源记录 DNS BIND安装配置 一.简介 一般来讲域名比IP地址更加的有含义.也更容易记住,所以通常用户更习惯输入域名来访 ...

  8. Oracle Golden Gate原理简介

    Oracle Golden Gate原理简介 http://www.askoracle.org/oracle/HighAvailability/20140109953.html#6545406-tsi ...

  9. Linux SSH基于密钥交换的自动登陆原理简介及配置说明

    一.原理简介 SSH证书认证登录的基础是一对唯一匹配密钥: 私钥(private key)和公钥(public key).公钥用于对数据进行加密,而且只能用于加密.而私钥只能对使用所匹配的公钥,所加密 ...

  10. Socket通信原理简介

    Socket通信原理简介 字数1011 阅读1766 评论2 喜欢11 何谓socket 计算机,顾名思义即是用来做计算.因而也需要输入和输出,输入需要计算的条件,输出计算结果.这些输入输出可以抽象为 ...

随机推荐

  1. Android之JNI开发

    JNIJNI是Java Native Interface的缩写,俗称Java本地接口,是Java语言提供的用于Java和C/C++相互沟通的机制,Java可以通过JNI调用本地的C/C++代码,本地的 ...

  2. PHP之环境搭建(php7.4 + php8.1)

    之前写过几次,使用lnmp,宝塔,源码编译等方式来进行PHP环境的搭建, 随着接触的越来越多, 这里做一个总结, 常用的搭建方式 1.编译安装 之前写个几次,可以参考之前的 这次记录下多个版本PHP的 ...

  3. Tornado框架之应用安全(四)

    知识点 Cookie操作 安全Cookie 跨站请求伪造原理 XSRF保护 模板 请求体 HTTP报文头 用户验证 authenticated装饰器 get_current_user()方法 logi ...

  4. 使用SELECT…INTO OUTFILE导出文本文件

    ​MySQL数据库导出数据时,允许使用包含导出定义的SELECT语句进行数据的导出操作.该文件被创建到服务器主机上,因此必须拥有文件写入权限(FILE权限)才能使用此语法."SELECT.. ...

  5. Python绘制七段数码管字母:从理论到实践

    在现代电子显示技术中,七段数码管是一种广泛应用的显示器件,常用于显示数字.字母和一些特殊符号.其基本原理是通过控制七个发光段(a, b, c, d, e, f, g)的亮灭来形成不同的显示内容.本文将 ...

  6. 大咖论道|金融AI下一阶段的发展思考

    回顾过去十年,人工智能(AI)技术的发展速度让人惊叹,金融行业是现今AI应用最具潜力和最为活跃的领域之一.通过多年渗透,AI不间断从技术驱动迈向场景驱动,已广泛与金融业务深度融合,衍生出众多新业态.新 ...

  7. 【人工智能】【Python】Numpy基础

    Numpy 目录 Numpy Numpy简介 ndarray与原生Python List运算效率对比 N阶数组 ndarray (1)创建数组 (2)生成数组 生成纯1数组 生成纯0数组 从现有数组生 ...

  8. 深入理解二叉查找树(BST)的重要查找操作

    二叉查找树 (Binary Search Tree, 简称 BST) 是一种基本的数据结构,其设计核心在于每个节点的值都满足以下性质: 左子树的所有节点值均小于当前节点值. 右子树的所有节点值均大于当 ...

  9. sed 指定行后或行前插入

    sed 功能非常强大,这里主要列出一些工作中常用到的举例,以后再追加 示例文本 example.cfg Config = { a = 1, b = 1024, c = { ErrLevel = 4, ...

  10. Python 在Excel单元格中应用数据条

    在Excel中添加数据条是一种数据可视化技巧,它通过条形图的形式在单元格内直观展示数值的大小,尤其适合比较同一列或行中各个单元格的数值.这种表示方式可以让大量的数字信息一目了然.本文将介绍如何使用Py ...