zoukankan      html  css  js  c++  java
  • 简单谈谈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级应用与进行读操作,而写操作较少的应用上。

    每一个不曾起舞的日子里都是对以往生命的辜负!!
  • 相关阅读:
    全面解释java中StringBuilder、StringBuffer、String类之间的关系
    如何解决Java.lang.NoClassDefFoundError--第一部分
    Java中Vector和ArrayList的区别
    深入研究java.lang.ThreadLocal类
    Frame.pack()与frame.validate()方法的区别
    Oracle中start with...connect by子句的用法
    Java 的swing.GroupLayout布局管理器的使用方法和实例
    Java SE 6.0实现高质量桌面集成开发
    苹果App Store开发者帐户从申请,验证,到发布应用(2)
    苹果App Store开发者帐户从申请,验证,到发布应用(1)
  • 原文地址:https://www.cnblogs.com/flish/p/4714901.html
Copyright © 2011-2022 走看看