数据写入方式
1.  update-in-place原地更新
2.  append-only btree/copy on write tree顺序文件末尾追加
 
数据被按照特定方式放置,提升读性能,但写性能下降,对b+树和hash更新时需要随机读写:
1. 二分查找,将文件数据有序保存,使用二分查找来完成指定key的查找
2. 哈希,用哈希将数据分割为不同的bucket
3. B+树,减少外部文件的读取
4. 外部文件,将数据保存为日志,并创建一个hash或者查找树映射相应的文件
 

存储结构(磁盘因为寻道等因素,顺序读取比随机读取块N个数量级):

     将整个磁盘就看做事一个日志,在日志中存放永久性数据及其索引,每次都添加到日志末尾;
通过将很多小文件的存储转换为连续的大批量传输,是的对于文件系统的大多数存取都是顺序性的,从而提高磁盘宽带利用率,故障恢复速度快。
简单来说分为一部分常驻内存,可以为任何方便键值查找的数据结构,另一个常驻硬盘,与B-Tree类似,这部分经常访问的节点也会被缓存在内存中
首先将日志文件写入插入操作日志。然后写入内存部分。当内存接近阈值则滚动合并到硬盘。
 
     将数据添加到文件,因为完全顺序,所以写操作性能优秀,但从日志文件读一些数据将比写操作消耗更多的时间,需要倒序扫描,知道找到所需内容。
日志适用的场景:
  • 数据是被整体访问,WAL(write-ahead-log)
  • 知道明确的offset,kafka
Log-Structured Merge-Tree,LSM-tree
     将之前使用的一个大的查找结构变换为将写操作顺序的保存到一些相似的有序文件(sstable)中。每个文件包含了短时间段内的一些改动,因为文件有序,后续查找也会很快。文件不可修改,永远不会更新,新操作只会写到新文件中,读写检查所有文件,通过周期性的合并来减少文件的个数。保持了日志文件的写性能,让操作顺序化,不断追加而不是修改,延迟更新,批量写入硬盘,适合于大量插入环境
写操作被分批处理,只写到顺序块上,周期性合并会影响IO,都操作有可能访问大量的文件(散乱的读)
  • 更新操作-》内存缓存(memtable)中使用树结构来保持key有序-》WAL写磁盘防丢/恢复/-》达到一定规模刷到磁盘上一个新文件里,这里简单生成新文件没有编辑,所以是顺序写,速度快
     越多的数据到存储系统中,就会有越多的不可修改的顺序sstable文件被创建,他们代表了小的,按时间顺序的修改,系统周期性发起compaction,合并文件删除重复冗余,减少文件个数,保证都操作的性能,因为sstable是有序结构,所以合并非常高效
  • 读操作-》先检查内存数据(memtable)-》没有这个key-》逆序一个个检查sstable直到找到。
     因为需要遍历所有sstable,当数量过多性能就会下降,一方面系统周期性合并sstable,用cache等技术,另一方面使用bloom来避免大量的读文件操作。
周期合并(按层/按文件大小):为了保证LSM读取速度,所以需要维护并减少sstable文件个数

为什么NoSql快--磁盘顺序写的更多相关文章

  1. 深入理解 linux磁盘顺序写、随机写

    一.前言 ● 随机写会导致磁头不停地换道,造成效率的极大降低:顺序写磁头几乎不用换道,或者换道的时间很短 ● 本文来讨论一下两者具体的差别以及相应的内核调用 二.环境准备 组件 版本 OS Ubunt ...

  2. 磁盘IO单线程顺序写时最快的,如果多线程写,磁盘的磁头要不断重新寻址,所以写入速度反而会慢

    (1) 读写最好还是不要多线程,硬盘读写的速度有限,单线程时已经满负荷了,多线程又会增加线程之间的切换,会增加时间. 如果想增加读写速度,应该增加硬盘,做raid (2)首先是硬盘的写入是串行的,CP ...

  3. SQL Server Log文件对磁盘的写操作大小是多少

    原文:SQL Server Log文件对磁盘的写操作大小是多少 SQL Server 数据库有三种文件类型,分别是数据文件.次要数据文件和日志文件,其中日志文件包含着用于恢复数据库的所有日志信息,SQ ...

  4. dd 工具使用; SSD 顺序写性能测试;

    dd 工具使用: dd 也是我们经常使用到的磁盘测试工具,Linux服务器装好系统之后,想要知道硬盘的读写是否能满足服务的需要,如果不满足硬盘的IO就是服务的一个瓶颈.我们可以使用dd命令简单进行测试 ...

  5. XEvent – SQL Server Log文件对磁盘的写操作大小是多少

    原文:XEvent – SQL Server Log文件对磁盘的写操作大小是多少 本篇是上一篇SQL Server Log文件对磁盘的写操作大小是多少的续,使用XEvent收集SQL Server D ...

  6. SSD 为什么顺序写比随机写性能更好?

    SSD以Page为单位做读写,以Block为单位做垃圾回收,Page一般有16KB大小,Block一般有几十MB大小,SSD写数据的逻辑是: 1)将该块数据所在的Page读出 2)修改该Page中该块 ...

  7. Log4J是Apache组织的开源一个开源项目,通过Log4J,可以指定日志信息输出的目的地,如console、file等。Log4J采用日志级别机制,请按照输出级别由低到高的顺序写出日志输出级别。

    Log4J是Apache组织的开源一个开源项目,通过Log4J,可以指定日志信息输出的目的地,如console.file等.Log4J采用日志级别机制,请按照输出级别由低到高的顺序写出日志输出级别. ...

  8. 你知道hover、active这四个伪类为什么要按顺序写吗

    刨根问底,你知道:hover等4个伪类为什么要按顺序排列吗 引言 :link,:visited,:hover,:active这4个伪类大家都不陌生,4个伪类要按照LvHa这个爱恨原则来排(外国友人起的 ...

  9. Spring Data Redis 让 NoSQL 快如闪电(2)

    [编者按]本文作者为 Xinyu Liu,文章的第一部分重点概述了 Redis 方方面面的特性.在第二部分,将介绍详细的用例.文章系国内 ITOM 管理平台 OneAPM 编译呈现. 把 Redis ...

随机推荐

  1. 利用阿里巴巴封装的FastJSON来解析json并转换成map

    利用阿里巴巴封装的FastJSON来解析json并转换成map   package com.zkn.newlearn.json; import com.alibaba.fastjson.JSON; i ...

  2. Linux下的Nginx、php、mysql、apache部署

    待补充,先搞几个博客链接: https://www.cnblogs.com/Candies/p/8282934.html http://sujianjob.com/2017/12/18/yum%E5% ...

  3. 使用 phpStudy + VSCODE 进行 PHP 断点调试

    使用 phpStudy + VSCODE 进行 PHP 断点调试 自己摸索过程有点曲折,但还是配置成功了,现分享如下. 原料 phpStudy 2018 VSCODE 配置过程 安装 phpStudy ...

  4. 【转】每天一个linux命令(53):route命令

    原文网址:http://www.cnblogs.com/peida/archive/2013/03/05/2943698.html Linux系统的route命令用于显示和操作IP路由表(show / ...

  5. 【转】每天一个linux命令(48):watch命令

    原文网址:http://www.cnblogs.com/peida/archive/2012/12/31/2840241.html watch是一个非常实用的命令,基本所有的Linux发行版都带有这个 ...

  6. Vue 介绍

    1. 条件 效果图. 如果seen为false,文字将消失 2. 循环 script里定义数据 效果 3. 事件处理 效果如下图, hello world被逆转了

  7. SVN同步

    SVN同步:1.在备份服务器上安装SVN,之后创建同名的库名2.在备机的Repositories的库文件夹下的hooks目录下,备份并修改pre-revprop-change.tmpl文件为pre-r ...

  8. ipconfig出现window IP configuration 。。

    我的电脑  右击 -->属性 ---->硬件---->设备管理器 安装以太网网卡 1.自动  电脑重新开机会自动提示安装 2.手动  下载以太网网卡驱动 ,选中合适类型(一般为int ...

  9. 导出pb模型之后测试的python代码

    链接:https://blog.csdn.net/thriving_fcl/article/details/75213361 saved_model模块主要用于TensorFlow Serving.T ...

  10. LAMP兄弟连 李强强 GVIM配置文件完整版

    转自http://blog.sina.com.cn/s/blog_5fbb378c01016npv.html "自己看着李强强老师视频代码手写打的.之前最后的一个gvim默认函数方法没放上, ...