Rocksdb的优劣及应用场景分析

 

Rocksdb的优劣及应用场景分析 

Rocksdb也是一样,也有它的优势劣势及特定的适用场景。今天我就从设计的角度来分析一下。

基础架构

       上图就是Rocksdb的基础架构。Rocksdb中引入了ColumnFamily(列族, CF)的概念,所谓列族也就是一系列kv组成的数据集。所有的读写操作都需要先指定列族。写操作先写WAL,再写memtable,memtable达到一定阈值后切换为Immutable Memtable,只能读不能写。后台Flush线程负责按照时间顺序将Immu Memtable刷盘,生成level0层的有序文件(SST)。后台合并线程负责将上层的SST合并生成下层的SST。Manifest负责记录系统某个时刻SST文件的视图,Current文件记录当前最新的Manifest文件名。  每个ColumnFamily有自己的Memtable, SST文件,所有ColumnFamily共享WAL、Current、Manifest文件。

架构分析

       整个系统的设计思路很好理解,这种设计的优势很明显,主要有以下几点:

      1.所有的刷盘操作都采用append方式,这种方式对磁盘和SSD是相当有诱惑力的;

      2.写操作写完WAL和Memtable就立即返回,写效率非常高。  

       3.由于最终的数据是存储在离散的SST中,SST文件的大小可以根据kv的大小自由配置,            因此很适合做变长存储。

      但是这种设计也带来了很多其他的问题:

       1.为了支持批量和事务以及上电恢复操作,WAL是多个CF共享的,导致了WAL的单线程写        模式,不能充分发挥高速设备的性能优势(这是相对介质讲,相对B树等其他结构还是有优        势);

       2.读写操作都需要对Memtable进行互斥访问,在多线程并发写及读写混合的场景下容易形        成瓶颈。

      3.由于Level0层的文件是按照时间顺序刷盘的,而不是根据key的范围做划分,所以导致各         个文件之间范围有重叠,再加上文件自上向下的合并,读的时候有可能需要查找level0层的          多个文件及其他层的文件,这也造成了很大的读放大。尤其是当纯随机写入后,读几乎是          要查询level0层的所有文件,导致了读操作的低效。

      4.针对第三点问题,Rocksdb中依据level0层文件的个数来做前台写流控及后台合并触发,          以此来平衡读写的性能。这又导致了性能抖动及不能发挥高速介质性能的问题。  

     5.合并流程难以控制,容易造成性能抖动及写放大。尤其是写放大问题,在笔者的使用过程中实际测试的写放大经常达到二十倍左右。这是不可接受的,当前我们也没有找到合适的解决办法,只是暂时采用大value分离存储的方式来将写放大尽量控制在小数据。

适用场景

       1.对写性能要求很高,同时有较大内存来缓存SST块以提供快速读的场景;

       2.SSD等对写放大比较敏感以及磁盘等对随机写比较敏感的场景;

      3.需要变长kv存储的场景;  

      4.小规模元数据的存取;

不适合场景

       1.大value的场景,需要做kv分离;

       2.大规模数据的存取



作者:从此启航
链接:https://www.jianshu.com/p/73fa1d4e4273
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/463202.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MOSS服务器场迁移1-有关切换登录用户时需要刷新一次才能成功的问题

在本次的MOSS服务器场的迁移过程中,发现当我们新建好一个网站,然后用一个用户名和密码登录进去后,此时一切都很美好,但是当我们用其他的用户登录(右上角的用其他的用户登录)时,发现输入新的用户…

AWR报告中Top 10 Foreground Events存在”reliable message”等待事件的处理办法

操作系统版本:HP-UNIX B.11.31 数据库版本:11.2.0.4 RAC (一) 问题概要 (1)在AWR报告的Top 10 Foreground Events中发现reliable message占用了较高的DB Time,如下: Top 10 Foregrou…

疯狂java学习笔记1023---线程的同步

同步代码块: 文件并发被访问时容易造成异常。 同步代码块语法格式: synchronized(obj) { ... //此处的代码就是同步代码块 } obj是同步监视器 线程开始执行同步代码块之前,必须先获得对同步监视器的锁定。 注:任何时…

C语言const易错点

const int a; int const a; 这两个写法是等同的,表示a是一个int常量。const int *a; 表示a是一个指针,可以任意指向int常量或者int变量,它总是把它所指向的目标当作一个int常量。也可以写成int const* a;含义相同。int * const a; 表示a是一个…

Postgre体系结构图

原文链接:https://blog.csdn.net/q936889811/article/details/83030845 由于工作原因需要调研postgre部分的缓存模块:分给pg的内存不足时,将内存中的数据写出到外部file或者其他的介质中,防止内存不足时,系统运行缓慢…

业界资讯:adobe 技术开发中心 放出游戏单元

昨天晚上光顾了adobe 技术者开发中心,发现一个新的东西。看到大大标题显示出这个部分的内容. 可以看出adobe 未来一个动作,对游戏支持。flash 平台迅速进行推广,目前来讲flex 技术应用在社区开发和网页游戏比较多,这部分能够对企业…

asp.net 开发注意的几点

WIN7中组件服务中的DCOM配置找不到Microsoft Excel应用程序的解决办法: 这主要是64位系统的问题,excel是32位的组件,所以在正常的系统组件服务里是看不到的 可以通过在运行里面输入 comexp.msc -32 来打开32位的组件服务,在里就能看到excel组…

ubuntu安装codeblock的方法

由于本人比较喜欢体积较小的IDE,不喜欢太多东西,运行很慢的VS,所以在windows下发现了很好用的codeblock,现在把它安装到ubuntu系统的方法写下来总体方法很简单,用的最简单的apt安装的,也可以去官网下载code…

200多个js技巧代码(五)

161.标题栏 document.title//162.背景图片 <body style"BACKGROUND-ATTACHMENT: fixed" background"img/bgfix.gif"></body>//背景图片不动<STYLE TYPE"text/css"> <!-- BODY {background-image:img/bgchild.jpg; backgrou…

ios 后台下载,断点续传总结

2018年12月05日 16:09:00 weixin_34101784 阅读数&#xff1a;5 https://blog.csdn.net/weixin_34101784/article/details/87569604 断点续传 demo demog.gif 断点续传的原理是在HTTP1.1协议&#xff08;RFC2616&#xff09;中定义了断点续传相关的HTTP头的Range和Content-Rang…

Spring.NET教程(二十)——整合Quartz.NET(应用篇)

Quartz.NET是一个开源的作业调度框架&#xff0c;是OpenSymphony 的 Quartz API的.NET移植&#xff0c;它用C#写成&#xff0c;可用于WinForm和ASP.NET应用中。它提供了巨大的灵活性而不牺牲简单性。你能够用它来为执行一个作业而创建简单的或复杂的调度。它有很多特征&#xf…

jsp与jspx文件

jspx文件 jspx&#xff1a;以xml语法来书写jsp的文件&#xff0c;自定义的映射类型, jspx jsp XML A JSP document is a JSP page written in XML syntax as opposed to the standard syntax described.Because it is written in XML syntax, a JSP document is also…

C++实现链表逆序打印、链表反转

//题目&#xff1a;C实现链表逆序打印、链表反转 // 如何将链表逆序&#xff0c;取决于题目的要求。如果面试官只要求打印&#xff0c;一般不改动链表结构为好&#xff0c;如果要求改变链表的方向&#xff0c;则需要改变结构&#xff0c;再顺序打印。 // 方法1&#xff1a;只逆…

vector深拷贝与浅拷贝使用总结

(1)、拷贝构造/赋值函数 --- 深拷贝 int w 100;int h 20;vector<int> dataA(w*h ,0Xff);vector<int> dataB dataA; // copy 构造int * ptr0 &dataA[0];int * ptr1 &dataB[0];printf("%u\n", ptr0);printf("%u\n", ptr1); 结果&…

JavaScript 对象和包装类

对象的创建方法 {}var obj {} 系统自带的构造函数var obj new Object()//Array()//Number() 自定义的构造函数function Person(){} var person1 new Person() 注&#xff1a;构造函数&#xff1a;大驼峰命名规则 TheFirstName 普通函数&#xff1a;小驼峰命名规则 the…

dll动态链接库

Visual C#生成DLL文件——预备知识 DLL&#xff08;Dynamic Link Library&#xff09;文件即动态链接库文件&#xff0c;是一种可执行文件&#xff0c;允许程序共享执行特殊任务所必需的代码和其他资源。多数情况下带有dll扩展名&#xff08;也可以 是.ocx文件&#xff1a;Acti…

C# OLE DB 的连接方式下 对 sql 参数的操作 需要改成 ? 号

C# OLE DB 的连接方式下 对 sql 参数的操作 需要改成 ? 号

ELF文件格式

ELF文件格式 ELF文件&#xff08;Executable Linkable Format&#xff09;是一种文件存储格式。Linux下的目标文件和可执行文件都按照该格式进行存储&#xff0c;有必要做个总结。 概要 本文主要记录总结32位的Intel x86平台下的ELF文件结构。ELF文件以Section的形式进行存储…

TCP协议的三次握手与四次挥手

tcp协议的三次握手和四次挥手 三次握手&#xff1a; 第一次握手&#xff1a; 客户端发起一个链接&#xff08;SYN&#xff09; 第二次握手&#xff1a; 服务端就会返回一条&#xff08;ACK&#xff09;确认信息&#xff0c;同时服务端也会向客户端发起一个链接请求&#xff08;…

晚上美容护肤10要诀 - 健康程序员,至尚生活!

夜晚美容护肤十要诀  如何护肤&#xff0c;我想谁也知道晚上是给予皮肤滋养的最佳时期&#xff0c;别以为早晚搽日霜、晚霜就能够令你的皮肤变得白雪雪、滑嘟嘟&#xff0c;其实这只是表面的滋润。要彻底护理&#xff0c;就要依赖你睡前的准备功夫&#xff0c;才能使肌肤得到…