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
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Rocksdb的优劣及应用场景分析相关推荐

  1. rocksdb写放大_Rocksdb的优劣及应用场景分析

    研究Rocksdb已经有七个月的时间了,这期间阅读了它的大部分代码,对底层存储引擎进行了适配,同时也做了大量的测试.在正式研究之前由于对其在本地存储引擎这个江湖地位的膜拜,把它想象的很完美,深入摸索之 ...

  2. [css] 分析比较opacity: 0、visibility: hidden、display: none三者的优劣和适用场景

    [css] 分析比较opacity: 0.visibility: hidden.display: none三者的优劣和适用场景 opacity 0: 单纯视觉效果,除了看不见,其他都正常. visib ...

  3. mysql表分区占用存储_MySQL 分区分表应用场景分析和分区中可能遇到的坑点

    MySQL的分区和分表应用场景分析 在日常工作中当我们的某张表的数据量过大的时候,首当其冲的可能就是进行分区和分表,但是是如何分区或者分表都要结合一点的业务场景下进行分析,才会显著的提升性能,来聊一聊 ...

  4. 如何调整按钮里的文字的位置android_UI设计中按钮场景分析

    别无他话,今天就和大家聊一聊设计宿敌--按钮设计.按钮的设计看似简单,其实按钮的功能不同,设计形式上也会有差异,今天我就针对按钮的场景分析,对按钮进行全面的解析. 按照功能性分类,按钮主要包括行为召唤 ...

  5. 电商抢购秒杀系统的设计_1_应用场景分析

    2019独角兽企业重金招聘Python工程师标准>>> 电商抢购秒杀系统的设计_1_应用场景分析 概述 所谓知已知彼,百战不殆,在开始详细介绍实战中的抢购秒杀系统时,我们了解一些抢购 ...

  6. spring bean scope作用域及多线程安全问题场景分析

    2019独角兽企业重金招聘Python工程师标准>>> Scope作用域 在 Spring IoC 容器中具有以下几种作用域: singleton:单例模式,在整个Spring Io ...

  7. mysql 事务 查询 范围加锁_MySQL死锁系列-常见加锁场景分析

    本文我们就从原理走向实战,分析常见 SQL 语句的加锁场景.了解了这几种场景,相信小伙伴们也能举一反三,灵活地分析真实开发过程中遇到的加锁问题. 如下图所示,数据库的隔离等级,SQL 语句和当前数据库 ...

  8. mysql常见死锁_MySQL死锁系列-常见加锁场景分析

    如下图所示,数据库的隔离等级,SQL 语句和当前数据库数据会共同影响该条 SQL 执行时数据库生成的锁模式,锁类型和锁数量. 下面,我们会首先讲解一下隔离等级.不同 SQL 语句 和 当前数据库数据对 ...

  9. 高并发编程-Daemon Thread的创建以及使用场景分析

    文章目录 官方文档 Daemon Thread VS User Thread Daemon thread的特点 方法 void setDaemon(boolean status) boolean is ...

最新文章

  1. 中秋节,送上一次非常有趣的SQL优化实战经历
  2. 阿米洛键盘取消win_【机械键盘】2020年双十二那些值得购买的机械键盘推荐
  3. python中return和and连用
  4. 修改Advance Template Jsp模板的编码格式
  5. 各种数据库连接的总结
  6. 【AI视野·今日CV 计算机视觉论文速览 第164期】Fri, 18 Oct 2019
  7. 用汉堡包的方式评价一下自己的合作伙伴
  8. 【知识点】长文超详讲解深度学习中你总是掌握不牢的若干知识点
  9. PIE SDK专题制图切换模板
  10. 泛函编程(7)-数据结构-List-折叠算法
  11. 算法:全一子串的数量 或 全零子串的数量 1513. Number of Substrings With Only 1s
  12. 2015年热恋的肉肉们
  13. 2015年度APP分类
  14. canvas改变图片原始尺寸
  15. 桌面图标背景色解决方案
  16. php红包退回通知,php红包
  17. 弘扬企业家精神!闪马智能创始人兼CEO彭垚再获殊荣
  18. android获取imei需要read_phone_state吗,Firemonkey android read_phone_state运行时权限要求获取IMEI...
  19. 【爬树合集】难啃的骨头——红黑树
  20. 细谈证券从业资格考试, 证券从业资格考试网

热门文章

  1. 【原】iOS:手把手教你发布代码到CocoaPods(Trunk方式)
  2. CodePlex关闭,建议迁移至GitHub
  3. 教程-Delphi第三方控件安装卸载指南
  4. pyecharts对于经纬度_一文带你掌握Pyecharts地理数据可视化的方法
  5. redis 队列_Redis与Rabbitmq消息队列的区别
  6. Flask 离线脚本
  7. 机器学习算法之生成树
  8. linux 命令 which whereis whatis locate find
  9. go kegg_工具篇丨GO和KEGG富集不到通路?快试试这个超赞的功能分析工具吧
  10. Python - Django - 中间件 process_exception