数据写入方式
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. binlog cache size设置是否合理判断

    二进制日志是写操作是,首先写入二进制日志缓冲(binlog_cache)然后commit,再从binlog_cache写入到binlog文件,默认大小为32K,而binlog_cache是sessio ...

  2. 【转】每天一个linux命令(23):Linux 目录结构

    原文网址:http://www.cnblogs.com/peida/archive/2012/11/21/2780075.html 对于每一个Linux学习者来说,了解Linux文件系统的目录结构,是 ...

  3. telinit:Did not receive a reply.Possible causes include:the remote application did not send a reply, the message bus security policy blocked the reply, the reply timeout expired

    问题: Enabling /etc/fstab swaps: [ok]telinit:Did not receive a reply.Possible causes include:the remot ...

  4. c#中如何保存焦点控件?

    对所有文本框添加焦点获得事件,头部再定义一个全局的object或者control的类型对象,在焦点获得事件中把当前控件对象赋值给之前定义的object或者control对象,操作的话就对这个全局量操作 ...

  5. POJ1015陪审团(Jury Compromise)——dp+路径记录

    题目:http://poj.org/problem?id=1015 差值是有后效性的,所以“转化为可行性”,开一维记录“能否达到这个差值”. 当然可以开两维分别记录 a 和 b,但 “值只是0或1” ...

  6. php中is_null,empty,isset,unset 的区别详细介绍

    is_null, empty, isset, unset 我们先来看看这4个函数的描述. isset 判断变量是否已存在(配置)unset 把变量删除(释放)掉empty 判断变量是否为空is_nul ...

  7. 【Reporting Services 报表开发】— 如何根据明细的行数实现分页(比如每隔5行分页)

    一.新建报表:对于初学者可以参考我前面的文章[Reporting Services 报表开发]— 总结 如图1: 图 1 二.选择 new_name文本框—>添加组—>选择行组中的父组.具 ...

  8. 多线程实现ping扫描

    代码: # coding=utf-8 import subprocess from Queue import Queue import threading class Pinger(object): ...

  9. [转]身份证从 15 >> 18

    身份证号码的结构和表达形式 1.号码的结构 由十七位数字本体码和一位效验码组成.排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字效验码.2.地址码 表示编码对象常住 ...

  10. 6-3-3ios自动化-数据驱动

    https://testerhome.com/topics/14247 #!/usr/bin/env python3 # coding:utf-8 from appium import webdriv ...