系列文章目录
文章目录
前言
RAID 技术通过把多个硬盘设备组合成一个容量更大、安全性更好的磁盘阵列,并把数据切割成多个区段后分别存放在各个不同的物理硬盘设备上,然后利用分散读写技术来提升磁盘阵列整体的性能,同时把多个重要数据的副本同步到不同的物理硬盘设备上,从而起到了非常好的数据冗余备份效果。
任何事物都有它的两面性。RAID 技术确实具有非常好的数据冗余备份功能,但是它也相应地提高了成本支出。就像原本我们只有一个电话本,但是为了避免遗失,我们把联系人
号码信息写成了两份,自然要为此多买一个电话本,这也就相应地提升了成本支出。RAID 技术的设计初衷是减少因为采购硬盘设备带来的费用支出,但是与数据本身的价值相比较,现代企业更看重的则是 RAID 技术所具备的冗余备份机制以及带来的硬盘吞吐量的提升。也就是说,RAID 不仅降低了硬盘设备损坏后丢失数据的几率,还提升了硬盘设备的读写速度,所以它在绝大多数运营商或大中型企业中得到了广泛部署和应用。
RAID 0、1、5、10 方案技术对比
一、部署磁盘阵列
再来部署 RAID 和 LVM 就变得十分轻松了。首先,需要在虚拟机中添加 4 块硬盘设备来制作一个 RAID 10 磁盘阵列,记得硬盘要用 SCSI 或 SATA 接口的类型, 大小默认 5GB 就可以。
这几块硬盘设备是模拟出来的,不需要特意去买几块真实的物理硬盘插到电脑上。需要注意的是,一定要记得在关闭系统之后,再在虚拟机中添加硬盘设备,否则可能会因为计算机架构的不同而导致虚拟机系统无法识别新添加的硬盘设备。
当前,生产环境中用到的服务器一般都配备 RAID 阵列卡,尽管服务器的价格越来越便宜,但是我们没有必要为了做一个实验而去单独购买一台服务器,而是可以学会使用 mdadm 命令在 Linux 系统中创建和管理软件 RAID 磁盘阵列,而且它涉及的理论知识和操作过程与生产环境中的完全一致。
mdadm 命令用于创建、调整、监控和管理 RAID 设备,英文全称为“multiple devices admin”,语法格式为“mdadm 参数 硬盘名称”。
mdadm 命令中的常用参数及作用如下表所示。
1.使用 mdadm 命令创建 RAID 10,名称为“/dev/md0”。
其中,-C 参数代表创建一个 RAID 阵列卡;-v 参数显示创建的过程,同时在后面追加一个设备名称/dev/md0,这样/dev/md0 就是创建后的RAID 磁盘阵列的名称;-n 4 参数代表使用 4 块硬盘来部署这个 RAID 磁盘阵列;而-l 10 参数则代表 RAID 10 方案;最后再加上 4 块硬盘设备的名称就搞定了。
[root@linuxprobe ~]# mdadm -Cv -n4 -l 10 /dev/md0 /dev/nvme0n[2-5]
mdadm: layout defaults to n2
mdadm: layout defaults to n2
mdadm: chunk size defaults to 512K
mdadm: size set to 5237760K
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
初始化过程大约需要 1 分钟左右,期间可以用-D 参数进行查看。也可以用-Q 参数查看简要信息:
[root@linuxprobe ~]# mdadm -Q /dev/md0
/dev/md0: 9.99GiB raid10 4 devices, 0 spares. Use mdadm --detail for more detail.
[root@linuxprobe ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 6.6G 0 rom /run/media/root/RHEL-8-0-0-BaseOS-x86_64
nvme0n1 259:0 0 20G 0 disk
├─nvme0n1p1 259:1 0 1G 0 part /boot
└─nvme0n1p2 259:2 0 19G 0 part
├─rhel-root 253:0 0 17G 0 lvm /
└─rhel-swap 253:1 0 2G 0 lvm [SWAP]
nvme0n2 259:3 0 5G 0 disk
└─md0 9:0 0 10G 0 raid10
nvme0n3 259:4 0 5G 0 disk
└─md0 9:0 0 10G 0 raid10
nvme0n4 259:5 0 5G 0 disk
└─md0 9:0 0 10G 0 raid10
nvme0n5 259:6 0 5G 0 disk
└─md0 9:0 0 10G 0 raid10
nvme0n6 259:7 0 5G 0 disk
[root@linuxprobe ~]# mdadm -D /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Wed Feb 22 13:17:22 2023
Raid Level : raid10
Array Size : 10475520 (9.99 GiB 10.73 GB)
Used Dev Size : 5237760 (5.00 GiB 5.36 GB)
Raid Devices : 4
Total Devices : 4
Persistence : Superblock is persistent
Update Time : Wed Feb 22 13:18:17 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 : linuxprobe.com:0 (local to host linuxprobe.com)
UUID : ee34c334:daaa6f82:21fa5ad0:9ee8d61f
Events : 17
Number Major Minor RaidDevice State
0 259 3 0 active sync set-A /dev/nvme0n2
1 259 4 1 active sync set-B /dev/nvme0n3
2 259 5 2 active sync set-A /dev/nvme0n4
3 259 6 3 active sync set-B /dev/nvme0n5
[root@linuxprobe ~]# mdadm -Q /dev/md0
/dev/md0: 9.99GiB raid10 4 devices, 0 spares. Use mdadm --detail for more detail.
为什么 4 块 5GB 大小的硬盘组成的磁盘阵列组,可用空间只有
39.97GB 呢?
这里不得不提到 RAID 10 技术的原理。它通过两两一组硬盘组成的 RAID 1 磁盘阵列保证了数据的可靠性,其中每一份数据都会被保存两次,因此导致硬盘存在 50%的使用率和 50% 的冗余率。这样一来,20GB 的硬盘容量也就只有一半了。
2.把制作好的 RAID 磁盘阵列格式化为 Ext4 格式
[root@linuxprobe ~]# mkfs.ext4 /dev/md0
mke2fs 1.44.3 (10-July-2018)
Creating filesystem with 2618880 4k blocks and 655360 inodes
Filesystem UUID: 0ea5e026-262d-4c45-b1e2-a6412ac7fe0f
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632
Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done
3.创建挂载点,将硬盘设备进行挂载操作
[root@linuxprobe ~]# mkdir /RAID #创建挂载点
[root@linuxprobe ~]# echo "/dev/md0 /RAID ext4 defaults 0 0" >> /etc/fstab #输出重定向到/etc/fstab 永久挂载
[root@linuxprobe ~]# mount -a #挂载
[root@linuxprobe ~]# df -h #查看挂载状态
Filesystem Size Used Avail Use% Mounted on
devtmpfs 889M 0 889M 0% /dev
tmpfs 904M 0 904M 0% /dev/shm
tmpfs 904M 9.7M 894M 2% /run
tmpfs 904M 0 904M 0% /sys/fs/cgroup
/dev/mapper/rhel-root 17G 3.9G 14G 23% /
tmpfs 181M 16K 181M 1% /run/user/42
tmpfs 181M 3.5M 178M 2% /run/user/0
/dev/sr0 6.7G 6.7G 0 100% /run/media/root/RHEL-8-0-0-BaseOS-x86_64
/dev/nvme0n1p1 1014M 169M 846M 17% /boot
/dev/md0 9.8G 37M 9.3G 1% /RAID #已经挂载上了
二、损坏磁盘阵列及修复
确认有一块物理硬盘设备出现损坏而不能再继续正常使用后,应该使用 mdadm 命令将其移除,然后查看 RAID 磁盘阵列的状态,可以发现状态已经改变:
1.移除一块硬盘
[root@linuxprobe ~]# mdadm /dev/md0 -f /dev/nvme0n3
mdadm: set /dev/nvme0n3 faulty in /dev/md0
查看raid磁盘阵列
[root@linuxprobe ~]# mdadm -D /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Wed Feb 22 13:17:22 2023
Raid Level : raid10
Array Size : 10475520 (9.99 GiB 10.73 GB)
Used Dev Size : 5237760 (5.00 GiB 5.36 GB)
Raid Devices : 4
Total Devices : 4
Persistence : Superblock is persistent
Update Time : Wed Feb 22 13:39:49 2023
State : clean, degraded
Active Devices : 3
Working Devices : 3
Failed Devices : 1
Spare Devices : 0
Layout : near=2
Chunk Size : 512K
Consistency Policy : resync
Name : linuxprobe.com:0 (local to host linuxprobe.com)
UUID : ee34c334:daaa6f82:21fa5ad0:9ee8d61f
Events : 19
Number Major Minor RaidDevice State
0 259 3 0 active sync set-A /dev/nvme0n2
- 0 0 1 removed
2 259 5 2 active sync set-A /dev/nvme0n4
3 259 6 3 active sync set-B /dev/nvme0n5
1 259 4 - faulty /dev/nvme0n3
#可以发现此时的nvme0n3硬盘已经移除了raid
刚刚使用的-f 参数是让硬盘模拟损坏的效果。为了能够彻底地将故障盘移除,还要再执行一步操作:
[root@linuxprobe ~]# mdadm /dev/md0 -r /dev/nvme0n3
mdadm: hot removed /dev/nvme0n3 from /dev/md0
2.重新添加
在 RAID 10 级别的磁盘阵列中,当 RAID 1 磁盘阵列中存在一个故障盘时并不影响 RAID 10 磁盘阵列的使用。当购买了新的硬盘设备后再使用 mdadm 命令予以替换即可,在此期间可以在/RAID 目录中正常地创建或删除文件。由于我们是在虚拟机中模拟硬盘,所以先重启系统,然后再把新的硬盘添加到 RAID 磁盘阵列中。
更换硬盘后再次使用-a 参数进行添加操作,系统默认会自动开始数据的同步工作。使用
-D 参数即可看到整个过程和进度(用百分比表示):
[root@linuxprobe ~]# mdadm /dev/md0 -a /dev/nvme0n3
mdadm: added /dev/nvme0n3
[root@linuxprobe ~]# mdadm -D /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Wed Feb 22 13:17:22 2023
Raid Level : raid10
Array Size : 10475520 (9.99 GiB 10.73 GB)
Used Dev Size : 5237760 (5.00 GiB 5.36 GB)
Raid Devices : 4
Total Devices : 4
Persistence : Superblock is persistent
Update Time : Wed Feb 22 13:46:20 2023
State : clean, degraded, recovering
Active Devices : 3
Working Devices : 4
Failed Devices : 0
Spare Devices : 1
Layout : near=2
Chunk Size : 512K
Consistency Policy : resync
Rebuild Status : 76% complete #正在初始化
Name : linuxprobe.com:0 (local to host linuxprobe.com)
UUID : ee34c334:daaa6f82:21fa5ad0:9ee8d61f
Events : 34
Number Major Minor RaidDevice State
0 259 3 0 active sync set-A /dev/nvme0n2
4 259 4 1 spare rebuilding /dev/nvme0n3
2 259 5 2 active sync set-A /dev/nvme0n4
3 259 6 3 active sync set-B /dev/nvme0n5
#可以看到我们的硬盘又重新添加进去了
在实际操作中,机房的服务器一旦硬盘发生故障,服务器上相应的指示灯也会变成红灯(或者变成一直闪烁的黄灯
三.磁盘阵列+备份盘
RAID 10 磁盘阵列中最多允许 50%的硬盘设备发生故障,但是存在这样一种极端情况, 即同一RAID 1 磁盘阵列中的硬盘设备若全部损坏,也会导致数据丢失。换句话说,在 RAID 10 磁盘阵列中,如果 RAID 1 中的某一块硬盘出现了故障,而我们正在前往修复的路上,恰巧该RAID 1 磁盘阵列中的另一块硬盘设备也出现故障,那么数据就被彻底丢失了。
在这样的情况下,该怎么办呢?其实,完全可以使用 RAID 备份盘技术来预防这类事故。该技术的核心理念就是准备一块足够大的硬盘,这块硬盘平时处于闲置状态,一旦 RAID 磁盘阵列中有硬盘出现故障后则会马上自动顶替上去。这样很棒吧!
为了避免多个实验之间相互发生冲突,我们需要保证每个实验的相对独立性,为此需要大家自行将虚拟机还原到初始状态。另外,由于刚才已经演示了 RAID 10 磁盘阵列的部署方法,现在来看一下 RAID 5 的部署效果。部署 RAID 5 磁盘阵列时,至少需要用到 3 块硬盘,还需要再加一块备份硬盘(也叫热备盘),所以总计需要在虚拟机中模拟 4 块硬盘设备
1.创建RAID 5 磁盘阵列+备份盘
现在创建一个RAID 5 磁盘阵列+备份盘。在下面的命令中,参数-n 3 代表创建这个RAID 5 磁盘阵列所需的硬盘数,参数-l 5 代表 RAID 的级别,而参数-x 1 则代表有一块备份盘。当查看/dev/md0(即 RAID 5 磁盘阵列的名称)磁盘阵列的时候,就能看到有一块备份盘在等待中了。
[root@linuxprobe ~]# mdadm -Cv /dev/md0 -n 3 -l 5 -x 1 /dev/nvme0n[2-5]
mdadm: layout defaults to left-symmetric
mdadm: layout defaults to left-symmetric
mdadm: chunk size defaults to 512K
mdadm: size set to 5237760K
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
[root@linuxprobe ~]# mdadm -D /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Wed Feb 22 14:03:52 2023
Raid Level : raid5
Array Size : 10475520 (9.99 GiB 10.73 GB)
Used Dev Size : 5237760 (5.00 GiB 5.36 GB)
Raid Devices : 3
Total Devices : 4
Persistence : Superblock is persistent
Update Time : Wed Feb 22 14:04:20 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 : linuxprobe.com:0 (local to host linuxprobe.com)
UUID : 174f5135:83670d0c:9a7b30f4:31d47966
Events : 18
Number Major Minor RaidDevice State
0 259 3 0 active sync /dev/nvme0n2
1 259 4 1 active sync /dev/nvme0n3
4 259 5 2 active sync /dev/nvme0n4
3 259 6 - spare /dev/nvme0n5
#现在nvme0n5是备份盘
2.格式化
[root@linuxprobe ~]# mkfs.ext4 /dev/md0
mke2fs 1.44.3 (10-July-2018)
Creating filesystem with 2618880 4k blocks and 655360 inodes
Filesystem UUID: 8d72c422-676c-4c28-ba70-a1754ca6b32a
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632
Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done
3.挂载
[root@linuxprobe ~]# mkdir /RAID
[root@linuxprobe ~]# echo "/dev/md0 /RAID ext4 defaults 0 0 " >> /etc/f
favicon.png filesystems firefox/ firewalld/ flatpak/ fonts/ fprintd.conf fstab fuse.conf fwupd/
[root@linuxprobe ~]# echo "/dev/md0 /RAID ext4 defaults 0 0 " >> /etc/fstab
[root@linuxprobe ~]# mount -a
[root@linuxprobe ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 889M 0 889M 0% /dev
tmpfs 904M 0 904M 0% /dev/shm
tmpfs 904M 9.7M 894M 2% /run
tmpfs 904M 0 904M 0% /sys/fs/cgroup
/dev/mapper/rhel-root 17G 3.9G 14G 23% /
/dev/nvme0n1p1 1014M 169M 846M 17% /boot
tmpfs 181M 16K 181M 1% /run/user/42
tmpfs 181M 3.5M 178M 2% /run/user/0
/dev/sr0 6.7G 6.7G 0 100% /run/media/root/RHEL-8-0-0-BaseOS-x86_64
/dev/md0 9.8G 37M 9.3G 1% /RAID
4.备份盘
由 3 块硬盘组成的 RAID 5 磁盘阵列,其对应的可用空间是 n-1,也就是 10GB。热备盘的空间不计算进来,平时完全就是在“睡觉”,只有在意外出现时才会开始工作。
我们再次把硬盘设备/dev/sdb 移出磁盘阵列,然后迅速查看
/dev/md0 磁盘阵列的状态,就会发现备份盘已经被自动顶替上去并开始了数据同步。RAID 中的这种备份盘技术非常实用,可以在保证 RAID 磁盘阵列数据安全性的基础上进一步提高数据可靠性。所以,如果公司不差钱的话,还是买上一块备份盘以防万一吧。
mdadm: set /dev/nvme0n3 faulty in /dev/md0
[root@linuxprobe ~]# mdadm /dev/md0 -r /dev/nvme0n3
mdadm: hot removed /dev/nvme0n3 from /dev/md0
[root@linuxprobe ~]# mdadm -D /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Wed Feb 22 14:03:52 2023
Raid Level : raid5
Array Size : 10475520 (9.99 GiB 10.73 GB)
Used Dev Size : 5237760 (5.00 GiB 5.36 GB)
Raid Devices : 3
Total Devices : 3
Persistence : Superblock is persistent
Update Time : Wed Feb 22 14:12:16 2023
State : clean
Active Devices : 3
Working Devices : 3
Failed Devices : 0
Spare Devices : 0
Layout : left-symmetric
Chunk Size : 512K
Consistency Policy : resync
Name : linuxprobe.com:0 (local to host linuxprobe.com)
UUID : 174f5135:83670d0c:9a7b30f4:31d47966
Events : 38
Number Major Minor RaidDevice State
0 259 3 0 active sync /dev/nvme0n2
3 259 6 1 active sync /dev/nvme0n5
4 259 5 2 active sync /dev/nvme0n4
ps:当我们硬盘中存储的有数据时,数据是否会丢失
[root@linuxprobe RAID]# cp -rf /etc/* ./
[root@linuxprobe RAID]# ls
adjtime cron.daily dracut.conf.d 。。。。。。
[root@linuxprobe RAID]# mdadm /dev/md0 -f /dev/nvme0n4
mdadm: set /dev/nvme0n4 faulty in /dev/md0
[root@linuxprobe RAID]# mdadm -D /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Wed Feb 22 14:03:52 2023
Raid Level : raid5
Array Size : 10475520 (9.99 GiB 10.73 GB)
Used Dev Size : 5237760 (5.00 GiB 5.36 GB)
Raid Devices : 3
Total Devices : 4
Persistence : Superblock is persistent
Update Time : Wed Feb 22 14:32:50 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 : 49% complete
Name : linuxprobe.com:0 (local to host linuxprobe.com)
UUID : 174f5135:83670d0c:9a7b30f4:31d47966
Events : 48
Number Major Minor RaidDevice State
0 259 3 0 active sync /dev/nvme0n2
3 259 6 1 active sync /dev/nvme0n5
5 259 4 2 spare rebuilding /dev/nvme0n3
4 259 5 - faulty /dev/nvme0n4 #移除了
[root@linuxprobe RAID]# ls #有数据 ,
adjtime cron.daily dracut.conf.d group- krb。。。。。。。
[root@linuxprobe RAID]# mdadm /dev/md0 -r /dev/nvme0n4 #去掉这块硬盘看看
mdadm: hot removed /dev/nvme0n4 from /dev/md0
[root@linuxprobe RAID]# mdadm -D /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Wed Feb 22 14:03:52 2023
Raid Level : raid5
Array Size : 10475520 (9.99 GiB 10.73 GB)
Used Dev Size : 5237760 (5.00 GiB 5.36 GB)
Raid Devices : 3
Total Devices : 3
Persistence : Superblock is persistent
Update Time : Wed Feb 22 14:33:05 2023
State : clean
Active Devices : 3
Working Devices : 3
Failed Devices : 0
Spare Devices : 0
Layout : left-symmetric
Chunk Size : 512K
Consistency Policy : resync
Name : linuxprobe.com:0 (local to host linuxprobe.com)
UUID : 174f5135:83670d0c:9a7b30f4:31d47966
Events : 59
Number Major Minor RaidDevice State
0 259 3 0 active sync /dev/nvme0n2
3 259 6 1 active sync /dev/nvme0n5
5 259 4 2 active sync /dev/nvme0n3
[root@linuxprobe RAID]# ls #还是有
adjtime cron.daily dracut.conf.d group- krb5.conf.d 。。。。。。。
5.删除磁盘阵列
1.首先,取消挂载,将所有的磁盘都设置成停用状态:
[root@linuxprobe /]# umount /RAID
[root@linuxprobe /]# mdadm /dev/md0 -f /dev/nvme0n[2-5]
mdadm: set /dev/nvme0n2 faulty in /dev/md0
mdadm: set /dev/nvme0n3 faulty in /dev/md0
mdadm: set /dev/nvme0n4 faulty in /dev/md0
mdadm: set /dev/nvme0n5 faulty in /dev/md0
#下面是移除的操作
[root@linuxprobe /]# mdadm /dev/md0 -r /dev/nvme0n[2-5]
mdadm: hot removed /dev/nvme0n2 from /dev/md0
mdadm: hot removed /dev/nvme0n3 from /dev/md0
mdadm: hot removed /dev/nvme0n4 from /dev/md0
mdadm: hot removed /dev/nvme0n5 from /dev/md0
也可以用“mdadm /dev/md0 -f /dev/sdb -r
/dev/sdb”这一条命令搞定。但是,在早期版本的服务器中,这条命令中的-f 和-r 不能一起使用,因此保守起见,还是一步步地操作吧。
将所有的硬盘都移除后,再来查看磁盘阵列组的状态:
[root@linuxprobe /]# mdadm -D /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Wed Feb 22 14:03:52 2023
Raid Level : raid5
Array Size : 10475520 (9.99 GiB 10.73 GB)
Used Dev Size : 5237760 (5.00 GiB 5.36 GB)
Raid Devices : 3
Total Devices : 0
Persistence : Superblock is persistent
Update Time : Wed Feb 22 14:42:01 2023
State : clean, FAILED
Active Devices : 0
Failed Devices : 0
Spare Devices : 0
Layout : left-symmetric
Chunk Size : 512K
Consistency Policy : resync
Number Major Minor RaidDevice State
- 0 0 0 removed
- 0 0 1 removed
- 0 0 2 removed
下面继续停用整个 RAID 磁盘阵列,咱们的工作就彻底完成了:
[root@linuxprobe /]# mdadm --stop /dev/md0
mdadm: stopped /dev/md0
[root@linuxprobe /]# mdadm -D /dev/md0 # 可以看到已经查看不了raid的详细信息了
mdadm: cannot open /dev/md0: No such file or directory
总结
`主要讲了raid10 和raid5 的部署 当然raid10也是可以加备份盘的。
在操作的同时希望大家可以了解raid 0 1 5 10 的相关概念,才能在实际操作中融会贯通。谢谢