RAID

术语

  

  • 扇区:是磁盘中最小的存储单元,向磁盘读写数据时是以扇区为最小单元进行存储
  • block:block,是由N个扇区组成一个块;
  • 在磁盘相同偏移处横向逻辑分割,就形成了stripee;
  • 一个stripee所占用的单块磁盘的区域,就是一个segement; 一个segement中的扇区或datablock 是连续的;一个segement中包含的data block或扇区的个数或者字节容量,叫做stripee depth;
  • 一个stripee横跨过的扇区或块的个数或者字节容量,就是条带长度,即Stripee length。

  如图上面,一个segement由4个data block,那么stripee depth就是4;

读写IO,针对的是扇区;

  读IO,就是发送指令,从磁盘上读取某段序列号连续的扇区的内容;  指令会告知磁盘从哪个位置的扇区开始;然后给出从这个扇区开始往后的连续扇区个数;如指令 ”读取 初始扇区100 长度128 “

  有个概念特别要清楚,我这里也是迷糊了很久: 每个IO,要读写的扇区,肯定是连续的; 如果要读取不连续的2个扇区段,那必须得分成2个IO;   

随机IO,连续IO

  因为每个IO,读写肯定是连续的扇区段; 要读写不连续的扇区段,那就需要多个IO; 这就引出了连续和随机IO的区别;

  连续和随机IO,是指本次IO给出的初始扇区地址和上次IO的结束扇区地址,是不是完全连续的或相差不多的;

  如果是一个连续的IO,磁头不需要换道,那么读写时间是很快的;

  如果是个随机IO,如果扇区相差不大,不需要换道,其实速度还是可以的; 但大部分随机IO,因为扇区是不连续的,很大可能是需要磁头不停的换道,所以会导致效率降低;

顺序IO和并发IO

  这是一个特别容易混淆的概念;

  磁盘控制器如果可以同时对一个RAID系统中的多块磁盘,”同时“发送IO指令;

  特别要注意:这里的”同时“是个宏观概念 ;  也就时如果所有磁盘都在一个总线或环路上,那么这里的”同时“就是指向一块磁盘发送一条指令后,不必等待它回应,接着向另一块磁盘发送IO指令;  这里的”同时“,其实也是有先后顺序,只是比排序的方式快很多,也就是宏观上看作时 ”同时“,所以这边并不称为”并发“;

  

  个人理解,文件系统下发的IO,横跨条带的多个segement,那么控制器会把每块盘要写入或读取的数据都计算好,把这个IO拆分成多份,”同时“的对多个磁盘的发送IO指令,写入磁盘的segement;  这个”同时“就是上面提到的宏观的同时,不是并发;

  如果直接发向磁盘的IO,只是包含了文件系统下发的一个IO数据,此时就为顺序IO;就是控制器缓存中的文件系统下发的IO队列,只能一个个来; 个人理解,这种情况就是 大IO的场景,横跨条带中的多个磁盘中segement, 占用多个磁盘”同时写入“,磁盘都在忙,所以其他IO无法写入,一次只能一个IO,做不到并发;

  如果直接发向磁盘的这些IO,包含文件系统下发的多个IO,就是并发IO;  个人理解,这里应该就是小IO,不超过条带深度,那么一个IO就会在一个磁盘中进行,其他磁盘空闲,那么就可以同时处理其他IO;

  

  

RAID 对性能的影响和提升

IO读写的详细过程是怎样的? 

  1、程序先发出指令

  如某个时候,主机控制器发出指令: 读取  初始扇区100   长度128

  2、计算出对应的物理扇区号

  RAID控制器做逻辑条带化的时候,制定了公式,如何根据上面的指令,计算出逻辑扇区对应的物理磁盘的扇区号;

  所以RAID控制器接受受道这个指令之后,会立刻进行计算,根据这个公式,就能算出100号逻辑扇区,对应的物理磁盘的扇区号;然后还会依次算出 初始扇区后逻辑上连续的128个扇区,所在的物理磁盘的扇区号; 这些物理扇区号可能不在同一个磁盘上;

  3、操作物理磁盘

  得到物理磁盘的扇区号之后,会分别对这些扇区的磁盘再次发送指令;然后就真实的去读取对应数据了;

  4、磁盘反馈数据

  磁盘接受到指令,各自将数据提交给RAID控制器,经过控制器再Cache中的组合,再提交给主机控制器;

  

  分析:

  128个扇区,也就是 512B*128=64KB;

  上面的过程中,如果128个扇区都在同一个segement,也就是说 条带深度 大于64KB,也就意味着,只需要在一块磁盘上读取就行; 这和单块磁盘性能一样,而且由于RAID控制器参与,甚至比单盘磁带的性能还差一些;

  那如果减小条带深度,那么同样的128扇区的数据,就会存放到更多的磁盘的segement;(而且如果条带深度减小,在磁盘数量不变的情况下,条带长度中字节数总量也会变小,也就是条带长度会变小);

  

  这里有个特别要注意的地方:

  条带中有多个segement,每个磁盘提供一个segement组成条带;如果一个IO很大,需要跨条带中多个磁盘中的segement,控制器不是先放满第一个segement,再去放满第二个segement;  对segement写入数据,这个过程其实是同时进行的,因为控制器会把每块盘要写入或读取的数据都计算好;

  个人理解,这种”同时“是一个宏观上的; 因为计算机总线是共享的,一个时刻只能对一个外设进行IO;那么如果磁盘不在相同的总线中,这种并行写入就更趋于”同时“,也就是说粒度更小; 所以这里不是理解成”并发“,只是宏观上的”同时“,比按顺序写入segement更有效率而已;

  这里就出现了一个矛盾的地方:

  RAID 要提升性能,那么条带深度就要越小越好; 能达到同时写入多块磁盘;

  但是条带深度太小,就会导致并发几率降低;  为什么说是并发机率呢? 因为如果条带深度太小,1个IO很大概率会占用多个磁盘,而每个磁盘同一时刻只能处理一个读写任务,其他IO只能等待这个IO完成后才能继续使用物理磁盘;

  这里就有一个均衡:

  1、如果随机小IO多,那么就适当加大条带深度;  随机IO的时间主要在寻道上,而不是写入时的时间花费,所以把IO限制在一个磁盘,那么其他磁盘可以做到并行写入;

  2、如果连续大IO多,就减少条带深度; 顺序大IO,主要时间在写入上,而且连续的IO,基本不用换道,所以要增大IO写入效率,尽量让多个磁盘同时处理;

RAID 0 性能对单块盘比较:

读写,并发IO,随机IO、连续IO: 小IO写入时,并发提升N倍 ; (注意的是, 个人理解 :如果大IO小于segement,其实也是提升N倍;如果遇到大IO是一次IO需要写入多个盘,相对之后提到的小IO,此处没有并发性,没有单独讨论的必要;)

读写,顺序IO,随机IO:不能并发,此时一个IO可以同时读取N个磁盘内容; 一次IO寻道时间相对单盘不变,虽然可同时写入多个磁盘,当相比寻道时间可忽略,所以提升很小;

读写,顺序IO,连续IO: 只经过一次寻道,寻道的影响很小,因为可以同时写入多块磁盘,所以提升N倍;

RAID 1 性能对单块盘比较:

读取,并发模式; 不管是随机IO还是连续IO,N个IO,每个IO占用一个磁盘,相当于提升了N倍;

读取,顺序IO,随机IO: 由于不能并发,此时一个IO可以同时读取N个磁盘内容,但是随机IO一次IO寻道时间相对单盘不变,虽然可以读取多个磁盘,当相比寻道时间可以忽略,所以提升很小;

读取,顺序IO,连续IO: 在这种模式下,寻道时间的影响降至最低,同时可以读取多块磁盘数据,所以提升N倍;

写入,并发IO,随机IO:  因为是镜像写入,每个磁盘都需要写入,所以没有所谓的并发; 相反,因为要同时写两份,性能取决于最差的磁盘,性能可能还降低;

写入,并发IO,连续IO:有一种情况,是控制器的优化算法,将多个小IO,合并成一个大IO;那就是提升了N倍

写入,顺序IO,随机IO或连续IO: 基本没有提升;因为此时寻道时间不变,传输时间不变,iops不变

RAID 5 性能对单块盘比较:

RAID 5,其实最适合小IO; 并发情况下,性能都比单盘有提升;

RAID 0

  将两块以上的硬盘合并成一块,数据连续地分割在每块盘上。

1.通过把多个磁盘组织在一起作为一个逻辑卷提供磁盘跨越功能;
2.通过把数据分成多个数据块(Block)并行写入/读出多个磁盘以提高访问磁盘的速度;

  

  条带化之后的多块硬盘,数据是被并行的写入所有磁盘,多管齐下,而不是横向写满一个条带,再写下一个条带;

  从理论上讲,三块硬盘的并行操作使同一时间内磁盘读写速度提升了3倍。 但由于总线带宽等多种因素的影响,实际的提升速率肯定会低于理论值,但是,大量数据并行传输与串行传输比较,提速效果显著显然毋庸置疑。

  

  优缺点:

  读写性能是所有RAID级别中最高的。

  RAID 0的缺点是不提供数据冗余,因此一旦用户数据损坏,损坏的数据将无法得到恢复。RAID0运行时只要其中任一块硬盘出现问题就会导致整个数据的故障。一般不建议企业用户单独使用。

那么就出现了一个疑问,数据是如何拆分成多个数据块的?

  个人理解,数据最终写入磁盘之前,都会被CPU翻译为0和1的bit, 控制器接收到要写入的bit,可以存放在缓存;

  每个RAID中,有设定分条深度,也就是每个segement中包含的扇区数量;那么控制器会根据分条深度来决定拆分成多大,根据分条长度,来决定一次拆分出多少份;这些就可以实现并行写入了;

  

RAID 1

  raid 0 ,虽然容量和性能提升了,但是不安全,所以为了安全就出现了raid 1,镜像;

  1个写IO,需要2个写,写惩罚是2;速度取决于最慢的磁盘,因为要同步;

  但是读取时,增加了并发性; 可以同时从2块磁盘上读取;

  优缺点:

  RAID1通过硬盘数据镜像实现数据的冗余,保护数据安全,在两块盘上产生互为备份的数据,当原始数据繁忙时,可直接从镜像备份中读取数据,因此RAID1可以提供读取性能。
  RAID1是硬盘中单位成本最高的,但提供了很高的数据安全性和可用性,当一个硬盘失效时,系统可以自动切换到镜像硬盘上读/写,并且不需要重组失效的数据。

RAID 5

  RAID 5 ,是需要一块校验盘;这样在保证像RAID 1 一样有并发性的同时,也能保证安全性;

  RAID 5 的1次写,需要4个读写操作,写惩罚是4 ;  读出老数据,读出老的校验数据,然后写入新数据和新校验数据;

  但有一个特别要注意的地方,每个写IO下来时,都必须重新写入校验,也就是同一个分条内,同一时刻,只能是一个读写IO和校验在进行,不可能同时2个IO写入分条;这就有以下的情况:

  

  1、如果是2块盘,做RAID 5,因为有校验盘,那其实就只有1块盘能正常写入数据;实现不了并发, 没有意义;

  2、如果是3块盘,做RAID 5,也无法做到并发;

  • 比如,1个IO下来,这没有并发的概念;
  • 那么 2个IO(D1,D2)写入3块盘的RAID 5时,比如D1写入时,同时开始读取旧的校验,之后还要写入新的校验; 校验位是占用的,以为这D2此时是无法写入的; 那么也就是没有并发;

  3、如果是4块盘,做RAID 5 ,可以做大的最大的并发是2个IO;

    为什么是2个,不是3个呢?

  • 还是之前提到的,1个IO写入时,这个分条的校验盘是占用的,此时这个分条无法写入第二个IO;
  • 写入2个IO时,一个分条肯定还是1个IO读写; 但是第二个分条上,还是有2个盘时空闲,意味着第二个分条此时也可以写入一个IO; 这也解释了为什么校验盘是有规律的斜向存放的,而且这种并发是基于“恰好”的,所以raid5提供的是盲并发。
  • 写入3个IO时,又回到了之前的情况,分条的4个磁盘全都占用,无法做到并发;

校验盘是有规律的斜向存放的?

1、是上面提到的,为了实现并发,校验盘放在一个磁盘上,一个IO写入时,校验盘一直被占用,无法实现并发;

2、如果校验盘放在一个磁盘上,每次其他磁盘写入IO,都必须更新校验盘,校验盘会特别繁忙,造成热点数据盘,也容易损坏;

为什么要增加并发,需要增加条带宽度而不是条带长度?

  条带长度:一个stripee横跨过的扇区或块的个数或者字节容量,就是条带长度,即Stripee length。
  条带深度:一个segment包含的date block 或者扇区的个数或者字节容量,叫做stripee depth。

    

  如果条带宽度太小,或IO sieze比较大,那么所有磁盘同一时刻只能被一个IO占用,也做不到并发了,只能一个IO一个IO来处理,这就导致一个IO要很多磁盘参与,得不偿失;

  所以分析也可以知道,要实现并发IO,就需要保证又空闲的磁盘未被IO占用,以便于其他的IO可以去空闲的磁盘进行访问,所以唯一的方法就是增加条带深度;为什么说是条带深度呢?

是因为,如果条带深度够大,也就是一个磁盘上的segemet够大,那么一个IO过来,如果小于这个条带深度,那这个IO就只会在这个segement上写入,这个IO就会被完全”禁锢“在一个磁盘上;此时就只会占用写入的磁盘和校验盘,2块磁盘; 那么其他的磁盘就会空闲出来;

  这些是RAID 5 设计时,条带宽度比较大的原因;  所以RAID 5 在随机读方面性能比较好,因为可以并发;但在写时,因为写惩罚为3,所以随机和顺序写的性能都不太好;

RAID 6

  两块校验盘,比RAID 5 更安全,但是写性能当然也更差了;

  RAID一次写,需要6个操作,写惩罚是6; 读出老数据,读出老的校验数据1,读出老校验数据2;然后写入新数据和新校验数据1和新校验数据2; 和RAID 5 相比,区别是2次读取,2次写入;

02-RAID技术 学习心得的更多相关文章

  1. 《ODAY安全:软件漏洞分析技术》学习心得-----shellcode的一点小小的思考

    I will Make Impossible To I'm possible -----------LittleHann 看了2个多星期.终于把0DAY这本书给看完了,自己动手将书上的实验一个一个实现 ...

  2. 我的MYSQL学习心得(四) 数据类型

    我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(五) 运 ...

  3. 我的MYSQL学习心得(五) 运算符

    我的MYSQL学习心得(五) 运算符 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...

  4. 我的MYSQL学习心得(十) 自定义存储过程和函数

    我的MYSQL学习心得(十) 自定义存储过程和函数 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心 ...

  5. 我的MYSQL学习心得(十四) 备份和恢复

    我的MYSQL学习心得(十四) 备份和恢复 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) ...

  6. 我的MYSQL学习心得(十七) 复制

    我的MYSQL学习心得(十七) 复制 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...

  7. 我JSP学习心得1

    老师布置了一项作业,说是要按着老师的要求写,但我觉得只要是技术分享的心得就是好的,不论是不是所要求的内容. 由于和几个人在外面给别人搭建网站,项目需要学习了jsp有用到了javascript,这里有一 ...

  8. Ajax学习心得

    Ajax学习心得 大致学了下Ajax,才知道它不是某种编程语言,而是一种在无需加载整个页面的情况下能够更新部分网页的技术.了解了它的功能后觉得这真是一种好的技术,这得给前端和运维省多少力啊! 传统的网 ...

  9. Linux学习心得之 LVM管理与Linux系统安装

    作者:枫雪庭 出处:http://www.cnblogs.com/FengXueTing-px/ 欢迎转载 LVM管理与Linux系统安装 1.前言 2.LVM 简介与术语 3.LVM 使用 4.Li ...

  10. 消息中间件的技术选型心得-RabbitMQ、ActiveMQ和ZeroMQ

    消息中间件的技术选型心得-RabbitMQ.ActiveMQ和ZeroMQ 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs RabbitMQ.Active ...

随机推荐

  1. 聊聊Flink CDC必知必会

    CDC是(Change Data Capture变更数据获取)的简称. 核心思想是,监测并捕获数据库的变动(包括数据 或 数据表的插入INSERT.更新UPDATE.删除DELETE等),将这些变更按 ...

  2. SpringBoot对接阿里云OSS上传文件以及回调(有坑)

    前言 今天在对接阿里云OSS对象存储, 把这过程记录下来 链接 阿里云的内容很多,文档是真的难找又难懂 本文主要是用的PostObject API 加上 Callback参数 PostObject - ...

  3. Linux0.11内核笔记(-)

    基础知识 C语言.汇编知识.嵌入式汇编.x86处理器和编程的相关知识和.UNIX操作系统设计 Linus在最初开发Linux操作系统时参考了MINIX操作系统:<操作系统:设计与实现>一种 ...

  4. C#中using的三种用法

    1. 对命名空间的引用 引入命名空间,在使用类时可以省略复杂的前缀,类似于Java的import. using System.Text; 顺便提一句,C#10新特性支持全局using,如果关键字 gl ...

  5. 统一观测丨使用 Prometheus 监控 Cassandra 数据库最佳实践

    作者:元格 本篇内容主要包括四部分:Cassandra 概览介绍.常见关键指标解读.常见告警规则解读.如何通过 Prometheus 建立相应监控体系. Cassandra 简介 Cassandra ...

  6. DNS与CDN技术

    参考链接: CDN原理简单介绍 浅析:DNS解析和CDN加速 DNS报文格式解析

  7. Redis从入门到放弃(4):3种新数据类型

    1.介绍 前面的文章已经介绍了redis的5种基本数据类型,redis6中另外还有3种特殊的数据类型,分别是 Bitmaps (位图).HyperLogLogs(基数统计)和 geospatial ( ...

  8. Git SSH 认证配置

    [前言] 我们在开发过程中,经常会和github,gitlab或者gitee打交道,一般临时克隆(clone)其他人的项目学习参考时,我们大多采用 https 的方式进行 clone 但如果在参与多个 ...

  9. Builder 生成器模式简介与 C# 示例【创建型2】【设计模式来了_2】

    〇.简介 1.什么是生成器模式? 一句话解释:   在构造一个复杂的对象(参数多且有可空类型)时,通过一个统一的构造链路,可选择的配置所需属性值,灵活实现可复用的构造过程. 生成器模式的重心,在于分离 ...

  10. Notepad正则表达式用法

    https://blog.csdn.net/cuckoo1/article/details/52165449