rocksdb写放大_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.大规模数据的存取
rocksdb写放大_Rocksdb的优劣及应用场景分析相关推荐
- rocksdb写放大_rocksdb理解
rocksdb是在leveldb的基础上优化而得,解决了leveldb的一些问题. 主要的优化点 1.增加了column family,这样有利于多个不相关的数据集存储在同一个db中,因为不同colu ...
- Rocksdb的优劣及应用场景分析
Rocksdb的优劣及应用场景分析 Rocksdb也是一样,也有它的优势劣势及特定的适用场景.今天我就从设计的角度来分析一下. 基础架构 上图就是Rocksdb的基础架构.Rocksdb中引入了Col ...
- LSM 优化系列(六)-- 【ATC‘20】MatrixKV : NVM 的PMEM 在 LSM-tree的write stall和写放大上的优化
文章目录 LSM 问题背景 MatrixKV 设计细节 整体架构介绍 Matrix Container介绍 Receiver RowTable Compactor Space management C ...
- LSM-Tree 的写放大写放大、读放大、空间放大RockDB、leveldb 写放大简单分析参考文档
本文缺少实际的实践经验.全部来自在网上的"道听途说"和自己的"胡思乱想". 写放大.读放大.空间放大 基于 LSM-Tree 的存储系统越来越常见了,如 Roc ...
- 对于LSM Tree写放大问题的一些浅薄学习
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可. 本作品 (李兆龙 博文, 由 李兆龙 创作),由 李兆龙 确认,转载请注明版权. 文章目录 引言 性能评估 优化方案 ...
- Rocksdb 写流程,读流程,WAL文件,MANIFEST文件,ColumnFamily,Memtable,SST文件原理详解
文章目录 前言 Rocksdb写流程图 WAL 原理分析 概述 文件格式 查看WAL的工具 创建WAL 清理WAL MANIFEST原理分析 概述 查看MANIFEST的工具 创建 及 清除 MANI ...
- 关于SSD写放大问题
SSD写放大表现:SSD上实际写入的数据远远大于用户写入的数据 机械硬盘写入机制:可以覆盖写 固态硬盘写入机制:不能覆盖写,只能擦除之后再写 对于已存在数据的SSD,写入过程为: 1.擦除SSD上已有 ...
- 图片隐写 放大放大再放大_放大结论
图片隐写 放大放大再放大 重点 (Top highlight) A conversation about Zoom, security, and privacy in these times of s ...
- [css] 分析比较opacity: 0、visibility: hidden、display: none三者的优劣和适用场景
[css] 分析比较opacity: 0.visibility: hidden.display: none三者的优劣和适用场景 opacity 0: 单纯视觉效果,除了看不见,其他都正常. visib ...
最新文章
- 【模型蒸馏】从入门到放弃:深度学习中的模型蒸馏技术
- CNCF 沙箱项目 OCM Placement 多集群调度指南
- tcp接口测试工具_你不了解的,完整“接口测试”与服务虚拟化
- vue2实践揭秘pdf_《Vue2.0 实践揭秘》终于出版啦!
- C++之构造函数和析构函数强化
- 数据结构与算法分析c++第四版_数据结构与算法 - 时空复杂度分析
- pythonmatplotlib刷新_matplotlib:如何刷新figure.canvas
- CSS详解(一)——CSS基本原理
- hdu 4318 Power transmission 临接表 广搜 多校联合赛(二) 第九题
- java eclipse参考文献_2019-2020年java毕设论文参考文献.doc
- 数字电视复用器中的PCR矫正技术
- 深度学习教程(12) | CNN应用:目标检测(吴恩达·完整版)
- 报表工具对比选型系列用例——排名及跨行组统计
- html动态显示背景颜色,js动态修改背景颜色方法汇总
- HighNewTech:Gartner发布2023年十大战略技术趋势《Gartner Top 10 Strategic Technology Trends for 2023》翻译与解读
- bu zhi dao yao zen me zuo
- 垃圾邮件分类系统python_【Python】基于Bayes算法的垃圾邮件分类系统
- nvidia显卡驱动、cuda、cudnn、tensorflow对应版本
- CentOS 7 查询CPU、内存、磁盘的使用情况
- 百度统计工具是什么?百度统计工具有什么用呢?