研究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.大规模数据的存取

rocksdb写放大_Rocksdb的优劣及应用场景分析相关推荐

  1. rocksdb写放大_rocksdb理解

    rocksdb是在leveldb的基础上优化而得,解决了leveldb的一些问题. 主要的优化点 1.增加了column family,这样有利于多个不相关的数据集存储在同一个db中,因为不同colu ...

  2. Rocksdb的优劣及应用场景分析

    Rocksdb的优劣及应用场景分析 Rocksdb也是一样,也有它的优势劣势及特定的适用场景.今天我就从设计的角度来分析一下. 基础架构 上图就是Rocksdb的基础架构.Rocksdb中引入了Col ...

  3. LSM 优化系列(六)-- 【ATC‘20】MatrixKV : NVM 的PMEM 在 LSM-tree的write stall和写放大上的优化

    文章目录 LSM 问题背景 MatrixKV 设计细节 整体架构介绍 Matrix Container介绍 Receiver RowTable Compactor Space management C ...

  4. LSM-Tree 的写放大写放大、读放大、空间放大RockDB、leveldb 写放大简单分析参考文档

    本文缺少实际的实践经验.全部来自在网上的"道听途说"和自己的"胡思乱想". 写放大.读放大.空间放大 基于 LSM-Tree 的存储系统越来越常见了,如 Roc ...

  5. 对于LSM Tree写放大问题的一些浅薄学习

    本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可. 本作品 (李兆龙 博文, 由 李兆龙 创作),由 李兆龙 确认,转载请注明版权. 文章目录 引言 性能评估 优化方案 ...

  6. Rocksdb 写流程,读流程,WAL文件,MANIFEST文件,ColumnFamily,Memtable,SST文件原理详解

    文章目录 前言 Rocksdb写流程图 WAL 原理分析 概述 文件格式 查看WAL的工具 创建WAL 清理WAL MANIFEST原理分析 概述 查看MANIFEST的工具 创建 及 清除 MANI ...

  7. 关于SSD写放大问题

    SSD写放大表现:SSD上实际写入的数据远远大于用户写入的数据 机械硬盘写入机制:可以覆盖写 固态硬盘写入机制:不能覆盖写,只能擦除之后再写 对于已存在数据的SSD,写入过程为: 1.擦除SSD上已有 ...

  8. 图片隐写 放大放大再放大_放大结论

    图片隐写 放大放大再放大 重点 (Top highlight) A conversation about Zoom, security, and privacy in these times of s ...

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

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

最新文章

  1. 【模型蒸馏】从入门到放弃:深度学习中的模型蒸馏技术
  2. CNCF 沙箱项目 OCM Placement 多集群调度指南
  3. tcp接口测试工具_你不了解的,完整“接口测试”与服务虚拟化
  4. vue2实践揭秘pdf_《Vue2.0 实践揭秘》终于出版啦!
  5. C++之构造函数和析构函数强化
  6. 数据结构与算法分析c++第四版_数据结构与算法 - 时空复杂度分析
  7. pythonmatplotlib刷新_matplotlib:如何刷新figure.canvas
  8. CSS详解(一)——CSS基本原理
  9. hdu 4318 Power transmission 临接表 广搜 多校联合赛(二) 第九题
  10. java eclipse参考文献_2019-2020年java毕设论文参考文献.doc
  11. 数字电视复用器中的PCR矫正技术
  12. 深度学习教程(12) | CNN应用:目标检测(吴恩达·完整版)
  13. 报表工具对比选型系列用例——排名及跨行组统计
  14. html动态显示背景颜色,js动态修改背景颜色方法汇总
  15. HighNewTech:Gartner发布2023年十大战略技术趋势《Gartner Top 10 Strategic Technology Trends for 2023》翻译与解读
  16. bu zhi dao yao zen me zuo
  17. 垃圾邮件分类系统python_【Python】基于Bayes算法的垃圾邮件分类系统
  18. nvidia显卡驱动、cuda、cudnn、tensorflow对应版本
  19. CentOS 7 查询CPU、内存、磁盘的使用情况
  20. 百度统计工具是什么?百度统计工具有什么用呢?

热门文章

  1. gulp前端构建化工具,帮你搞定不同浏览器的兼容性写法问题
  2. MySQL监控系统Lepus的搭建
  3. Androidclient与服务端交互之登陆演示样例
  4. Taylor Swift -《Fearless》
  5. iOS 项目经验以及APP上架流程 _Dylan
  6. Java开发人员必备的7大技能,每一个都必不可少
  7. Docker安装mysql8
  8. php-URL方法下载远程图片
  9. 【bzoj4195】[Noi2015]程序自动分析 离散化+并查集
  10. 利用python去除红章