• RAID RAID 大揭秘~


    前言

    在我们日常使用计算机的过程中,我们的数据都是保存在硬盘上的,我们的计算机是先将硬盘的数据传递给内存,然后CPU再从内存中加载数据来进行运算,由此看来,硬盘对于我们计算机的性能影响还是很大的。但是现在我们磁盘的缺陷也很明显:I/O性能极差,稳定性极差。

    如果一个硬盘发生了故障或损坏,那么这块硬盘就不能再使用了。硬盘坏了不当紧,但是里面的数据可是全部没有了啊!在生产环境中,这个影响可是相当大的。正因如此,诞生了一种新的技术——RAID

     

    一、RAID简介

    1.1 RAID由来

    RAIDRedundant Array of Inexpensive Disks)称为廉价磁盘冗余阵列。在1988年由加利福尼亚大学伯克利分校提出的。

    RAID 就是把多个磁盘合成一个阵列来提供更好的性能、冗余,或者两者都提供。

    1.2 RAID优点

    提高I/O能力:磁盘并行读写。

    提高耐用性:通过磁盘冗余(容错)机制来实现。

    1.3 RAID实现的方式

    外接磁盘阵列:通过扩展卡提供适配能力。

    内接式RAID:主板集成RAID控制器。(安装OS前在BIOS里配置)

    软件RAID:通过软件方式实现RAID功能。

    1.4 如何操作实现RAID

    在安装操作系统之前通过BIOS进行设置

    此种方式主要目的在于将操作系统安装在RAID之上。

    在安装操作系统之后通过BIOS或软件进行设置

    此种方式主要目的在于将操作系统和其他专用分区(如数据盘)独立开来。

     

    二、RAID级别

    级别就是将多块磁盘组织在一起的工作方式,不同级别组合起来的磁盘具有不同的功能。

    常用的RAID级别有RAID-0RAID-1RAID-5,RAID-10,RAID-50。接下来我们就来详细说一下这几种级别。

    2.1 RAID-0

    RAID-0:条带卷

    这种模式的RAID会将磁盘先切出等量的区块,当一个文件要写入RAID时,该文件会依据区块的大小切割好,然后再依序放到各个磁碟里面去。由于每个磁盘会交错的存放数据,因此当你的数据要写入RAID时,数据会被等量的放置在各个磁盘上面。举例来说,你有两颗磁盘组成RAID-0,当你有100MB的数据要写入时,每个磁盘会各被分配到50MB的储存量。具体如下图:

     在RAID-0模式下:

    读、写性能提升;

    可用空间:N * minS1S2);

    无容错能力;

    最少磁盘数:至少两块。

     

    2.2 RAID-1

    RAID-1:镜像卷

    在该模式下,每个磁盘读入的时一样的数据,相当于把数据备份到多个磁盘中。磁盘数越多,浪费的越多,但是安全性越高。具体如下图:

    RAID-2模式下:

    读性能提升、写性能略有下降;

    可用空间:1 * minS1S2);

    有冗余能力;

    最少磁盘数:22N

     

    2.3 RAID-4

    RAID-4模式需要三块或更多的磁盘,其中一个磁盘为校验盘,并以RAID-0方式将数据写入其他磁盘。具体如下图:

     

    RAID4模式下,假设只有三块盘,那么两块数据磁盘的数据一致,则校验盘存为0,如果两块数据盘的数据不一致,则校验盘存为1。如果有多块盘,值为1的块数相加为偶数,则校验盘值1,值为1的块数相加为奇数,则校验盘值0

    由上可得,如果一个磁盘出现故障,那么可以使用校验信息来重建数据,如果有两个磁盘出现故障,那么所有的数据都将丢失。

    RAID-4模式下:

        读、写性能提升

    可用空间:(N - 1* minS1S2);

    有冗余能力:允许最多1块磁盘损坏;

    最少磁盘数:33+

     

    2.4 RAID-5

    RAID-5可以用在三块或更多的磁盘上,并使用0块或更多的备用磁盘。总体和RAID-4很相近,最大的区别就是校验信息均匀分布在各个驱动器上,这样就避免了RAID-4中出现的瓶颈问题。具体如下图所示:

    从上图可以看出,在RAID-5中,即使其中一块硬盘发生了损坏,也能通过其他硬盘以及 校验信息对数据进行恢复使用。但是如果2块或2块以上的硬盘发生了损坏 ,整个数据也就坏了。

    RAID-5模式下:

        读、写性能提升

    可用空间:(N - 1* minS1S2);

    有冗余能力:允许最多1块磁盘损坏;

    最少磁盘数:33+

     

    2.5 RAID-01RAID-10

    RAID-01RAID-10都是有RAID-1RAID-0组合而成的,只是组成的顺序不一样,所以其效果也有所不同。

    RAID-01就是先做条带,再做镜像。

    RAID-10就是先做镜像,再做条带

    接下来我们以4个盘为例,来比较说明两者在安全性上面的差别

    •    RAID-01的情况:

    这种情况下,我们仍然假设磁盘1损坏,这时左边的RAID-0将无法读取。在剩下的三块盘中,只要磁盘3或者磁盘4这两个盘中任意一个损坏,都会导致整个RAID失效,我们可简单的计算故障率为2/3

    •       RAID-10的情况:

    这种情况下,我们假设磁盘1损坏时,在剩下的3块盘中,只有磁盘2一个盘发生故障时,才会导致整个RAID失效,我们可以简单的计算故障概率为1/3

     

    从数据存储的逻辑位置来看,在正常的情况下RAID-01RAID-10是完全一样的,而且每一个读写操作所产生的IO数量也是一样的,所以在读写性能上两者没什么区别。只有当磁盘发生故障时,两者才会发生区别,同时,RAID-10的读性能也会优于RAID-01

     

    三、软RAID的实现方式——mdadm

    RAID的实现方式有两种,上文中我们已经提到过了,在生产环境中,我们通常使用软件实现方式,下面我们就来详细说一下软件怎么实现RAID

    软件实现RAID是通过软件工具mdadm来实现的。mdadm是一个模式化的工具。

    3.1 基础命令简介

    命令:mdadm

    格式:mdadm [mode] < > [options] <component-devices>

    支持的RAID级别:RAID-0RAID-1RAID-4RAID-5RAID-6RAID-10

    模式[mode]:创建、装配、监控、管理

    < raiddevice >/dev/md#

    <component-devices>:任意块设备

    选项:

    -C

    创建RAID,有以下子选项

    -n #: 使用#个块设备来创建此RAID

    -l #:指明要创建的RAID的级别

    -a {yes|no}:自动创建目标RAID设备的设备文件

    -c CHUNK_SIZE: 指明块大小(仅限RAID-0,RAID-5)

    -x #: 指明空闲盘(热备盘)的个数(RAID-0不支持)

    -D

    显示RAID的详细信息

    Mdadm -D /dev/md#

    Mdadm -D -s  > /etc/mdadm.conf 把信息导入至/etc/mdadm.conf文件(全部)如果-s后跟着具体md名,则导入该RAID信息

    -A

    装配模式,重新识别此前实现RAID (依赖于/etc/mdadm.conf文件)

    -F

    监控模式

    管理模式

    -f:标记制定磁盘为损坏

    -a:添加磁盘

    -r:移除磁盘

    观察md的状态: cat /proc/mdstat

    停止md设备:mdadm -S /dev/md#

     

    3.2 具体实例——创建软RAID

    上文中我们已经提到了创建RAID的命令,接下来我们通过实例演示一下如何具体创建RAID

    实例1:某台机器上有4块空闲的硬盘,分别是/dev/sdb/dev/sdc/dev/sdd/dev/sde,并用这四块硬盘来创建来创建一个RAID 5,具体操作步骤如下:

    1)创建分区 使用fdisk命令对每个硬盘进行分区,如果是直接基于磁盘来创建RAID设备,那么久可以跳过这一步。具体命令如下:

     1 [root@centos7 ~]$  fdisk /dev/sdb
     2 
     3 Welcome to fdisk (util-linux 2.23.2).
     4 
     5  
     6 
     7 Changes will remain in memory only, until you decide to write them.
     8 
     9 Be careful before using the write command.
    10 
    11  
    12 
    13 Device does not contain a recognized partition table
    14 
    15 Building a new DOS disklabel with disk identifier 0xb9dfb808.
    16 
    17  
    18 
    19 Command (m for help): n
    20 
    21 Partition type:
    22 
    23    p   primary (0 primary, 0 extended, 4 free)
    24 
    25    e   extended
    26 
    27 Select (default p): p
    28 
    29 Partition number (1-4, default 1): 1
    30 
    31 First sector (2048-41943039, default 2048):
    32 
    33 Using default value 2048
    34 
    35 Last sector, +sectors or +size{K,M,G} (2048-41943039, default 41943039): +2G
    36 
    37 Partition 1 of type Linux and of size 2 GiB is set
    38 
    39  
    40 
    41 Command (m for help): w
    42 
    43 The partition table has been altered!
    44 
    45  
    46 
    47 Calling ioctl() to re-read partition table.
    48 
    49 Syncing disks.

    对剩余三个硬盘做相同的操作即可。

    2)创建RAID-5

    创建完/dev/sdb1/dev/sdc1/dev/sdd1/dev/sde1四个分区以后,下面就可以来创建RAID-5了,其中设定/dev/sde1为热备盘,其余为活动设备。操作如下:

     1 [root@centos7 ~]$  mdadm -C /dev/md0 -a yes -l 5 -n 3 -x 1 /dev/sd[b-e]1    ------创建/dev/md0
     2 mdadm: Defaulting to version 1.2 metadata
     3 mdadm: array /dev/md0 started.
     4 [root@centos7 ~]$  mdadm -D /dev/md0      --------查看/dev/md0的详细信息
     5 /dev/md0:
     6         Version : 1.2
     7   Creation Time : Sun Aug 27 10:56:04 2017
     8      Raid Level : raid5
     9      Array Size : 4190208 (4.00 GiB 4.29 GB)
    10   Used Dev Size : 2095104 (2046.00 MiB 2145.39 MB)
    11    Raid Devices : 3
    12   Total Devices : 4
    13     Persistence : Superblock is persistent
    14 
    15     Update Time : Sun Aug 27 10:56:15 2017
    16           State : clean
    17  Active Devices : 3
    18 Working Devices : 4
    19  Failed Devices : 0
    20   Spare Devices : 1
    21  
    22          Layout : left-symmetric
    23      Chunk Size : 512K
    24  
    25            Name : centos7.3:0  (local to host centos7.3)
    26            UUID : c3726f6c:1ac41210:60a9406e:9b9a32fc
    27          Events : 18
    28 
    29     Number   Major   Minor   RaidDevice State
    30        0       8       17        0      active sync   /dev/sdb1
    31        1       8       33        1      active sync   /dev/sdc1
    32        4       8       49        2      active sync   /dev/sdd1
    33 
    34        3       8       65        -      spare   /dev/sde1

    3)创建RAID的配置文件

    RAID的配置文件名为mdadm.conf,默认是不存在的,所以需要手动创建,该配置文件存在的主要作用是系统启动的时候能够自动加载软RAID,同时也方便日后管理,比如当我们使用mdadm -S停用了某磁盘时,可以用mdadm -A恢复,而mdadm -A命令就依赖于mdadm.conf文件,如果我们没有生成mdadm.conf文件,在恢复的时候就要手动制定该RAID的组成盘。生成RAID配置文件操作如下:

     

    1 [root@centos7 ~]$  mdadm -D -s > /etc/mdadm.conf

    上面这条命令是将所有的RAID成员信息保存至mdadm.conf文件,如果想要保存或者追加单个RAID的成员信息,在-s 后跟上RAID名即可。

    4)创建文件系统

    接下来只需要在RAID设备上创建文件系统就可以使用了,在RAID上创建文件系统的命令和在分区或磁盘上创建文件系统的命令是一样的:

     1 [root@centos7 ~]$  mkfs.ext3 /dev/md0
     2 mke2fs 1.42.9 (28-Dec-2013)
     3 Filesystem label=
     4 OS type: Linux
     5 Block size=4096 (log=2)
     6 Fragment size=4096 (log=2)
     7 Stride=128 blocks, Stripe width=256 blocks
     8 262144 inodes, 1047552 blocks
     9 52377 blocks (5.00%) reserved for the super user
    10 First data block=0
    11 
    12 Maximum filesystem blocks=1073741824
    13 32 block groups
    14 32768 blocks per group, 32768 fragments per group
    15 8192 inodes per group
    16 Superblock backups stored on blocks:
    17     32768, 98304, 163840, 229376, 294912, 819200, 884736
    18 
    19 Allocating group tables: done                           
    20 Writing inode tables: done                           
    21 Creating journal (16384 blocks): done
    22 Writing superblocks and filesystem accounting information: done

    创建完文件系统后,将该设备挂载上就可以正常使用了。

    如果要创建其他级别的RAID,其步骤与创建RAID-5的基本一致,区别在于指定-l的值时,需要将该值设置为相应的级别。

     

    3.3 具体实例——维护软RAID

    在日常使用中,软RAID虽然可以很大程度上保证数据的可靠性,但也不排除其设备损坏的可能性,接下来,我们通过一个实例来介绍更换RAID故障磁盘的完整过程:

    实例2:以上面的实例1为基础,假定“/dev/sdc1”设备出现故障时,更换一个新的磁盘,整个过程的详细说明如下:

    1)模拟故障磁盘

    在实际生活中,当软RAID检测到某个磁盘有故障时,会自动标记该磁盘为故障磁盘,并停止对故障磁盘的读写操作,所以在这里我们需要将/dev/sdc1标记为出现故障的磁盘,命令如下:

    1 [root@centos7 ~]$  mdadm /dev/md0 -f /dev/sdc1
    2 mdadm: set /dev/sdc1 faulty in /dev/md0

    由于我们在实例1中设置了一个备用设备,所以当有标记为故障磁盘出现的时候,备用磁盘会自动顶替故障磁盘工作,阵列也能够在短时间内实现重建。我们可以查看一下当前阵列的状态:

    1 [root@centos7 ~]$  cat /proc/mdstat
    2 Personalities : [raid6] [raid5] [raid4]
    3 md0 : active raid5 sdd1[4] sde1[3] sdc1[1](F) sdb1[0]
    4       4190208 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]
    5 
    6 unused devices: <none>

    上图中可以看出,在sdc1[1]后出现了(F),说明该磁盘出现故障,此时sde1已经顶了上去。

    2)移除故障磁盘

    既然“/dev/sdc1”出现了故障,我们当然要移除该设备。具体操作如下:

    1 [root@centos7 ~]$  mdadm /dev/md0 -r /dev/sdc1
    2 mdadm: hot removed /dev/sdc1 from /dev/md0

    此时,我们再来查看一下/dev/md0的具体信息:

     1 [root@centos7 ~]$  mdadm -D /dev/md0
     2 /dev/md0:
     3         Version : 1.2
     4   Creation Time : Sun Aug 27 10:56:04 2017
     5      Raid Level : raid5
     6      Array Size : 4190208 (4.00 GiB 4.29 GB)
     7   Used Dev Size : 2095104 (2046.00 MiB 2145.39 MB)
     8    Raid Devices : 3
     9   Total Devices : 3
    10     Persistence : Superblock is persistent 
    11 
    12     Update Time : Sun Aug 27 11:32:43 2017
    13           State : clean
    14  Active Devices : 3
    15 Working Devices : 3
    16  Failed Devices : 0
    17   Spare Devices : 0
    18  
    19          Layout : left-symmetric
    20      Chunk Size : 512K
    21 
    22            Name : centos7.3:0  (local to host centos7.3)
    23            UUID : c3726f6c:1ac41210:60a9406e:9b9a32fc
    24          Events : 38
    25 
    26     Number   Major   Minor   RaidDevice State
    27        0       8       17        0      active sync   /dev/sdb1
    28        3       8       65        1      active sync   /dev/sde1
    29        4       8       49        2      active sync   /dev/sdd1

    可以看出,此刻成员已经没有/dev/sdc1了。

    3)添加新硬盘

    由于我们之前的操作都是基于分区的,所以我们添加的新硬盘也要是一个分区。假设我们需要添加的硬盘是“/dev/sdc1”,具体操作如下:

    1 [root@centos7 ~]$  mdadm /dev/md0 -a /dev/sdc1
    2 mdadm: added /dev/sdc1

    现在我们看一看/dev/md0的具体信息

     1 [root@centos7 ~]$  mdadm -D /dev/md0
     2 /dev/md0:
     3         Version : 1.2
     4   Creation Time : Sun Aug 27 10:56:04 2017
     5      Raid Level : raid5
     6      Array Size : 4190208 (4.00 GiB 4.29 GB)
     7   Used Dev Size : 2095104 (2046.00 MiB 2145.39 MB)
     8    Raid Devices : 3
     9   Total Devices : 4
    10     Persistence : Superblock is persistent
    11 
    12     Update Time : Sun Aug 27 11:42:49 2017
    13           State : clean
    14  Active Devices : 3
    15 Working Devices : 4
    16  Failed Devices : 0
    17   Spare Devices : 1
    18 
    19          Layout : left-symmetric
    20      Chunk Size : 512K
    21 
    22            Name : centos7.3:0  (local to host centos7.3)
    23            UUID : c3726f6c:1ac41210:60a9406e:9b9a32fc
    24          Events : 39
    25 
    26     Number   Major   Minor   RaidDevice State
    27        0       8       17        0      active sync   /dev/sdb1
    28        3       8       65        1      active sync   /dev/sde1
    29        4       8       49        2      active sync   /dev/sdd1
    30 
    31        5       8       33        -      spare   /dev/sdc1

    我们可以看到此时/dev/sdc1已经被添加进去了,此时/dev/sdc1自动成为热备盘。

    由于在实例1中的RAID-5设置了一个备用设备,所以即使我们不进行任何添加磁盘的操作,我们的RAID-5也可以继续使用,但是当某块磁盘再出现故障时,就会导致RAID-5没有数据冗余功能,杜宇存放重要数据的设备来说就很不安全了。所以及时添加备用盘是很有必要的诺!

     

    3.4 具体实例——删除软RAID

    上文中,我们介绍了对软RAID的各项操作,接着我们来说一说如何删除一个软RAID。虽然在生产环境中,这个一般不会使用,但是既然有这个功能,我们还是要掌握一下的~

    删除软RAID的本质就是删除其成员的信息,命令如下:

    mdadm --zero-superblock /dev/设备名

    接下来通过实例来说明具体操作:

    实例3:删除实例1创建的RAID-5设备。

    1)解除挂载。当然由于我们上文中并没有把设备挂载到目录上,所以我们就跳过这一步!

    2)查询该RAID由哪些成员组成

     1 [root@centos7 ~]$  mdadm -D /dev/md0
     2 /dev/md0:
     3         Version : 1.2
     4   Creation Time : Sun Aug 27 10:56:04 2017
     5      Raid Level : raid5
     6      Array Size : 4190208 (4.00 GiB 4.29 GB)
     7   Used Dev Size : 2095104 (2046.00 MiB 2145.39 MB)
     8    Raid Devices : 3
     9   Total Devices : 4
    10     Persistence : Superblock is persistent
    11 
    12     Update Time : Sun Aug 27 11:42:49 2017
    13           State : clean
    14  Active Devices : 3
    15 Working Devices : 4
    16  Failed Devices : 0
    17   Spare Devices : 1
    18 
    19          Layout : left-symmetric
    20      Chunk Size : 512K
    21 
    22            Name : centos7.3:0  (local to host centos7.3)
    23            UUID : c3726f6c:1ac41210:60a9406e:9b9a32fc
    24          Events : 39 
    25 
    26     Number   Major   Minor   RaidDevice State
    27        0       8       17        0      active sync   /dev/sdb1
    28        3       8       65        1      active sync   /dev/sde1
    29        4       8       49        2      active sync   /dev/sdd1
    30 
    31        5       8       33        -      spare   /dev/sdc1

    3)停止该RAID

    1 [root@centos7 ~]$  mdadm -S /dev/md0
    2 mdadm: stopped /dev/md0

    4)清空成员信息

    1 [root@centos7 ~]$  mdadm --zero-superblock /dev/sdb1
    2 [root@centos7 ~]$  mdadm --zero-superblock /dev/sdc1
    3 [root@centos7 ~]$  mdadm --zero-superblock /dev/sdd1
    4 [root@centos7 ~]$  mdadm --zero-superblock /dev/sde1

    此时,我们的/dev/md0已经完全删除~

     

  • 相关阅读:
    Python学习4
    Python学习3
    Python学习2
    表空间
    sqlplus常用设置
    HashMap和LinkedHashMap
    堆栈源码
    观察者模式
    策略模式
    java线性表
  • 原文地址:https://www.cnblogs.com/keerya/p/7440118.html
Copyright © 2020-2023  润新知