在这一章当中我们讲RAID,我们主要了解的是RAID的基础概念,了解一下RAID的级别,以及我们如何动手讲几个磁盘或分区创建成为一个RAID分区,之后如何管理和删除该RAID分区也在本章中进行讲解。

一、RAID

  RAID的全称为:Redundant Arrays of Inexpensive Disks,我们称之为廉价冗余磁盘阵列,不过以现在的磁盘来说可是相当的不廉价,所以说讲Inexpensive改为了Independent,称之为独立冗余磁盘阵列,在一块硬盘当中存储了许多非常重要的数据,万一该磁盘出现损坏,则计算机的业务会受到终止,数据也会导致丢失,早期的硬盘的速度是很慢的,单个的IO能力也是有限,如果该能力无法得到突破的话,那么整个的业务能力随之也会受到影响,用户体验就会很差。这样的话,对于一个网站来说,站在用户的观念上,几乎就没有什么价值可言。所以说要突破单块IO的速度可能里有限的情况。
  在伯克利分校当中有一位教授发表的一篇论文,就是A case for Redudent Arrays of Inexpensive Disks RAID,这个论文的内容我们可以理解为将多块IDE接口的硬盘通过某种介质当中一块硬盘来使用,通过不同的组合方式来提高IO能力,甚至于耐用性等特性,那么RAID这个名字和这种技术就这么流传下来了。只不过在以后的企业当中使用SCSI接口的硬盘也使用RAID技术来提高IO的能力及耐用性。

   Berkeley:A case for Redundent Arrays of Inexpensive Disks RAID
     可以将廉价的多块磁盘,按照某种特定的结构组合起来当作一个设备来使用,提高IO能力或耐用性;

  那么我们将RAID的基本概念和它的特×××我们来总结一下:

   RAID:将多块硬盘组织成某种格式当成一个设备组织的技术;

     提高IO能力:
         磁盘并行读写;
     提高耐用性:
         磁盘冗余来实现;

二、RAID级别

  RAID也是有级别之分的,只不过彼此的级别没有谁高谁低之分的,它只不过表示的是其磁盘的格式是不一样的,或者说多块硬盘组织在一起的工作方式有所不同,这个我们称之为级别。那么RAID的实现方式也是分为硬RAID和软RAID两种方式来实现,硬RAID是通过RAID控制器或者是RAID扩展卡来实现的,而软RAID是由系统来实现的,只不过软RAID不推荐在生产环境中使用。

    级别:多块磁盘组织在一起的工作方式有所不同;
    RAID的实现方式:
        外接式磁盘阵列:通过扩展卡提供适配能力;
        内接式RAID:主板集成RAID控制器;
        Software RAID:

  不过在硬RAID中,前两种方式是我们是通过BIOS来进行管理的,那么我们现在介绍一下RAID每个级别的工作方式。刚才我们也讲过,RAID级别并没什么性能高低或者说级别上下之分,仅仅用于标识磁盘组织形式上的不同,所以这个级别是一种代称,那么常用的级别有0-6,其该级别总结如下:

   级别:level
     代称,知识说明磁盘的组织形式不同
     RAID-0:0, 条带卷, strip;
     RAID-1:1, 镜像卷, mirror;
     RAID-2
     ... ...
     RAID-5:
     RAID-6:
     RAID-10:
     RAID-01

2.1 RAID-0

  我们先来说一下RAID-0,其实RAID-0就是将多块IO设备平行并当作一块IO设备并行组织的一种磁盘结构,例如有两块硬盘链接到RAID控制器中,存储数据时,数据流会经过RAID控制器,RAID控制器就会将数据流切分成多块,这个块和文件系统的块并不是一样的,因为并没有到文件系统当中,而是将数据切好之后,放置在不同的磁盘里,那么数据对于磁盘的占用量有多大,是由RAID控制器自行分割机制处理的,而这个分割的块称之为chunk,并不是block,因为这个chunk是由该控制器所决定的,并不是由该磁盘上的文件系统决定。所以,控制器分割好了之后,就会分散到各个磁盘当中,那么第一个块给了第一个磁盘,第二个块给了第二个,以此类推。那么有10G的文件数据,经过分割之后,每个磁盘就会各得5G左右的数据,使得节约了磁盘空间。这个我们就称之为条带化,因为这个条带化以后,分散到各个磁盘中去存储。  

  缺点就是耐用性就会得到下降,例如其中一块损坏则就无法工作,毕竟没有冗余能力,所以无法存储关键数据。我们来总结以下RAID-0:

     RAID-O:
         读、写性能提升:
         可用空间:N*min(S1,S2,...)
         无冗余能力
         最少磁盘数:2, 2+

1519052251(1).jpg

2.2 RAID-1

  RAID-0是一个极端,因为它没有冗余能力,有些时候数据的关键性是非常重要的一件事,其中一块硬盘坏掉了则业务无法推进,所以我们必须保证既能存储一些关键数据,又能保证业务不会终止,所以就有了RAID-1的概念。对于RAID-1而言,也是存储刚才那些数据,也是利用至少两块磁盘来进行组织,但是这个数据的存储分割成为chunk之后,每一个磁盘都要存储一份数据,如果其中一块硬盘损坏,则不影响数据的正常的读写进度,所以该机制是允许一块硬盘损坏。但是带来的结果为存储空间减少了一半左右,读性能提升,但写能力没有提升,还很有可能会下降,因为要创建许多的副本。

     RAID-1:
         读性能提升,写能力略有下降;
         可用空间:1*min(S1,S2,...)
         有冗余能力;
         最少磁盘数:2, 2+

1519052701(1).jpg

2.3 RAID-4

  RAID-0和RAID-1都是极端,前者性能提升,后者可以冗余。那么我们也需要一种级别来将这两个级别都能够兼具组合起来,RAID-2,3,4就是提供这种能力的,但2和3不常见,我们就直接说RAID-4。对于RAID-4来讲,是将3块以上的磁盘组织成一个RAID,而后在存储数据时,其中一块磁盘用于存储校验码,所以当一个数据需要存储时,仍然将数据切割成chunk,则就变成了第一块磁盘存储chunk1,第二块磁盘存储chunk2,最后一个磁盘存储的是数据的校验码,进行异或存储。例如第一块存储的是1101,第一个存储的是0010,则校验码为1111,这样的作用就是,假设第二块硬盘损坏,通过第一块和第三块硬盘进行异或计算,则就得出第二块所存储的数据。
  异或运算就是数字相同则为0,数字不同则为1。但要如果三块硬盘当中两块同时损坏,则就无法计算,数据则丢失。允许一块损坏可以,因为更换硬盘之后可以通过计算将数据找回来,没有更换的话数据可以读取与写入,只不过需要通过运算才能得到数据,不过这样就会对磁盘的压力非常大,损坏率也会增加,像这种情况一块硬盘损坏依然在线工作我们就称之为降级模式,为了保险起见,将损坏的硬盘取出,换上新的硬盘,将业务暂停,用两块的硬盘数据对位异或运算生成的数据放置在该磁盘空间里,这样就能够发挥该级别的最大作用,但不能允许两块同时损坏。
  RAID-4还有一个固有的缺陷,就是将其中一个磁盘当作成了校验盘,而校验盘不管是那个磁盘读取该数据,都得访问校验盘来进行校验,所以比前两个硬盘的IO压力还要大,出现性能瓶颈,但是能允许一块硬盘损坏,使之降级工作,所以需要找块新的硬盘来进行替换,或者添加一块在添加一块新的空闲磁盘。检测所其中一块磁盘损坏时,新的空闲磁盘能够迅速替补上去,之后将损坏的硬盘进行更换,更换完成之后将它变成为空闲磁盘。

image.png

2.5 RAID-5

  刚才在RAID-4中我们讲过,将其中一块磁盘作为校验盘对于它的IO的读写压力是非常大的,以及有可能会导致性能瓶颈所在。因此,对于RAID-5而言,采用一种循环校验的方式,比如说,第一块数据存储在第一块磁盘上,第二块数据存储在第二块磁盘上,校验码放置的在第三块磁盘。接着,第三块数据存储在第二块磁盘上,第四块数据存储在第三块磁盘上,那么校验码就放在第一块磁盘上。在接着,第五块数据存放于第三块磁盘上,第六块数据存储于第一块磁盘上,那么校验码放置在第二块磁盘上。以此类推,轮流存储,访问均衡。
  一般来讲RAID-5的校验码的组织格式是由左对齐的方式来对chunk进行布局。

     RAID-5:
         读、写性能提升
         可用空间:(N-1)*min(S1,S2,...)
         有容错能力:1块磁盘
         最少磁盘数:3, 3+

image.png

2.6 RAID-6

  在RAID-5中,是可以允许损坏一个磁盘,不过要是两块损坏也是有可能的,那么为了防止两个一同损坏,RAID-6就是提供了此解决方案,用两块磁盘做循环校验,也就是说,校验码在每个磁盘上存储两次。

    RAID-6:
        读、写性能提升
        可用空间:(N-1)*min(S1,S2,...)
        有容错能力:2块硬盘
        最少磁盘:4, 4+

image.png

三、混合类型

  RAID-1和RAID-0进行组合我们就称之为混合类型,通常组合为RAID-10和RAID-01,那么10就表示先俩俩一组做成RAID-1,在将这些RAID-1做成RAID-0。那么01就是先分成两组先做成RAID-0,再将两组的RAID-0组成RAID-1。

3.1 RAID-10

  所谓的RAID-10就表示,假设共有六块硬盘,先做RAID-1,后做RAID-0,则意味着六块硬盘俩俩一组,每一组就是一个镜像卷,共有三组镜像,磁盘空间率为50%,做成RAID-1,在这个较高的级别之上,我们把三组RAID-1组织成RAID-0即可,所以我们组织数据大致上存储任何数据先切割成三块,每一组镜像卷发一块,而每一组的数据都要存储两份。那么其中一组镜像卷中的磁盘损坏,对于该组的磁盘以及其它组的磁盘并不影响,但是某个组里两个同时损坏,则麻烦很大,虽然几率很低。这也是比较理想,也比较靠谱的一种存储机制。

    RAID-10:
        读、写性能提升
        可用空间:N*min(S1,S2,...)/2
        有容错能力:每组镜像最多只能坏一块;
        最少磁盘数:4, 4+

image.png

3.2 RAID-01

  所谓的RAID-01就表示,假设也共有六块硬盘,则先做RAID-0,把六块磁盘分成两组,因为镜像通常分成两两一组,先把其中三块磁盘做成RAID-0,也就是我们称为的条带,然后将这两组条带做成镜像,也就是RAID-1,它们的空间利用率也是50%,把数据chunk成两块以后,在较高级别的RAID-1中复制出两份,第一组一份,第二组一份,而后将每组的数据切割成三片,每组都存储一片,但相比10来说,切割次数过多,另一个来说就是镜像卷损坏则有一组无法进行存储。

image.png

3.3 JBOD

  JBOD的全称为just a Bunth Of Disk,说白了就是仅仅一组磁盘而已,各个磁盘没有谁大谁小之分,所以它的功能就是:

    JBOD:just a Bunth Of Disks
        功能:将多块磁盘的空间合并成一个大的连续空间使用;
        可用空间:sum(S1,S2,...)

  我们现在总结以下常用级别:

   常用级别:RAID-0, RAID-1, RAID-5, RAID-50, JBOD

四、实现方式

  我们刚才讲到过RAID的实现方式共有两种,分别为:

   实现方式:
     硬件实现方式
     软件实现方式

  由于硬件条件的显示,硬RAID就不实现了,我们可以实现软RAID,不过在生产环境中我们不可能使用软RAID,那么下面我们在CentOS 6或7中实现软raid方式来实现。在6中是利用一个内核模块,该模块的功能是将多个设备磁盘进行组合,这个模块的名称为md模块(mutil devices),由内核组合成一个设备,抽象之后向用户空间提供系统调用接口就可以了。

  为了与md模块进行一个通信,我们需要在用户空间中使用一个管理md模块的一个工具或命令,该命令为mdadm(multi disk admin)工具,它是一种模式化的工具,支持许多模式,比如管理模式以及追踪模式。

    CentOS 6上的软件RAID的实现:
        结合内核中的md(multi devices)
        
        mdadm:模式化的工具
            命令的语法格式:mdadm [mode] <raiddevice> [options] <component-device>
                支持的RAID级别:LINEAR, RAID0, RAID1, RAID5, RAID6, RAID10
                
            模式:
                创建:-C
                装配:-A
                监控:-F
                管理:-f, -r, -a

  那么就是raid设备,通常在/dev/md#路径中,不过需要注意的是,CentOS 6和7对md识别是会有变化的,重启之后很有可能会更改md号,而对于不同的模式来说,其选项也是有所不同的,而可以为任意块设备。

   <raiddevice>: /dev/md#
   <component-devices>: 任意块设备

  在软RAID添加一块硬盘没有必要,所以我们就以分区为例来创建软RAID。
  首先我们先说一下创建模式:

   -C:创建模式
     -n #:使用#个块设备来创建此RAID;
     -l #:指明要创建的RAID级别;
     -a {yes|no}:自动创建目标为RAID设备的设备文件;
     -c CHUNK_SIZE:指明块大小;
     -x #:指明空闲的个数;前提需要是否有冗余功能;

  例如:创建一个10G可用的RAID-5:

   # mdadm -C /dev/md0 -a yes -n 3 -x 1 -l 5 /dev/sda{7,8,9,10}

  创建并格式化完成之后,我们可以查看该raid分区,我们使用-D选项:

   -D:显示raid的详细信息
    mdadm -D /dev/md#

  现在我们将该raid设备其中一块分区标记为损坏,使用-f选项。

   # mdadm /dev/md0 -f /dev/sda7

  这时候查看/proc/mdstat,会重新进行位与位之间的同步,我们可以使用watch命令,每个一秒动态显示该文件的进度。

   # watch -n1 `cat /proc/mdstat`

  那么现在我们将刚才标记为损坏的盘重新添加进去。

   # mdadm /dev/md0 -a /dev/sda7

  通过以上的步骤,我们可以基本掌握软raid的管理操作,那么我们现在总结以下raid的管理模式。

   管理模式:
     -f:标记指定磁盘为损坏;
     -a:添加磁盘;
     -r:移除磁盘;
    
   观察md的状态:
     # cat /proc/mdstat

  如果想raid设备停止的话,我们则可以停止该raid设备。

   停止md的状态:
     mdadm -S /dev/md#

  那么刚才讲到的的watch命令就是能够在指定某个时间动态刷新显示该命令信息,其命令选项为:

   -n #:刷新时间,单位为秒;

   watch -n# 'COMMAND'