一、RAID技术简介
独立磁盘冗余阵列(RAID,redundant array of independent disks)是把相同的数据存储在多个硬盘的不同的地方(因此,冗余地)的方法。通过把数据放在多个硬盘上,输入输出操作能以平衡的方式交叠,改良性能。因为多个硬盘增加了平均故障间隔时间(MTBF),储存冗余数据也增加了容错。RAID技术可以通过对磁盘上的数据进行条带化,实现对数据成块存取,减少磁盘的机械寻道时间,提高了数据的存取速度;可以通过对一个阵列中的几块磁盘同时读取,减少了磁盘的寻道时间,提高了数据的存取速度;可以通过镜像或者存储奇偶校验码信息的方式,实现对数据的冗余保护。磁盘阵列作为独立系统在主机外直连或通过网络与主机相连。磁盘阵列有多个端口可以被不同主机或不同端口连接。一个主机连接阵列的不同端口可以提升传输速度。和当时PC用单磁盘内部集成缓存一样,在磁盘阵列内部为加快与主机的交互速度,都带有一定量的缓冲存储器。主机与磁盘阵列的缓存交互,缓存与具体的磁盘交互数据。在应用中,有部分常用的数据是需要经常读取的,磁盘阵列根据内部的算法,查找出这些经常读取的数据,存储在缓存中,加快主机读取这些数据的速度,而对于其他缓存中没有的数据,主机要读取,则由阵列从磁盘上直接读取传输给主机。对于主机写入的数据,只写在缓存中,主机可以立即完成写操作。然后由缓存再慢慢写入磁盘。
二、RAID级别
RAID0
RAID 0是最早出现的RAID模式,即Data Strpping数据分条技术。RAID 0是组建磁盘阵列中最简单的一种形式,只需要2块以上的磁盘即可,成本低,可以提高整个磁盘的性能和吞吐量。RAID 0没有提供冗余或错误修复能力,但实现成本是最低的。
RAID 0最简单的实现方式就是把N块同样的硬盘用硬件的形式通过智能磁盘控制器或用操作系统中的磁盘驱动程序以软件的方式串联在一起创建一个大的卷集。在使用中电脑数据依次写入到各块硬盘中,它的最大优点就是可以整倍的提高硬盘的容量。如使用了三块80GB的硬盘组建成RAID 0模式,那么磁盘容量就会是240GB,其速度方面,各单独一块硬盘的速度完全相同。最大的缺点在于任何一块硬盘出现故障,整个系统将会受到破坏,可靠性仅为单独一块硬盘的1/N。
虽然RAID 0可以提供更多的空间和更好的性能,但是整个系统是非常不可靠的,如果出现故障,无法进行任何的补救。所以,RAID 0一般只是在那些对数据安全性要求不高的情况下才被人们所使用。
RAID 1
RAID 1称为磁盘镜像,原理是把一块磁盘的数据镜像到另外一个磁盘上,也就是说数据在写入一块磁盘的同时,会在另外一块闲置的磁盘上生成镜像文件,在不影响性能情况下最大限度的保证系统的可靠性和可修复性上,只要系统中任何一对镜像盘中至少有一块磁盘可以使用,甚至可以在一半数量的硬盘出现问题时系统都可以正常运行,当一块磁盘失效的时候,系统会忽略该硬盘,转而使用剩余的镜像盘读写数据,具备很好的磁盘冗余能力。虽然这样对数据来讲绝对安全,但是成本也会增加,磁盘利用率为50%,以四块80GB容量的硬盘来说,可利用的磁盘空间仅为两块硬盘的空间,仅为160GB。另外,出现硬盘故障的RAID系统不再可靠,应当及时的更换损坏的硬盘,否则剩余的镜像盘也出现问题,那么整个系统就会崩溃。更换新盘后原有数据会需要很长时间同步镜像,外界对数据访问不会受到影响,只是这时整个系统的性能有所下降。因此,RAID 1多用在保存关键性的重要的数据的场合。
RAID 1主要是通过二次读写实现磁盘镜像,所以磁盘控制器的负载也相当大,尤其是在需要频繁写入数据的环境中。为了避免出现性能瓶颈,使用多个磁盘控制器就显得很有必要。
RAID 5
RAID 5(分布式奇偶校验的独立磁盘结构)通过一种称为奇偶校验码的技术保持数据的冗余。在多个磁盘上进行数据剥离时,奇偶位数据也会包括在内并分布于阵列内的磁盘上,奇偶数据用于保持数据的完整性并在磁盘出现故障时进行重建。如果阵列内的某个磁盘出现故障,丢失的数据可以根据其他磁盘上的奇偶位数据进行重建。RAID 5配置要求至少3块磁盘。RAID 5更有效的利用所以冗余RAID配置的磁盘容量。保持良好的读写性能;但是磁盘故障是会影响吞吐效率的。故障后重建信息的时间比镜像配置情况下要长。
RAID 10/01
RAID 01/10是根据组合分为RAID 10和RAID 01,实际上是将RAID 0和RAID 1标准结合的产物,在连续地以位或字节为单位分割数据并且读/写多个磁盘的同时,为每块磁盘作磁盘镜像进行冗余。它的优点是同时拥有RAID 0的超凡速度和RAID 1的数据高可靠行,但是CPU占用率同样也高,而且磁盘的利用率比较低。RAID 10是先做镜射再分区数据,再将所有的硬盘分为两组,视为是RAID 0的最低组合,然后将这两组各自视为RAID 1运作。RAID 01则是跟RAID 10的程序相反,是先分区再将数据镜射到两组硬盘。它将所有的硬盘分为两组,变成RAID 1的最低组合,而将两组硬盘各自视为RAID 0运作。性能上,RAID 01比RAID 10有着更快的读写速度。可靠性上,当RAID 10有一块盘受损,其余三块硬盘会继续运作。RAID 01只要有一个硬盘受损,同组RAID 0的另一个硬盘也会停止运作,只剩下两个硬盘运作,可靠性较低。因此,RAID 10远较RAID 01常用。
三、创建RAID
1)创建RAID 5
[root@yang ~]# yum install mdadm -y //安装软RAID程序
[root@yang ~]# fdisk -l | grep -E "sdb|sdc|sdd" //准备3块可用磁盘
Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
Disk /dev/sdc: 21.5 GB, 21474836480 bytes, 41943040 sectors
Disk /dev/sdd: 21.5 GB, 21474836480 bytes, 41943040 sectors
[root@yang ~]# mdadm -E /dev/sd[b,c,d] //检测三块磁盘是否存在RAID块
mdadm: No md superblock detected on /dev/sdb.
mdadm: No md superblock detected on /dev/sdc.
mdadm: No md superblock detected on /dev/sdd.
[root@yang ~]# fdisk /dev/sdb //对sdb磁盘进行分区;sdc、sdd相同操作
Welcome to fdisk (util-linux 2.23.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0xa8f27dd0.
Command (m for help): n //新建分区
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p):
Using default response p //新建主分区
Partition number (1-4, default 1):
First sector (2048-41943039, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-41943039, default 41943039):
Using default value 41943039
Partition 1 of type Linux and of size 20 GiB is set
Command (m for help): p //打印分区
Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0xa8f27dd0
Device Boot Start End Blocks Id System
/dev/sdb1 2048 41943039 20970496 83 Linux
Command (m for help): t //修改磁盘分区类型
Selected partition 1
Hex code (type L to list all codes): fd //设置分区类型为RAID类型
Changed type of partition 'Empty' to 'Linux raid autodetect'
Command (m for help): p //查看磁盘分区类型
Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0xa8f27dd0
Device Boot Start End Blocks Id System
/dev/sdb1 2048 41943039 20970496 fd Linux raid autodetect
Command (m for help): w //保存退出
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
[root@yang ~]# mdadm -E /dev/sd[b,c,d] //再次监测磁盘
/dev/sdb:
MBR Magic : aa55
Partition[0] : 41940992 sectors at 2048 (type fd)
/dev/sdc:
MBR Magic : aa55
Partition[0] : 41940992 sectors at 2048 (type fd)
/dev/sdd:
MBR Magic : aa55
Partition[0] : 41940992 sectors at 2048 (type fd)
[root@yang ~]# mdadm -Cv /dev/md0 -n 3 -l 5 /dev/sdb /dev/sdc /dev/sdd
//创建设备rd5取名为md0;-C为创建,-v为显示过程,-n声明磁盘数量,-l指明RAID等级
mdadm: layout defaults to left-symmetric
mdadm: layout defaults to left-symmetric
mdadm: chunk size defaults to 512K
mdadm: partition table exists on /dev/sdb
mdadm: partition table exists on /dev/sdb but will be lost or
meaningless after creating array
mdadm: partition table exists on /dev/sdc
mdadm: partition table exists on /dev/sdc but will be lost or
meaningless after creating array
mdadm: partition table exists on /dev/sdd
mdadm: partition table exists on /dev/sdd but will be lost or
meaningless after creating array
mdadm: size set to 20954112K
Continue creating array?
Continue creating array? (y/n) y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
[root@yang ~]# cat /proc/mdstat //查看创建状态
Personalities : [raid6] [raid5] [raid4]
md0 : active raid5 sdd[3] sdc[1] sdb[0]
41908224 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [UU_]
[=======>.............] recovery = 35.8% (7507584/20954112) finish=1.5min speed=140118K/sec
unused devices:
[root@yang ~]# mdadm -D /dev/md0 //查看md0设备的详细信息
/dev/md0:
Version : 1.2
Creation Time : Tue Oct 22 16:37:46 2019
Raid Level : raid5
Array Size : 41908224 (39.97 GiB 42.91 GB)
Used Dev Size : 20954112 (19.98 GiB 21.46 GB)
Raid Devices : 3
Total Devices : 3
Persistence : Superblock is persistent
Update Time : Tue Oct 22 16:41:48 2019
State : clean
Active Devices : 3
Working Devices : 3
Failed Devices : 0
Spare Devices : 0
Layout : left-symmetric
Chunk Size : 512K
Consistency Policy : resync
Name : yang:0 (local to host yang)
UUID : 5d52424a:eb9376ee:17fd290b:5df13ede
Events : 18
Number Major Minor RaidDevice State
0 8 16 0 active sync /dev/sdb
1 8 32 1 active sync /dev/sdc
3 8 48 2 active sync /dev/sdd
[root@yang ~]# mkfs.ext4 /dev/md0 //格式化md0
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=128 blocks, Stripe width=256 blocks
2621440 inodes, 10477056 blocks
523852 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2157969408
320 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624
Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
[root@yang ~]# mkdir /mnt/md0
[root@yang ~]# blkid | grep "md0"
/dev/md0: UUID="d6fe52af-8635-4463-8e33-70c585ec4433" TYPE="ext4"
[root@yang ~]# vim /etc/fstab
UUID="d6fe52af-8635-4463-8e33-70c585ec4433" /mnt/md0 ext4 defaults 0 0
[root@yang ~]# mount -a
[root@yang ~]# df -TH | grep "md0"
/dev/md0 ext4 43G 51M 40G 1% /mnt/md0
2)创建RAID 10并模拟磁盘故障
[root@yang ~]# mdadm -Cv /dev/md0 -n 4 -l 10 -a yes /dev/sdb /dev/sdc /dev/sdd /dev/sde -x 1 /dev/sdf
//创建RAID 10并命名为md0,-n指明活动磁盘为4块,-x指明备用磁盘为一块。
mdadm: layout defaults to n2
mdadm: layout defaults to n2
mdadm: chunk size defaults to 512K
mdadm: partition table exists on /dev/sdb
mdadm: partition table exists on /dev/sdb but will be lost or
meaningless after creating array
mdadm: partition table exists on /dev/sdc
mdadm: partition table exists on /dev/sdc but will be lost or
meaningless after creating array
mdadm: partition table exists on /dev/sdd
mdadm: partition table exists on /dev/sdd but will be lost or
meaningless after creating array
mdadm: partition table exists on /dev/sde
mdadm: partition table exists on /dev/sde but will be lost or
meaningless after creating array
mdadm: partition table exists on /dev/sdf
mdadm: partition table exists on /dev/sdf but will be lost or
meaningless after creating array
mdadm: size set to 20954112K
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
[root@yang ~]# mdadm -D /dev/md0 //查看md0状态信息
/dev/md0:
Version : 1.2
Creation Time : Wed Oct 23 11:09:00 2019
Raid Level : raid10
Array Size : 41908224 (39.97 GiB 42.91 GB)
Used Dev Size : 20954112 (19.98 GiB 21.46 GB)
Raid Devices : 4
Total Devices : 5
Persistence : Superblock is persistent
Update Time : Wed Oct 23 11:10:04 2019
State : clean, resyncing
Active Devices : 4
Working Devices : 5
Failed Devices : 0
Spare Devices : 1
Layout : near=2
Chunk Size : 512K
Consistency Policy : resync
Resync Status : 91% complete
Name : yang:0 (local to host yang)
UUID : b619bc48:51257e2e:794f010b:c43c2aad
Events : 14
Number Major Minor RaidDevice State
0 8 16 0 active sync set-A /dev/sdb //活动磁盘为4块
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
4 8 80 - spare /dev/sdf //备用磁盘为1块
[root@yang ~]# mkfs.ext4 /dev/md0 //格式化文件系统
[root@yang ~]# mkdir /mnt/md0 //创建挂载点
[root@yang ~]# mount /dev/md0 /mnt/md0/ //挂载设备
[root@yang ~]# df -TH //查看文件系统大小
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda2 xfs 43G 1.7G 42G 4% /
devtmpfs devtmpfs 2.0G 0 2.0G 0% /dev
tmpfs tmpfs 2.0G 0 2.0G 0% /dev/shm
tmpfs tmpfs 2.0G 13M 2.0G 1% /run
tmpfs tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup
/dev/sr0 iso9660 4.6G 4.6G 0 100% /mnt/cdrom
/dev/sda1 xfs 521M 143M 379M 28% /boot
tmpfs tmpfs 396M 0 396M 0% /run/user/0
/dev/md0 ext4 43G 51M 40G 1% /mnt/md0
[root@yang ~]# cp -a /etc/ /var/ /mnt/md0/
[root@yang ~]# ls /mnt/md0/
etc lost+found var
[root@yang ~]# mdadm /dev/md0 -f /dev/sdd //-f模拟磁盘故障,破坏sdd磁盘
mdadm: set /dev/sdd faulty in /dev/md0
[root@yang ~]# mdadm -D /dev/md0 //查看备用磁盘是否可以顶替
/dev/md0:
Version : 1.2
Creation Time : Wed Oct 23 11:09:00 2019
Raid Level : raid10
Array Size : 41908224 (39.97 GiB 42.91 GB)
Used Dev Size : 20954112 (19.98 GiB 21.46 GB)
Raid Devices : 4
Total Devices : 5
Persistence : Superblock is persistent
Update Time : Wed Oct 23 11:18:55 2019
State : clean, degraded, recovering
Active Devices : 3
Working Devices : 4
Failed Devices : 1
Spare Devices : 1
Layout : near=2
Chunk Size : 512K
Consistency Policy : resync
Rebuild Status : 29% complete
Name : yang:0 (local to host yang)
UUID : b619bc48:51257e2e:794f010b:c43c2aad
Events : 23
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
4 8 80 2 spare rebuilding /dev/sdf //sdf磁盘已顶替
3 8 64 3 active sync set-B /dev/sde
2 8 48 - faulty /dev/sdd //sdd磁盘已显示损坏
[root@yang ~]# ls /mnt/md0/ //查看文件是否有丢失
etc lost+found var
[root@yang ~]# mdadm /dev/md0 -r /dev/sdd //移除损坏的磁盘sdd
mdadm: hot removed /dev/sdd from /dev/md0
[root@yang ~]# mdadm /dev/md0 -a /dev/sdg //添加一块新的预备盘sdg
mdadm: added /dev/sdg
[root@yang ~]# mdadm -D /dev/md0 //查看设备状态
/dev/md0:
Version : 1.2
Creation Time : Wed Oct 23 11:09:00 2019
Raid Level : raid10
Array Size : 41908224 (39.97 GiB 42.91 GB)
Used Dev Size : 20954112 (19.98 GiB 21.46 GB)
Raid Devices : 4
Total Devices : 5
Persistence : Superblock is persistent
Update Time : Wed Oct 23 11:23:43 2019
State : clean
Active Devices : 4
Working Devices : 5
Failed Devices : 0
Spare Devices : 1
Layout : near=2
Chunk Size : 512K
Consistency Policy : resync
Name : yang:0 (local to host yang)
UUID : b619bc48:51257e2e:794f010b:c43c2aad
Events : 40
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
4 8 80 2 active sync set-A /dev/sdf
3 8 64 3 active sync set-B /dev/sde
5 8 96 - spare /dev/sdg //预备盘添加完成
[root@yang ~]# blkid //查看磁盘uuid号
/dev/md0: UUID="110683b2-3c90-40bc-8230-cb15a81d71ea" TYPE="ext4"
[root@yang ~]# vim /etc/fstab //设置磁盘设备开机自启动
UUID="110683b2-3c90-40bc-8230-cb15a81d71ea" /mnt/md0 ext4 defaults 0 0
[root@yang ~]# umount /dev/md0 //卸载设备
[root@yang ~]# mount -a //挂载fstab里文件的所有设备
[root@yang ~]# df -TH //查看文件系统
Filesystem Type Size Used Avail Use% Mounted on
/dev/md0 ext4 43G 271M 40G 1% /mnt/md0