数据写入方式
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. web.xml中context-param详解

    <context-param> <param-name>contextConfigLocation</param-name> <param-value> ...

  2. Hadoop之 MapReducer工作过程

    1. 从输入到输出 一个MapReducer作业经过了input,map,combine,reduce,output五个阶段,其中combine阶段并不一定发生,map输出的中间结果被分到reduce ...

  3. Java awt组件间的继承关系

    Container的继承关系: Window是可独立存在的容器,其他则不行.

  4. c# ProgressBar进度条方向和美观

    protected override CreateParams CreateParams { get { CreateParams cp = base.CreateParams; cp.Style | ...

  5. C#实现不安装Oracle客户端访问远程服务器数据

    概述: C#通过使用ADO的方式在未安装Oracle数据库的前提下,客户端程序远程访问服务器,会出现:“System.Data.OracleClient 需要 Oracle 客户端软件 8.1.7 或 ...

  6. serialize unserialize

    转自 http://www.cnblogs.com/yeer/archive/2009/03/25/1421161.html php函数serialize()与unserialize()   seri ...

  7. 胖子哥的大数据之路(6)- NoSQL生态圈全景介绍

    引言: NoSQL高级培训课程的基础理论篇的部分课件,是从一本英文原著中做的摘选,中文部分参考自互联网.给大家分享. 正文:  The NoSQL Ecosystem 目录 The NoSQL Eco ...

  8. 云-Azure-百科:Azure

    ylbtech-云-Azure-百科:Azure Windows Azure是微软基于云计算的操作系统,现在更名为“Microsoft Azure”,和Azure Services Platform一 ...

  9. elasticsearch 复杂查询小记

    以下接口调用都基于5.5版本 JSON 文档格式 { "_index": "zipkin-2017-09-06", "_type": &qu ...

  10. 1044 Shopping in Mars (25 分)

    1044 Shopping in Mars (25 分) Shopping in Mars is quite a different experience. The Mars people pay b ...