linux从青铜到王者-详解磁盘阵列

560 阅读9分钟

这是我参与更文挑战的第12天, 活动详情查看:更文挑战

大家好,我是互联网老辛,今天我们来探讨磁盘阵列raid磁盘阵列。

一. RAID的概念

关于raid的概念,在百科中是这么定义的:

磁盘阵列(Redundant Arrays of Independent Disks,RAID),有“独立磁盘构成的具有冗余能力的阵列”之意。 磁盘阵列是由很多价格较便宜的磁盘,以硬件(RAID卡)或软件(MDADM)形式组合成一个容量巨大的磁盘组,利用多个磁盘组合在一起,提升整个磁盘系统效能。

利用这项技术,将数据切割成许多区段,分别存放在各个硬盘上。 磁盘阵列还能利用同位检查(Parity Check)的观念,在数组中任意一个硬盘故障时,仍可读出数据,在数据重构时,将数据经计算后重新置入新硬盘中

总结成一句话就是: RAID是磁盘荣誉阵列,作用是提升读写速率,并且可以有容错功能。

RAID的基本思想: 把几块硬盘通过一定的组合方式把它组合起来,形成一个新的硬盘阵列组,从而让新的磁盘阵列组能够达到高性能硬盘的要求。

二. RAID的类型

在这里插入图片描述

  • raid 0 RAID0 是一种非常简单的的方式,它将多块磁盘组合在一起形成一个大容量的存储。当我们要写数据的时候,会将数据分为N份,以独立的方式实现N块磁盘的读写,那么这N份数据会同时并发的写到磁盘中,因此执行性能非常的高。

image.png

  • raid 1 RAID1 是磁盘阵列中单位成本最高的一种方式。因为它的原理是在往磁盘写数据的时候,将同一份数据无差别的写两份到磁盘,分别写到工作磁盘和镜像磁盘,那么它的实际空间使用率只有50%了,两块磁盘当做一块用,这是一种比较昂贵的方案。

RAID1其实与RAID0效果刚好相反。RAID1 这种写双份的做法,就给数据做了一个冗余备份。这样的话,任何一块磁盘损坏了,都可以再基于另外一块磁盘去恢复数据,数据的可靠性非常强,但性能就没那么好了。

image.png

  • raid 5

RAID5模式中,不再需要用单独的磁盘写校验码了。它把校验码信息分布到各个磁盘上。例如,总共有N块磁盘,那么会将要写入的数据分成N份,并发的写入到N块磁盘中,同时还将数据的校验码信息也写入到这N块磁盘中(数据与对应的校验码信息必须得分开存储在不同的磁盘上)。一旦某一块磁盘损坏了,就可以用剩下的数据和对应的奇偶校验码信息去恢复损坏的数据。

这是目前用的最多的一种方式。 因为 RAID5 是一种将 存储性能、数据安全、存储成本 兼顾的一种方案。

image.png

RAID5的方式,最少需要三块磁盘来组建磁盘阵列,允许最多同时坏一块磁盘。如果有两块磁盘同时损坏了,那数据就无法恢复了。

  • raid 10 RAID10兼备了RAID1和RAID0的有优点。首先基于RAID1模式将磁盘分为2份,当要写入数据的时候,将所有的数据在两份磁盘上同时写入,相当于写了双份数据,起到了数据保障的作用。且在每一份磁盘上又会基于RAID0技术讲数据分为N份并发的读写,这样也保障了数据的效率。

但也可以看出RAID10模式是有一半的磁盘空间用于存储冗余数据的,浪费的很严重,因此用的也不是很多。

image.png

1. RAID的实现方式:
  • 硬RAID: 需要RAID卡,有自己的cpu,处理速度极快
  • 软RAID : 通过操作系统实现,windows,Linux都可以实现

我们今天来模拟软raid5的实现方式

2. 软raid 5 的实现方式

本次的实验步骤: 1) 创建4块硬盘 2) 创建RAID 3)格式化,挂载 4) 查看RAID信息 5) 模拟其中一块硬盘坏掉的情况 6) 将修好的磁盘重新加入到已经存在的阵列中

1) 新增加一块硬盘并创建5个分区

在这里插入图片描述 对新增加的硬盘分区成5个,来模拟五块硬盘。

[root@xinsz08-15 ~]# ll /dev/sd*   #目前现有的分区
brw-rw---- 1 root disk 8,  0 6月  29 05:45 /dev/sda
brw-rw---- 1 root disk 8,  1 6月  29 05:45 /dev/sda1
brw-rw---- 1 root disk 8,  2 6月  29 05:45 /dev/sda2
brw-rw---- 1 root disk 8,  3 6月  29 05:45 /dev/sda3
brw-rw---- 1 root disk 8, 16 6月  29 05:45 /dev/sdb

[root@xinsz08-15 ~]# fdisk /dev/sdb

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 
Value out of range.
Partition number (1-4): 1
First cylinder (1-3263, default 1): 
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-3263, default 3263): +5G

Command (m for help): 

按照上面的分区方法,一共分了四个区,分别都是5G

注意: 逻辑分区无法做磁盘阵列

[root@xinsz08-15 ~]# ll /dev/sdb*
brw-rw---- 1 root disk 8, 16 6月  29 06:02 /dev/sdb
brw-rw---- 1 root disk 8, 17 6月  29 06:02 /dev/sdb1
brw-rw---- 1 root disk 8, 18 6月  29 06:02 /dev/sdb2
brw-rw---- 1 root disk 8, 19 6月  29 06:02 /dev/sdb3
brw-rw---- 1 root disk 8, 20 6月  29 06:02 /dev/sdb4


2. 创建RAID

[root@xinsz08-15 ~]# yum install mdadm

mdadm 的基本参数:

参数作用
C创建RAID
/dev/m0第一个RAID设备
-L5RAID5
-nRAID成员的数量
-x热备磁盘的数量
-a添加热备
-G热备转变为成员身份

接下来我们创建第一个RAID设备,做一个raid 5, 用3块盘做阵列,在加上一块做热备。

[root@xinsz08-15 ~]# mdadm -C /dev/md0 -l5 -n3 -x1 /dev/sdb{1,2,3,4}
mdadm: /dev/sdb4 appears to be part of a raid array:
       level=raid0 devices=0 ctime=Thu Jan  1 08:00:00 1970
mdadm: partition table exists on /dev/sdb4 but will be lost or
       meaningless after creating array
mdadm: largest drive (/dev/sdb4) exceeds size (5249024K) by more than 1%
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.

[root@xinsz08-15 ~]# mdadm -D -s > /etc/mdadm.conf #设置开机生效

查询现有的阵列

  [root@xinsz08-15 ~]# mdadm -D -s
ARRAY /dev/md0 metadata=1.2 spares=1 name=xinsz08-15:0 UUID=85d2c0f0:d2e390b4:6f91164c:c7e3f691

[root@xinsz08-15 ~]# mdadm -D -s /dev/md0   # 直接指定磁盘阵列的名字MD0
ARRAY /dev/md0 metadata=1.2 spares=1 name=xinsz08-15:0 UUID=85d2c0f0:d2e390b4:6f91164c:c7e3f691

3. 格式化挂载
[root@xinsz08-15 ~]# mkfs.ext4 /dev/md0   # 把磁盘阵列格式化为ext4系统
mke2fs 1.41.12 (17-May-2010)
文件系统标签=
操作系统:Linux
块大小=4096 (log=2)
分块大小=4096 (log=2)
Stride=128 blocks, Stripe width=256 blocks
657072 inodes, 2624512 blocks
131225 blocks (5.00%) reserved for the super user
第一个数据块=0
Maximum filesystem blocks=2688548864
81 block groups
32768 blocks per group, 32768 fragments per group
8112 inodes per group
Superblock backups stored on blocks: 
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632

正在写入inode表: 完成                            
Creating journal (32768 blocks): 完成
Writing superblocks and filesystem accounting information: 完成

This filesystem will be automatically checked every 32 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.
[root@xinsz08-15 ~]# 

创建挂载目录并挂载

[root@xinsz08-15 ~]# mkdir /mnt/raid5
[root@xinsz08-15 ~]# mount /dev/md0 /mnt/raid5
[root@xinsz08-15 ~]# df -h
/dev/md0        9.8G   23M  9.3G   1% /mnt/raid5
[root@xinsz08-15 ~]# 
4. 再次查看raid信息
[root@xinsz08-15 ~]# mdadm -D /dev/md0    #查看磁盘信息
/dev/md0:   #磁盘名字  
        Version : 1.2   #磁盘版本
  Creation Time : Mon Jun 29 06:03:43 2020   #创建磁盘阵列的时间
     Raid Level : raid5       #磁盘阵列为riad5
     Array Size : 10498048 (10.01 GiB 10.75 GB)
  Used Dev Size : 5249024 (5.01 GiB 5.38 GB)
   Raid Devices : 3     #三块盘组成的RAID阵列
  Total Devices : 4     #总共四快盘,因为还有个备用盘
    Persistence : Superblock is persistent

    Update Time : Mon Jun 29 06:09:43 2020
          State : clean 
 Active Devices : 3    #活动磁盘3个
Working Devices : 4    #总共四个
 Failed Devices : 0    #坏掉的0个
  Spare Devices : 1    #共享备用盘1块

         Layout : left-symmetric
     Chunk Size : 512K

           Name : xinsz08-15:0  (local to host xinsz08-15)
           UUID : 85d2c0f0:d2e390b4:6f91164c:c7e3f691
         Events : 18

    Number   Major   Minor   RaidDevice State
       0       8       17        0      active sync   /dev/sdb1
       1       8       18        1      active sync   /dev/sdb2
       4       8       19        2      active sync   /dev/sdb3

       3       8       20        -      spare   /dev/sdb4
[root@xinsz08-15 ~]# 

5. 模拟坏掉一块盘,并移除

终端一:模拟坏掉一块磁盘并移除

-f 模拟坏掉,-r 移除

[root@xinsz08-15 ~]# mdadm /dev/md0 -f /dev/sdb2 -r /dev/sdb2

mdadm: set /dev/sdb2 faulty in /dev/md0
mdadm: hot removed /dev/sdb2 from /dev/md0

终端二: 查看变化 [root@xinsz08-15 ~]# watch -n 0.5 'mdadm -D /dev/md0'

在这里插入图片描述

最后会看到 spare Devices的备用盘,变成了知working盘。 总盘数变成了3个。

6. 将刚才被删除的sdb2修复好后,再次添加到阵列中
[root@xinsz08-15 ~]# mdadm /dev/md0 -a /dev/sdb2
mdadm: added /dev/sdb2

查看: 可以看到sdb2变成了热备盘

[root@xinsz08-15 ~]# mdadm -D /dev/md0
/dev/md0:
        Version : 1.2
  Creation Time : Mon Jun 29 06:03:43 2020
     Raid Level : raid5
     Array Size : 10498048 (10.01 GiB 10.75 GB)
  Used Dev Size : 5249024 (5.01 GiB 5.38 GB)
   Raid Devices : 3
  Total Devices : 4
    Persistence : Superblock is persistent

    Update Time : Mon Jun 29 06:29:52 2020
          State : clean 
 Active Devices : 3
Working Devices : 4
 Failed Devices : 0
  Spare Devices : 1

         Layout : left-symmetric
     Chunk Size : 512K

           Name : xinsz08-15:0  (local to host xinsz08-15)
           UUID : 85d2c0f0:d2e390b4:6f91164c:c7e3f691
         Events : 39

    Number   Major   Minor   RaidDevice State
       0       8       17        0      active sync   /dev/sdb1
       3       8       20        1      active sync   /dev/sdb4
       4       8       19        2      active sync   /dev/sdb3

       5       8       18        -      spare   /dev/sdb2

总结:

磁盘阵列是个很重要的概念,需要多参考实验去认真做一遍。