研究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. TYPESDK手游聚合SDK服务端设计思路与架构之一:应用场景分析

    TYPESDK 服务端设计思路与架构之一:应用场景分析 作为一个渠道SDK统一接入框架,TYPESDK从一开始,所面对的需求场景就是多款游戏,通过一个统一的SDK服务端,能够同时接入几十个甚至几百个各 ...

  2. Oracle dbms_lock.sleep()存储过程使用技巧-场景-分析-实例

    <Oracle dbms_lock.sleep()存储过程使用技巧>-场景-分析-实例 摘要:今天是2014年3月10日,北京,雾霾,下午组织相关部门开会.会议的结尾一名开发工程师找到了我 ...

  3. 理解 python metaclass使用技巧与应用场景分析

    理解python metaclass使用技巧与应用场景分析       参考: decorator与metaclass:http://jfine-python-classes.readthedocs. ...

  4. 数据结构之链表C语言实现以及使用场景分析

    牢骚:本篇博客两个星期前已经存为草稿,鉴于发生一些糟糕的事情,今天才基本完成.本人6月份应届毕业生一枚,毕业后当天来到帝都,之后也非常顺利,面试了俩家公司都成功了.一家做C++方面电商ERP,一家做w ...

  5. mariadb 10 多源复制(Multi-source replication) 业务使用场景分析,及使用方法

    mariadb 10 多源复制(Multi-source replication) 业务使用场景分析,及使用方法 官方mysql一个slave只能对应一个master,mariadb 10开始支持多源 ...

  6. ThreadLocal的理解与应用场景分析

    对于Java ThreadLocal的理解与应用场景分析 一.对ThreadLocal理解 ThreadLocal提供一个方便的方式,可以根据不同的线程存放一些不同的特征属性,可以方便的在线程中进行存 ...

  7. Java 常用List集合使用场景分析

    Java 常用List集合使用场景分析 过年前的最后一篇,本章通过介绍ArrayList,LinkedList,Vector,CopyOnWriteArrayList 底层实现原理和四个集合的区别.让 ...

  8. 068——VUE中vuex的使用场景分析与state购物车实例

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. EasyNVR智能云终端硬件使用场景分析:如何实现软硬一体的视频上云整体解决方案

    背景分析 在于众多的客户交流中,经常会被客户问到,"EasyNVR到底是软件还是硬件?"."EasyNVR能否出一个硬件的版本,摆脱自建服务器的压力?".&qu ...

  10. 关于SQL数据库 msdb.dbo.sp_send_dbmail 函数发送邮件的场景分析

    关于SQL数据库 msdb.dbo.sp_send_dbmail 函数发送邮件的场景分析 在推行系统中,时不时会有用户提出希望系统能自动推送邮件,由于手头的工具和能力有限,不少需求都借助于sql se ...

随机推荐

  1. Linux的发行版及其描述

    Linux的十种发行版及其描述 linux其中十种发行版本为Debian.Gentoo.Ubuntu.Damn Vulnerable Linux.红帽企业级Linux. CentOS.Fedora.K ...

  2. 基于FPGA的数字钟设计---第三版---郝旭帅电子设计团队

    本篇为各位朋友介绍基于FPGA的数字钟设计---第三版. 功能说明: 在数码管上面显示时分秒(共计六个数码管,前两个显示小时:中间两个显示分钟:最后两个显示秒). 利用按键可以切换24/12小时制(默 ...

  3. Navicat 携手华为云GaussDB,联合打造便捷高效的数据库开发和建模工具方案

    本文分享自华为云社区<Navicat 携手华为云GaussDB,联合打造便捷高效的数据库开发和建模工具方案>,作者: GaussDB 数据库 . 近日, Navicat Premium顺利 ...

  4. 【好书推荐】《Python黑魔法指南》-附高清PDF版

    摘要:<Python 黑魔法手册.pdf >作者(明哥)是一个从事云计算多年的 Python 重度用户,它把自已多年的 Python 编码经验整理成小册子,没有长篇大论,半天就能全能掌握, ...

  5. 实践案例丨云连接CC实现跨区域多VPC与线下IDC Server互联

    摘要:用实践案例带你掌握云连接CC如何实现跨区域多VPC与线下IDC Server互联. [背景] 当前在华为云华南.华东.香港region均部署了业务,同时在华南region通过云专线与线下IDC打 ...

  6. 全量通过,华为云GaussDB首批完成信通院全密态数据库评测

    摘要:100%全量通过!基于全栈创新计算架构的全密态数据库华为云GaussDB,完成了中国信通院组织的首批"全密态数据库"产品能力评测. 本文分享自华为云社区<全量通过!华为 ...

  7. 十八般武艺玩转GaussDB(DWS)性能调优:Plan hint运用

    摘要:本文介绍GaussDB(DWS)另一种可以人工干预计划生成的功能--plan hint. 前言 数据库的使用者在书写SQL语句时,会根据自己已知的情况尽力写出性能很高的SQL语句.但是当需要写大 ...

  8. Scala Http请求工具类

    import java.io.IOException import java.util import org.apache.http.client.ClientProtocolException im ...

  9. sqlalchemy 查询已存在表(无model定义)

    已存在的表信息如下,该表不是由sqlalchemy创建.想要对该表做CRUD,可以通过sqlalchemy提供的一个解析方法完成. 示例代码: from sqlalchemy import creat ...

  10. windows使用rclone挂载alist为本地磁盘,设置开机自启

    前言 实现在windows下将alist挂载为本地磁盘,并设置开机自启,使得重启后依然生效. 教程 下载软件 Rclone: Rclone downloads WinFsp: https://winf ...