Linux raid-磁盘阵列-raid10搭建

发布时间 2023-07-04 22:02:47作者: FouroFour

Linux raid-磁盘阵列-raid10搭建

前言

LVM 最大的优势在于可以在不卸载分区和不损坏数据的情况下进行分区容量的调整,但是万一硬盘损坏了,那么数据一定会丟失。 本节讲的 RAID(磁盘阵列)的优势在于硬盘读写性能更好,而且有一定的数据冗余功能。

RAID 简介

RAID(Redundant Arrays of Inexpensive Disks,磁盘阵列),翻译过来就是廉价的、具有冗余功能的磁盘阵列。其原理是通过软件或硬件将多块较小的分区组合成一个容量较大的磁盘组。这个较大的磁盘组读写性能更好,更重要的是具有数据冗余功能。

那什么是数据冗余呢?从字面上理解,冗余就是多余的、重复的。在磁盘阵列中,冗余是指由多块硬盘组成一个磁盘组,在这个磁盘组中,数据存储在多块硬盘的不同地方,这样即使某块硬盘出现问题,数据也不会丟失,也就是磁盘数据具有了保护功能。

读者也可以这样理解,RAID 用于在多个硬盘上分散存储数据,并且能够“恰当”地重复存储数据,从而保证其中某块硬盘发生故障后,不至于影响整个系统的运转。RAID 将几块独立的硬盘组合在一起,形成一个逻辑上的 RAID 硬盘,这块“硬盘”在外界(用户、LVM等)看来,和真实的硬盘一样,没有任何区别。

RAID 0

RAID 0 也叫 Stripe 或 Striping(带区卷),是 RAID 级别中存储性能最好的一个。RAID 0 最好由相同容量的两块或两块以上的硬盘组成。如果组成 RAID 0 的两块硬盘大小不一致,则会影响 RAID 0 的性能。

这种模式下会先把硬盘分隔出大小相等的区块,当有数据需要写入硬盘时,会把数据也切割成相同大小的区块,然后分别写入各块硬盘。这样就相当于把一个文件分成几个部分同时向不同的硬盘中写入,数据的读/写速度当然就会非常快。

RAID 1

RAID 1 也叫 Mirror 或 Mirroring(镜像卷),由两块硬盘组成。两块硬盘的大小最好一致,否则总容量以容量小的那块硬盘为主。RAID 1 就具备了数据冗余功能,因为这种模式是把同一份数据同时写入两块硬盘。

比如有两块硬盘,组成了 RAID 1,当有数据写入时,相同的数据既写入硬盘 1,也写入硬盘 2。这样相当于给数据做了备份,所以任何一块硬盘损坏,数据都可以在另一块硬盘中找回。

RAID 3

必须3块以上的磁盘
磁盘1:0101
磁盘2:1011
异或结果:1110
如果突然磁盘1挂了
目前知道磁盘2的数据是:1011
异或值又是:1110
反推,磁盘1的数据是0101

raid 3 的特点是存储异或值的磁盘不能挂

RAID 5

RAID 5 最少需要由 3 块硬盘组成,当然硬盘的容量也应当一致。当组成 RAID 5 时,同样需要把硬盘分隔成大小相同的区块。当有数据写入时,数据也被划分成等大小的区块,然后循环向 RAID 5 中写入。

每次循环写入数据的过程中,在其中一块硬盘中加入一个奇偶校验值(Parity),这个奇偶校验值的内容是这次循环写入时其他硬盘数据的备份。当有一块硬盘损坏时,采用这个奇偶校验值进行数据恢复。

当有数据循环写入时,每次循环都会写入一个奇偶校验值(Parity),并且每次奇偶校验值都会写入不同的硬盘。这个奇偶校验值就是其他两块硬盘中的数据经过换算之后产生的。因为每次奇偶校验值都会写入不同的硬盘,所以任何一块硬盘损坏之后,都可以依赖其他两块硬盘中保存的数据恢复这块损坏的硬盘中的数据。

需要注意的是,每次数据循环写入时,都会有一块硬盘用来保存奇偶校验值,所以在 RAID 5 中可以使用的总容量是硬盘总数减去一块的容量之和。

比如,在这张示意图中,由三块硬盘组成了 RAID 5,但是真正可用的容量是两块硬盘的容量之和,也就是说,越多的硬盘组成 RAID 5,损失的容量占比越小,因为不管由多少块硬盘组成 RAID 5,奇偶校验值加起来只占用一块硬盘。而且还要注意,RAID 5 不管是由几块硬盘组成的,只有损坏一块硬盘的情况才能恢复数据,因为奇偶校验值加起来只占用了一块硬盘,如果损坏的硬盘超过一块,那么数据就不能再恢复了。

RAID 5 的优点如下: - 因为奇偶校验值的存在,RAID 5 具有了数据冗余功能。 - 硬盘容量损失比 RAID 1 小,而且组成 RAID 5 的硬盘数量越多,容量损失占比越小。 - RAID 5 的数据读/写性能要比 RAID 1 更好,但是在数据写入性能上比 RAID 0 差。

RAID 5 的缺点如下: - 不管由多少块硬盘组成 RAID 5,只支持一块硬盘损坏之后的数据恢复。 - RAID 5 的实际容量是组成 RAID 5 的硬盘总数减去一块的容量之和。也就是有一块硬盘用来保存奇偶校验值,但不能保存数据。

从总体上来说,RAID 5 更像 RAID 0 和 RAID 1 的折中,性能比 RAID 1 好,但是不如 RAID 0;数据冗余比 RAID 0 好,而且不像RAID 1 那样浪费了 50% 的硬盘容量。

RAID 10 或 RAID 01

我们发现,RAID 0 虽然数据读/写性能非常好,但是没有数据冗余功能;而 RAID 1 虽然具有了数据冗余功能,但是数据写入速度实在是太慢了(尤其是软 RAID)。

那么,我们能不能把 RAID 0 和 RAID 1 组合起来使用?当然可以,这样我们就即拥有了 RAID 0 的性能,又拥有了 RAID 1 的数据冗余功能。

我们先用两块硬盘组成 RAID 1,再用两块硬盘组成另一个 RAID 1,最后把这两个 RAID 1 组成 RAID 0,这种 RAID 方法称作 RAID 10。那先组成 RAID 0,再组成 RAID 1 的方法我们作 RAID 01。

软RAID和硬RAID

我们要想在服务器上实现 RAID,可以采用磁盘阵列卡(RAID 卡)来组成 RAID,也就是硬 RAID。RAID 卡上有专门的芯片负责 RAID任务,因此性能要好得多,而且不占用系统性能,缺点是 RAID 卡比较昂贵。

如果我们既不想花钱又想使用 RAID,那就只能使用软 RAID 了。软 RAID 是指通过软件实现 RAID 功能,没有多余的费用,但是更加耗费服务器系统性能,而数据的写入速度比硬 RAID 慢。

搭建RAID10

准备四块磁盘,用于创建raid10,配置vmware虚拟机,创建四个虚拟硬盘

先安装mdadm 使用mdadm命令创建raid

`1.查看磁盘信息`
[root@localhost ~]# fdisk -l | grep sd
磁盘 /dev/sda:21.5 GB, 21474836480 字节,41943040 个扇区
/dev/sda1   *        2048     2099199     1048576   83  Linux
/dev/sda2         2099200    41943039    19921920   83  Linux
磁盘 /dev/sdb:10.7 GB, 10737418240 字节,20971520 个扇区
磁盘 /dev/sdc:10.7 GB, 10737418240 字节,20971520 个扇区
磁盘 /dev/sdd:10.7 GB, 10737418240 字节,20971520 个扇区
磁盘 /dev/sde:10.7 GB, 10737418240 字节,20971520 个扇区

[root@localhost ~]# mdadm
-bash: mdadm: 未找到命令
[root@localhost ~]# yum install mdadm -y

`2.mdadm`
[root@localhost ~]# mdadm -Cv /dev/md0 -a yes -n 4 -l 10 /dev/sdb /dev/sdc /dev/sdd /dev/sde
mdadm: layout defaults to n2
mdadm: layout defaults to n2
mdadm: chunk size defaults to 512K
mdadm: size set to 10476544K
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.

mdadm -Cv /dev/md0 -a yes -n 4 -l 10 /dev/sdb /dev/sdc /dev/sdd /dev/sde
-C 表示创建RAID阵列
-v 显示创建过程
/dev/md0 表示raid阵列的名字
-a yes 表示自动创建阵列设备文件
-n 4 表示4块硬盘创建阵列
-l 10 表示指定raid的级别
最后跟上4块硬盘的名字

`3.针对磁盘阵列设备,进行文件系统格式化`
[root@localhost ~]# mkfs.xfs /dev/md0
meta-data=/dev/md0               isize=512    agcount=16, agsize=327296 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=5236736, imaxpct=25
         =                       sunit=128    swidth=256 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=8 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

`4.创建文件用于对/dev/md0 的挂载`
[root@localhost ~]# mkdir /test_raid

`5.针对分区进行文件夹挂载,使用mount命令进行挂载`
[root@localhost ~]# mount /dev/md0 /test_raid/

`6.检查挂载情况`
[root@localhost ~]# mount -l | grep md0
/dev/md0 on /test_raid type xfs (rw,relatime,attr2,inode64,sunit=1024,swidth=2048,noquota)

`7.还可以使用df命令,检查挂载空的使用情况`
[root@localhost ~]# df -h
文件系统        容量  已用  可用 已用% 挂载点
devtmpfs        476M     0  476M    0% /dev
tmpfs           487M     0  487M    0% /dev/shm
tmpfs           487M  7.7M  479M    2% /run
tmpfs           487M     0  487M    0% /sys/fs/cgroup
/dev/sda2        19G  2.1G   17G   11% /
/dev/sda1      1014M  132M  883M   13% /boot
tmpfs            98M     0   98M    0% /run/user/0
/dev/md0         20G   33M   20G    1% /test_raid

`8.检查raid10的详细信息`
[root@localhost ~]# mdadm -D /dev/md0
/dev/md0:
           Version : 1.2
     Creation Time : Mon Jul  3 18:53:19 2023
        Raid Level : raid10
        Array Size : 20953088 (19.98 GiB 21.46 GB)
     Used Dev Size : 10476544 (9.99 GiB 10.73 GB)
      Raid Devices : 4
     Total Devices : 4
       Persistence : Superblock is persistent

       Update Time : Tue Jul  4 00:28:11 2023
             State : clean 
    Active Devices : 4
   Working Devices : 4
    Failed Devices : 0
     Spare Devices : 0

            Layout : near=2
        Chunk Size : 512K

Consistency Policy : resync

              Name : localhost:0  (local to host localhost)
              UUID : 70d749d7:73a8cb06:ff46d18a:955fa3f1
            Events : 17

    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync set-A   /dev/sdb
       1       8       32        1      active sync set-B   /dev/sdc
       2       8       48        2      active sync set-A   /dev/sdd
       3       8       64        3      active sync set-B   /dev/sde
       
`9.可以测试向磁盘阵列中写入数据,检查使用空间`
[root@localhost test_raid]# echo {1..1000000} > test.txt
[root@localhost test_raid]# df -h
文件系统        容量  已用  可用 已用% 挂载点
devtmpfs        476M     0  476M    0% /dev
tmpfs           487M     0  487M    0% /dev/shm
tmpfs           487M  7.7M  479M    2% /run
tmpfs           487M     0  487M    0% /sys/fs/cgroup
/dev/sda2        19G  2.1G   17G   11% /
/dev/sda1      1014M  132M  883M   13% /boot
tmpfs            98M     0   98M    0% /run/user/0
/dev/md0         20G   40M   20G    1% /test_raid

`10.编辑/etc/fstab文件`
[root@localhost /]# vim /etc/fstab
在文件最后一行下面添加如下信息
/dev/md0        /test_raid      xfs     default 0 0     

`取消挂载`
[root@localhost test_raid]# cd ..
[root@localhost /]# umount /dev/md0
[root@localhost /]# df -h
文件系统        容量  已用  可用 已用% 挂载点
devtmpfs        476M     0  476M    0% /dev
tmpfs           487M     0  487M    0长度c'd% /dev/shm
tmpfs           487M  7.7M  479M    2% /run
tmpfs           487M     0  487M    0% /sys/fs/cgroup
/dev/sda2        19G  2.1G   17G   11% /
/dev/sda1      1014M  132M  883M   13% /boot
[root@localhost /]# tail -1 /etc/fstab 
/dev/md0        /test_raid      xfs     default 0 0 

RAID10故障修复

当raid10故障了一块硬盘怎么办?

1.模拟挂掉一块硬盘,从raid10的四块硬盘组中,剔除一块磁盘

[root@localhost test_raid]# mdadm /dev/md0 -f /dev/sdd
mdadm: set /dev/sdd faulty in /dev/md0

2.查看raid10的状态

[root@localhost test_raid]# mdadm -D /dev/md0 
可以看到标红的一个设备挂掉了
Failed Devices : 1

3.即使挂掉一块硬盘也不会影响raid10的使用

[root@localhost test_raid]# echo {1..1000000} >> test.txt}

[root@localhost test_raid]# df -hT
文件系统       类型      容量  已用  可用 已用% 挂载点
devtmpfs       devtmpfs  476M     0  476M    0% /dev
tmpfs          tmpfs     487M     0  487M    0% /dev/shm
tmpfs          tmpfs     487M  7.7M  479M    2% /run
tmpfs          tmpfs     487M     0  487M    0% /sys/fs/cgroup
/dev/sda2      xfs        19G  2.1G   17G   11% /
/dev/sda1      xfs      1014M  132M  883M   13% /boot
tmpfs          tmpfs      98M     0   98M    0% /run/user/0
/dev/md0       xfs        20G   46M   20G    1% /test_raid

4.只需要购买新的硬盘设备,重新加入raid10磁盘阵列即可

​ 重新加入磁盘阵列必须先取消挂载

[root@localhost /]# reboot

[root@localhost ~]# umount /dev/md0 

[root@localhost ~]# mdadm /dev/md0 -a /dev/sdd
mdadm: added /dev/sdd

[root@localhost ~]# mdadm -D /dev/md0
Rebuild Status : 17% complete
`等待"Rebuild Status : 17% complete"这条语句100%`

RAID10的重启

`1.把四块硬盘写入 /etc/mdadm.conf文件`
[root@localhost ~]# echo DEVICE /dev/sd[b-e] > /etc/mdadm.conf

`2.扫描磁盘阵列信息,追加到这个文件中`
[root@localhost ~]# mdadm -Ds >> /etc/mdadm.conf
[root@localhost ~]# cat /etc/mdadm.conf 
DEVICE /dev/sdb /dev/sdc /dev/sdd /dev/sde
ARRAY /dev/md/0 metadata=1.2 name=localhost.localdomain:0 UUID=3704deaf:17ecb0eb:93779abb:72ce3501

`3.取消raid10的挂载`
[root@localhost ~]# umount /test_raid/

`4.停止raid10`
[root@localhost ~]# mdadm -S /dev/md0
mdadm: stopped /dev/md0

`5.检查一下磁盘阵列组的信息 可以发现停止查看了`
[root@localhost ~]# mdadm -D /dev/md0
mdadm: cannot open /dev/md0: No such file or directory

`6.在存在配置文件的情况下,可以正常启动raid10,并且md0也自动挂载到/test_raid`
[root@localhost ~]# mdadm -A /dev/md0
mdadm: /dev/md0 has been started with 4 drives.

[root@localhost ~]# df -h
文件系统                 容量  已用  可用 已用% 挂载点
devtmpfs                 475M     0  475M    0% /dev
tmpfs                    487M     0  487M    0% /dev/shm
tmpfs                    487M  7.7M  479M    2% /run
tmpfs                    487M     0  487M    0% /sys/fs/cgroup
/dev/mapper/centos-root   17G  2.2G   15G   13% /
/dev/sda1               1014M  138M  877M   14% /boot
tmpfs                     98M     0   98M    0% /run/user/0
/dev/md0                  20G   40M   20G    1% /test_raid

RAID10的删除

`1.卸载挂载中的设备`
[root@localhost ~]# umount /test_raid

`2.停止raid服务`
[root@localhost ~]# mdadm -S /dev/md0
mdadm: stopped /dev/md0

`3.卸载raid10中所有的磁盘信息`
[root@localhost ~]# mdadm --misc --zero-superblock /dev/sdb
[root@localhost ~]# mdadm --misc --zero-superblock /dev/sdc
[root@localhost ~]# mdadm --misc --zero-superblock /dev/sdd
[root@localhost ~]# mdadm --misc --zero-superblock /dev/sde

`4.删除raid的配置文件`
[root@localhost ~]# rm /etc/mdadm.conf
rm:是否删除普通文件 "/etc/mdadm.conf"?y

`5.此时再清理开机自动挂载的配置文件`
[root@localhost ~]# vim /etc/fstab
删除 /etc/fstab文件的自动挂载信息配置

RAID与备份盘的学习

`1.用raid5来搭建三块硬盘的阵列组`
[root@localhost ~]# ls /dev/sd*
/dev/sda  /dev/sda1  /dev/sda2  /dev/sdb  /dev/sdc  /dev/sdd  /dev/sde

[root@localhost ~]# mdadm -Cv /dev/md0 -n 3 -l 5 -x 1 /dev/sdb /dev/sdc /dev/sdd /dev/sde
mdadm: layout defaults to left-symmetric
mdadm: layout defaults to left-symmetric
mdadm: chunk size defaults to 512K
mdadm: size set to 10476544K
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
参数解释:
-n 指定3块硬盘
-l 指定raid级别
-x 1指定一个备份盘
/dev/sd[b-e] 代表指定使用的4块硬盘

`2.检查一下raid阵列组的信息与状态 可以看到激活3个、工作中4个、1个备份盘`
[root@localhost ~]# mdadm -D /dev/md0
/dev/md0:
           Version : 1.2
     Creation Time : Tue Jul  4 17:06:51 2023
        Raid Level : raid5
        Array Size : 20953088 (19.98 GiB 21.46 GB)
     Used Dev Size : 10476544 (9.99 GiB 10.73 GB)
      Raid Devices : 3
     Total Devices : 4
       Persistence : Superblock is persistent

       Update Time : Tue Jul  4 17:07:49 2023
             State : clean 
    Active Devices : 3
   Working Devices : 4
    Failed Devices : 0
     Spare Devices : 1

            Layout : left-symmetric
        Chunk Size : 512K

Consistency Policy : resync

              Name : localhost.localdomain:0  (local to host localhost.localdomain)
              UUID : eb75ff17:e1eaf0a2:53027735:6437e08a
            Events : 18

    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync   /dev/sdb
       1       8       32        1      active sync   /dev/sdc
       4       8       48        2      active sync   /dev/sdd

       3       8       64        -      spare   /dev/sde
       
`3.针对阵列组进行格式化文件系统`
[root@localhost ~]# mkfs.xfs -f /dev/md0
meta-data=/dev/md0               isize=512    agcount=16, agsize=327296 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=5236736, imaxpct=25
         =                       sunit=128    swidth=256 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=8 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

`4.开始挂载,使用阵列组分区`
这里就用之前创建的/test_raid文件 进行挂载
[root@localhost test_raid]# mount /dev/md0 /test_raid/

`5.检查挂载情况,以及数据写入情况`
[root@localhost test_raid]# df -hT | grep md
文件系统                类型      容量  已用  可用 已用% 挂载点
/dev/md0                xfs        20G   33M   20G    1% /test_raid

`6.此时可以写入数据,检查raid是否正常使用`
[root@localhost test_raid]# echo {1..5000000} > test2.txt

`7.见证备份磁盘的作用,从磁盘阵列组中删除一块硬盘,检查阵列情况`
[root@localhost test_raid]#  mdadm /dev/md0 -f /dev/sdb
mdadm: set /dev/sdb faulty in /dev/md0

[root@localhost test_raid]# mdadm -D /dev/md0
/dev/md0:
           Version : 1.2
     Creation Time : Tue Jul  4 17:06:51 2023
        Raid Level : raid5
        Array Size : 20953088 (19.98 GiB 21.46 GB)
     Used Dev Size : 10476544 (9.99 GiB 10.73 GB)
      Raid Devices : 3
     Total Devices : 4
       Persistence : Superblock is persistent

       Update Time : Tue Jul  4 17:54:21 2023
             State : clean, degraded, recovering 
    Active Devices : 2
   Working Devices : 3
    Failed Devices : 1
     Spare Devices : 1

            Layout : left-symmetric
        Chunk Size : 512K

Consistency Policy : resync

    Rebuild Status : 40% complete

              Name : localhost.localdomain:0  (local to host localhost.localdomain)
              UUID : eb75ff17:e1eaf0a2:53027735:6437e08a
            Events : 26

    Number   Major   Minor   RaidDevice State
       3       8       64        0      spare rebuilding   /dev/sde
       1       8       32        1      active sync   /dev/sdc
       4       8       48        2      active sync   /dev/sdd

       0       8       16        -      faulty   /dev/sdb
`可以发现"Rebuild Status : 40% complete"等待完成即可`

文章内容主要参考:11.15 Linux RAID(磁盘阵列)完全攻略 - 知乎 (zhihu.com)