简单谈谈RAID

  RAID是“Redundant Array of Independent Disk”的缩写,翻译过来叫做独立磁盘的冗余阵列,其实就是磁盘的存储、访问、备份技术。在谈RAID之前,先简单学习一下存储器的一些基础知识。

1、存储器基础

  说到存储器,顾名思义,就是用来存储数据的,市场上存储器的种类也很多,但也可以大致分为两类:易失性存储器非易失性存储器,前者掉电数据即会丢失,后者掉电数据仍然还在,这是由存储器的介质决定的;一般来说,易失性存储器的存取速度会明显高于非易失性存储器,当然价格也高。我们先了解一下计算机系统中存储器的层次结构,下图是任何一本讲计算机系统的书中都会给出的一幅存储器层次图,越上层(金字塔的顶层)的存储器速度越快,当然每字节的成本也越高;越下层(金字塔底层)的存储器速度越慢,每字节的成本越便宜。

  

  速度最快的莫过于位于CPU中的寄存器了,因为昂贵,所以只有几十个字节。

  位于L1,L2,L3层的是高速缓存,高速缓存的速度也很快,它是由SRAM(静态随机存储器)实现的,CPU访问高速缓存只需要几ns,由于价格相对较贵,所有只有几M~几十M的存储空间。

  位于L4层的是主存,运行速度虽然没有缓存快,但是价格也便宜了很多,它是由DRAM(动态存储器)实现的,所有现代计算机中一般有几个G的主存大小,CPU访问主存的速度一般在几十ns~上百ns之间。

  存储器主要分为两类:易失性和非易失性存储器。在计算机系统中,易失性存储器主要包括高速缓存、主存,易失性一般由随机存储器(RAM)来实现。RAM又分为静态RAM(SRAM)和动态RAM(DRAM),SRAM比DRAM速度快,但是价格也相对较贵。高速缓存用的就是SRAM,而主存用的是DRAM。非易失性存储器主要包括磁盘、固态硬盘、光盘、磁带、软盘等。

  位于L5层的是本地磁盘,本地磁盘一般使用的是机械存储,也就是说,访问磁盘会产生机械损耗,在磁盘和内存之间传输一个字节大概需要10ms。数据库的数据一般也是存储在磁盘上,所以为了减少因为数据库的增删查改操作带来的访问磁盘所需要的时间损耗,我们需要建立一系列的算法和数据结构来维护数据库。

  磁盘是由盘片构成的,每个盘片有两个面,每个面又被划成很多同心圆,每个同心圆称为磁道,每个磁道又被间隙分割成圆的片段,叫做扇区。扇区是磁盘的最小的不可分割的单位。每个盘面都有一个磁头用来读写盘面上的数据,主存需要访问磁盘上的数据时,由磁盘驱动器来控制,数据是存储在一个盘面的某个磁道的某个扇区中的,所以,我们得把磁头移动到对应的磁道上,这叫做寻道,寻道所消耗的时间叫做寻道时间;当把磁头移动到对应的磁道时,我们还得旋转到对应的扇区,旋转到对应扇区所带来的延迟,称为旋转延迟;数据所在扇区和扇区间的空隙经过磁头所需要的时间叫做传输时间。

  所以一次访问磁盘所需的时间为:寻道时间+旋转时间+传输时间。这个其实主要由磁盘旋转速度、扇区数等来决定,一般7200转/min,扇区空隙占10%的磁盘平均访问时间大概是10ms。

  因为磁盘的非易失性,成本低等一些优点,所以目前几乎所有的数据存储和备份用的都是磁盘。

2、通过冗余来提高可靠性

  任何设备都有可能发生故障,存储器当然也不例外。如何解决可靠性??答案是冗余。实现冗余最简单的办法就是复制每一张盘,这就是所谓的镜像。一张逻辑磁盘由两张物理磁盘组成,每次写操作都要在两张磁盘上执行。如何其中一张磁盘发生了故障,我们就可以从另外一张磁盘读数据。只有在第一张磁盘发生故障了,并且在它修复之前,第二张磁盘也发生了故障,数据才会真正丢失。我们用平均故障时间(这里的故障指数据丢失)来评价镜像技术的性能,平均故障时间主要依赖于每张磁盘的平均故障时间和平均修复时间(替换发生故障的磁盘并恢复磁盘上的数据所用的时间

  假设两张磁盘发生故障相互独立,一张单独的磁盘的平均故障时间为100 000小时,平均修复时间是10小时,则镜像磁盘的平均故障时间是100 0002/(2*10)=500*106小时,也就是57000年。当然这只是在理想情况下,还有考虑其他因素。

3、通过并行来提高性能

  磁盘成本低,但是访问速度有限,每次访问的平均时间是10ms左右,非常影响了系统的性能,如何提高磁盘访问速度?通过并行访问,处理读数据的速度将翻倍,因为读请求可以发送到任意一张盘中。每个读操作的传输速率和单一磁盘系统中的传输速率一样,只是单位时间内读操作的数目翻倍了。一般通过在多个磁盘上进行数据拆分来提高传输速率。

  数据拆分的形式也有很多:将每个字节按比特分开,存储到多个磁盘上,叫做比特级拆分。将块拆分到多张磁盘上,叫做块级拆分

  块级拆分是最常用的拆分形式。当我们要将8个逻辑块存存储到磁盘上时,我们可以把它们分别存储到编号为0,1,2,3四张磁盘上,第i块数据存储在第(i mod 4)张磁盘上,这样我们每次读这些数据时,我们可以从4张磁盘平行读取。

  不管什么形式,并行磁盘系统都是通过一下原理来提高性能的:

  (1) 负载平衡多个小的访问操作,以提高访问操作的吞吐量

  (2) 并行执行大的访问操作,以减少大访问操作的响应时间

4、RAID

  镜像虽然具有很高的可靠性,但是每一张逻辑盘都需要两张物理盘,成本太高;数据拆分虽然提高了速率,但是并没有保证可靠性。于是又提出了一系列的替换方案,这些方案具有不同的成本和性能之间的权衡,并且把这些方案分为若干个RAID级别。这些方案其实都是基于奇偶校验数据拆分的思想。

  • RAID 0级:只是简单的块级拆分,而没有任何冗余的磁盘阵列。这个级别的RAID仅仅只是提高了从磁盘中读取数据的速度,但是没有可靠性的保障,当一个磁盘发生故障,没有任何办法可以恢复。
  • RAID 1级:使用块级拆分的磁盘镜像(很多企业用RAID 1+0级指代拆分的镜像,而用RAID 1级指代不使用拆分的镜像)。因为有数据拆分,所以可以通过并行来提高读取速率,因为有镜像,所有也有很高的可靠性,同时数据重建很简单,提供很高的写性能,但是成本较很高。
  • RAID 2级:使用奇偶校验位,也叫做内存风格的纠错码(ECC)组织结构。
  • RAID 3级:
  • 位交叉的奇偶校验结构,是对RAID 2级的改进。磁盘控制器能够检测出一个扇区能否正确地读出,所以可以通过单一的奇偶校验位来检错和纠错。如果一个扇区被破坏,系统就可以准确地知道哪个扇区被破坏,对扇区的每一位,系统通过计算其他磁盘上对应扇区的对应位的奇偶性来判断。

    • 比如我们假设有三个磁盘,每个磁盘只有一个扇区,每个扇区只有八位。
    • 盘1:11110000
    • 盘2:10101010
    • 盘3:00111000
    • 我们还需要一块冗余盘作为奇偶校验位:
    • 盘4:01100010
    • 上述八位中,每一位中4个盘中的1个数和都是偶数。如果盘2上数据由10101010变为11001100,我们就可以通过其余几个盘来恢复盘2的数据。任何一个盘中的数据都是其它盘中对应数据的模2和。
  • RAID 4级:块交叉的奇偶校验组织结构,使用块级拆分,在一张独立的磁盘上为其它N张磁盘上对应的块保留一个奇偶校验块。可以并行执行多个读操作,从而产生较高的总I/O传输率,写大量数据也有很高的传输率(数据和校验位可以并行地写)。但是数据量很小时就不能并行地执行,写一个块需要同时访问存储磁盘和奇偶校验磁盘,因为奇偶校验磁盘需要更新。
  • RAID 5级:块交叉的分布奇偶校验位的组织结构,是对RAID 4级的改进。RAID 5级将数据和奇偶校验位都分布到所有的N+1张磁盘中,所有磁盘都能参与到读操作中。对于每个由N个逻辑磁盘块,需要N+1个物理磁盘块,一张磁盘中对应的块存储奇偶校验位,剩下的N张磁盘中对应的块存储数据。
  • RAID 6级:P+Q的冗余方案。类似与RAID 5级,只是存储了额外的冗余信息,用来应对多个磁盘同时发生故障的情况。

5、如何选择RAID级别

  具体问题具体分析,一般在应用中主要考虑以下因素:

  (1) 所需额外存储带来的花费

  (2) 在I/O操作数量方面的性能需求

  (3) 磁盘故障事的性能

  (4) 数据重建过程(故障恢复)中的性能

  RAID 0级别只能用于数据安全性要求不高的应用中;

  RAID 3级是对RAID 2级的改进,RAID 5级是对RAID 4级的改进,我们只需要考虑RAID 3级和RAID 5级即可。RAID 3级是比特级拆分,RAID是块级拆分,块级拆分对于大量数据的传输有与RAID 3级同样好的传输速率,对少量数据的传输使用更少的磁盘。RAID 6级比RAID 5级有着更高的可靠性,可以用于数据安全十分重要的应用。RAID 1级提供了最好的写操作性能,RAID 5级比RAID 1级具有更低的存储负载,但是写操作需要更高的时间开销,所以RAID 5级应用与进行读操作,而写操作较少的应用上。

时间: 2024-10-31 06:52:40

简单谈谈RAID的相关文章

简单描述RAID级别:

简单描述RAID级别: RAID 0 是俩盘一起读写,如果一个坏了那么数据全丢失: RAID 1是一块写,一块用来备份,坏一块无所谓: RAID 2 ,3 ,4 不常用: 最常用的就是RAID 5和RAID 6 ,RAID 5允许坏一块盘,但是最少需要三块盘来做,做出来的容量是N-1的容量(相当于一块用来写校验信息): RAID 6允许坏2块盘,但是最少需要四块盘,容量是N-2(相当于俩盘校验): 一.RAID技术规范简介 RAID技术主要包含RAID 0-RAID 7等数个规范,它们的侧重点各

简单谈谈JVM中的GC(下)

在系列的最后,简单谈谈一些会有坑的JVM参数配置,以避免大家再多次踩坑 -XX:+DisableExplicitGC 很多的JVM标准配置中都有该选项,那么它究竟是干嘛的? 它会让System.gc()变成一次空调用,并不会真的发生一次Full Gc.除此以外,它还能避免第三方库定时引发的Full Gc(没错,说的就是RMI机制),看来很美好,对不对? 但有一种情况:应用本身GC正常,很久都不会Full Gc,但堆外内存增长很快,并且JVM启用了-XX:+DisableExplicitGC.你就

简单谈谈为什么国内不能登录Facebook/youtube等国外网站以及解决方法

简单谈谈为什么国内不能登录Facebook/youtube等国外网站以及解决方法让我们来简单地回顾一下近几年的互联网,自从Google对微软步步紧逼之后,国外互联网风起云涌,先后出现了Twitter.Facebook.Youtube等超级巨无霸,这些巨大无朋的互联网公司几乎是一夜之间出现在我们眼前.基本上这几家公司都是在2004年左右创办的, 2004年2月,Facebook由哈佛大学的学生Mark Zuckerberg创办,时隔一年,Youtube于2005年2年由Paypal的三个前员工Ch

简单谈谈Resource,Drawable和Bitmap之间的转换

一直接触这些东西,还是归个类整理一下比较好. Resource -> Drawable Drawable draw1 = this.getResources().getDrawable(R.drawable.icon); Drawable -> Bitmap 1. static Bitmap drawableToBitmap(Drawable drawable) // drawable 转换成bitmap { int width = drawable.getIntrinsicWidth();/

简单谈谈Erlang的几种运算符

Erlang 有好几种运算符,比较运算符.数学运算符.布尔运算符,文章针对这几种运算符做讨论,参考erlang文档,以例子说明. Erlang的比较运算符 写法如下: Expr1 op Expr2 1> 1 == 1. true op Description == 等于 /= 不等于 =< 小于或等于 < 小于 >= 大于或等于 > 大于 =:= 恒等于 =/= 恒不等于 以=:=和==为例,说明恒等于和等于的区别: 2> 1 == 1.0. true 3> 1

简单谈谈编程语言(三)

?????? 本文续上一篇简单谈谈编程语言(二),最后再谈谈编程语言.这篇很有可能是最后一篇了,也是时候整理一下我之前的一些文档了,这篇谈谈对编程语言专精的必要性,或者选择一精多涉猎的战术,谈谈一些学习心路,而,共性,就是我这篇文章表达的核心.第一篇文章谈历史,第二篇文章谈历程,都是第三篇的基础,之后就靠大家自己去实际学习中感受文章中所表达的了. ?????? 经过前两篇对编程语言不同层面的描述,其实大概对编程语言学习的畏惧心理可能已经没有那么大了,也可能也因为编程经验相对少感受不深,也可能因为

简单谈谈js中的MVC

MVC是什么? MVC是一种架构模式,它将应用抽象为3个部分:模型(数据).视图.控制器(分发器). 本文将用一个经典的例子todoList来展开(代码在最后). 一个事件发生的过程(通信单向流动): 1.用户在视图 V 上与应用程序交互 2.控制器 C 触发相应的事件,要求模型 M 改变状态(读写数据) 3.模型 M 将数据发送到视图 V ,更新数据,展现给用户 在js的传统开发模式中,大多基于事件驱动的: 1.hash驱动 2.DOM事件,用来驱动视图 3.模型事件(业务模型事件和数据模型事

简单的RAID模拟

相比普通的硬盘和分区而言,其实可以考虑把多个硬盘或者分区组合起来,从而可以发挥出硬盘或者分区的极大性能,但一般情况下,不同的硬盘结合会有不同的效果,下面就介绍一下简单的模拟RAID阵列的使用,由于机器的限制,模拟软RAID. 模拟RAID-0: ①读.写性能提升 ②可用空间:N*min(S1,S2,...) ③无容错能力 ④最少磁盘数:2, 2 在虚拟机终端添加几块硬盘(建议最好同一个生产厂家.同一批次.同一大小),这样有利于更好发挥硬盘性能,减少硬盘空间的浪费. (1)添加几块硬盘,由于大小不

简单谈谈JVM中的GC(中)

书接上文,在了解JVM的分代模型后,接着来简单聊聊JVM中GC算法和不同的GC收集器[求关注] GC回收算法 一个GC回收算法通常会做这么几件事: 1.遍历内存,找到被引用的对象 2.清理掉这些未被标记对象的内存 3.被清理掉的内存放回内存中,供其他地方使用 上文也提及过,目前JVM中的搜索引用对象是用的根搜索方式,再重复引用下: 所有的Java对象构成一颗近似"搜索树"的结构,有一个root根节点,每次从root出发向下搜索,当整个树遍历完成后,那些不在其中的变量则视为"垃