什么是 RAID
磁盘阵列全名是『 Redundant Arrays of Inexpensive Disks, RAID 』,容错式廉价磁盘阵列。 RAID 可以通过一些技术(软件或硬件),将多个较小的磁盘整合成为一个较大的磁盘设备; 而这个较大的磁盘功能可不止是储存而已,他还具有数据保护的功能呢。整个 RAID 由亍选择的等级 (level) 不同,而使得整合后的磁盘具有不同的功能, 基本常见的 level 有这几种(注1):
RAID-0 (等量模式, stripe):效能最佳
这种模式如果使用相同型号与容量的磁盘来组成时,效果较佳。这种模式的 RAID 会将磁盘先切出等量的区块 (举例来说, 4KB), 然后当一个文件要写入 RAID 时,该文件会依据块的大小切割好,之后再依序放到各个磁盘里面去。由于每个磁盘会交错的存放数据, 因此当你的数据要写入 RAID 时,数据会被等量的放置在各个磁盘上面。举例来说,你有两颗磁盘组成 RAID-0 , 当你有 100MB 的数据要写入时,每个磁盘会各被分配到 50MB 的储存量。RAID-0 的示意图如下所示:
RAID-1 (映像模式, mirror):完整备份
这种模式也是需要相同的磁盘容量的,最好是一模一样的磁盘啦!如果是不同容量的磁盘组成 RAID-1 时,那么总容量将以最小的那一颗磁盘为主!这种模式主要是『让同一份数据,完整的保存在两颗磁盘上头』。举例来说,如果我有一个 100MB 的档案,且我仅有两颗磁盘组成 RAID-1 时, 那么这两颗磁盘将会同步写入 100MB 到他们的储存空间去。 因此,整体 RAID 的容量几乎少了 50%。由于两颗硬盘内容一模一样,好像镜子映照出来一样, 所以我们也称他为 mirror(镜像) 模式。
RAID 0+1,RAID 1+0
RAID-0 的效能佳但是数据不安全,RAID-1 的数据安全但是效能不佳,那么能不能将这两者整合起来设置 RAID 呢? 可以啊!那就是 RAID 0+1 或 RAID 1+0。所谓的 RAID 0+1 就是: (1)先让两颗磁盘组成 RAID 0,再让这样的设置共有两组; (2)将这两组 RAID 0 再组成一组 RAID 1。这就是 RAID 0+1 啰!反过来说,RAID 1+0 就是先组成 RAID-1 再组成 RAID-0 的意思。
RAID 5:性能与数据备份的均衡考虑
RAID-5 至少需要三块以上的磁盘才能够组成这种类型的磁盘阵列。这种磁盘阵列的数据写入有点类似 RAID-0 , 不过每个循环的写入过程中,在每颗磁盘还加入一个同位检查数据 (Parity) ,这个数据会记录其他磁盘的备份数据, 用于当有磁盘损毁时的救援。RAID-5 读写的情况有点像底下这样:
Spare Disk:预备磁盘的功能
当磁盘阵列的磁盘损毁时,就得要将坏掉的磁盘拔除,然后换一颗新的磁盘。换成新磁盘并且顺利启劢磁盘阵列后, 磁盘阵列就会开始主动的重建 (rebuild) 原本坏掉的那颗磁盘数据到新的磁盘上!然后你磁盘阵列上面的数据就复原了! 这就是磁盘阵列的优点。不过,我们还是得要动手拔插硬盘,此时通常得要关机才能这么做。 为了让系统可以实时的在坏掉硬盘时主动的重建,因此就需要预备磁盘 (spare disk) 的辅助。 所谓的 spare disk 就是一颗或多颗没有包含在原本磁盘阵列等级中的磁盘,这颗磁盘平时并不会被磁盘阵列所使用, 当磁盘阵列有任何磁盘损毁时,则这颗 spare disk 会被主动的拉进磁盘阵列中,再将坏掉的那颗硬盘移出磁盘阵列! 然后立即重建数据系统。如此你的系统则可以永保安康啊!若你的磁盘阵列有支持热拔插那就更完美了! 直接将坏掉的那颗磁盘拔除换一颗新的,再将那颗新设置成为 spare disk ,就完成了!
磁盘阵列的优点:
说的口沫横飞,重点在哪里呢?其实你的系统如果需要磁盘阵列的话,其实重点在于:
数据安全与可靠性:指的并非信息安全,而是的那个硬件 (指磁盘) 损毁时,数据是否还能够安全的救援或使用之意;
读写效能:例如 RAID 0 可以加强读写效能,让你的系统 I/O 部分得以改善;
容量:可以让多块磁盘组合起来,故单一文件系统可以有相当大的容量。
尤其数据的可靠性与完整性更是使用 RAID 的考虑重点!毕竟硬件坏掉换掉就好了,软件数据损毁那可不是闹着玩的! 所以企业界为何需要大量的 RAID 来做为文件系统的硬件基准,现在您有点了解了吧?
software, hardware RAID
硬件磁盘阵列 (hardware RAID) 是透过磁盘阵列卡来达成数组的目的。 磁盘阵列卡上面有一块专门的芯片在处理 RAID 的仸务,因此在效能方面会比较好。在很多任务 (例如 RAID 5 的同位检查码计算) 磁盘阵列并不会重复消耗原本系统的 I/O 总线,理论上效能会较佳。此外目前一般的中高阶磁盘阵列卡都支持热拔插, 亦即在不关机的情况下抽换损坏的磁盘,对于系统的复原与数据的可靠性方面非常的好用。
软件磁盘阵列 (software RAID)。软件磁盘阵列主要是透过软件来仿真数组的仸务, 因此会损耗较多的系统资源,比如说 CPU 的运算不 I/O 总线的资源等。
另外你必项要知道的是,硬件磁盘阵列在 Linux 底下看起来就是一颗实际的大磁盘,因此硬件磁盘阵列的装置文件名为 /dev/sd[a-p] ,因为使用到 SCSI 的模坑之故。至于软件磁盘阵列则是系统仿真的,因此使用的装置文件名是系统的装置文件, 文件名为 /dev/md0, /dev/md1...,两者的装置文件名并不相同!
软件磁盘阵列的设定:
- # mdadm --create --auto=yes /dev/md[0-9] --raid-devices=N --level=[015] --spare-devices=N /dev/sdx /dev/hdx...
- 选顷不参数:
- --create :为建立 RAID 的参数。
- --auto=yes :决定建立后面接的软件磁盘阵列装置,亦即 /dev/md0,/dev/md1...
- --raid-devices=N :使用几个磁盘 (partition) 作为磁盘阵列的装置
- --spare-devices=N :使用几个磁盘作为备用 (spare) 装置
- --level=[015] :设定这组磁盘阵列的等级。支持很多,不过建议只要用 0, 1, 5 即可
- --detail :后面所接的那个磁盘阵列装置的详绅信息
利用我的测试机来建置一个 RAID 5 的软件磁盘阵列给您瞧瞧!
- [root@linux ~]# fdisk -l
- Disk /dev/sda: 8589 MB, 8589934592 bytes
- 255 heads, 63 sectors/track, 1044 cylinders
- Units = cylinders of 16065 * 512 = 8225280 bytes
- Device Boot Start End Blocks Id System
- /dev/sda1 * 1 13 104391 83 Linux
- /dev/sda2 14 274 2096482+ 82 Linux swap / Solaris
- /dev/sda3 275 1044 6185025 83 Linux
- Disk /dev/sdb: 8589 MB, 8589934592 bytes
- 255 heads, 63 sectors/track, 1044 cylinders
- Units = cylinders of 16065 * 512 = 8225280 bytes
- Device Boot Start End Blocks Id System
- Disk /dev/sdc: 8589 MB, 8589934592 bytes
- 255 heads, 63 sectors/track, 1044 cylinders
- Units = cylinders of 16065 * 512 = 8225280 bytes
- Device Boot Start End Blocks Id System
- Disk /dev/sdd: 8589 MB, 8589934592 bytes
- 255 heads, 63 sectors/track, 1044 cylinders
- Units = cylinders of 16065 * 512 = 8225280 bytes
- Device Boot Start End Blocks Id System
- Disk /dev/sde: 8589 MB, 8589934592 bytes
- 255 heads, 63 sectors/track, 1044 cylinders
- Units = cylinders of 16065 * 512 = 8225280 bytes
- Device Boot Start End Blocks Id System
- Disk /dev/sdf: 8589 MB, 8589934592 bytes
- 255 heads, 63 sectors/track, 1044 cylinders
- Units = cylinders of 16065 * 512 = 8225280 bytes
- Disk /dev/sdf doesn't contain a valid partition table
下面是我希望做成的 RAID 5 环境:
利用 4 个磁盘组成 RAID 5;
每个磁盘约为 8GB 大小,需确定每个磁盘一样大较佳;
利用 1 个磁盘设定为 spare disk
这个 spare disk 的大小与其他 RAID 所需磁盘一样大!
将此 RAID 5 装置挂载到 /mnt/raid 目录下
最终我需要 5 个 8GB 的磁盘。
- [root@linux ~]# mdadm --create --auto=yes /dev/md0 --level=5 --raid-devices=4 --spare-devices=1 /dev/sd{b,c,d,e,f}
- mdadm: array /dev/md0 started.
- [root@linux ~]# mdadm --detail /dev/md0
- /dev/md0: --RADI设备名
- Version : 0.90
- Creation Time : Thu Feb 16 19:11:44 2012 --RAID被创建的时间
- Raid Level : raid5 --RAID等级为RAID 5
- Array Size : 25165632 (24.00 GiB 25.77 GB) --此RAID的可用磁盘容量
- Used Dev Size : 8388544 (8.00 GiB 8.59 GB) --每个设备的可用容量
- Raid Devices : 4 --用作RAID的设备数量
- Total Devices : 5 --全部设备的数量
- Preferred Minor : 0
- Persistence : Superblock is persistent
- Update Time : Thu Feb 16 19:14:22 2012
- State : clean
- Active Devices : 4 --启动的设备数量
- Working Devices : 5 --可动作的设备数量
- Failed Devices : 0 --出现错误的设备数量
- Spare Devices : 1 --预备磁盘的数量
- Layout : left-symmetric
- Chunk Size : 64K
- UUID : 84c5171f:50290a3e:8673f81b:4cc9501b --此设备的RAID标识符
- Events : 0.2
- Number Major Minor RaidDevice State
- 0 8 16 0 active sync /dev/sdb
- 1 8 32 1 active sync /dev/sdc
- 2 8 48 2 active sync /dev/sdd
- 3 8 64 3 active sync /dev/sde
- 4 8 80 - spare /dev/sdf
也可以查阅如下的档案杢看看系统软件磁盘阵列的情况:
- [root@linux ~]# cat /proc/mdstat
- Personalities : [raid6] [raid5] [raid4]
- md0 : active raid5 sde[3] sdf[4](S) sdd[2] sdc[1] sdb[0] --第一行
- 25165632 blocks level 5, 64k chunk, algorithm 2 [4/4] [UUUU] --第二行
- unused devices: <none>
第一行部分:指出 md0 为 raid5 ,丏使用了 sdb, sdc, sdd, sde 等四颗磁盘装置。每个装置后面的中括号 [] 内的数字为此磁盘在 RAID 中的顺序 (RaidDevice);至亍 sdf 后面的 [S] 则代表 sdf 为 spare 之意。
第二行:此磁盘阵列拥有 25165632 个block(每个 block 单位为 1K),所以怪容量约为24GB, 使用 RAID 5 等级,写入磁盘的小区坑 (chunk) 大小为 64K,使用 algorithm 2 磁盘阵列算法。 [m/n] 代表此数组需要 m 个装置,且 n 个装置正常运作。因此本 md0 需要 4 个装置且这 4 个装置均正常运作。 后面的 [UUUU] 代表的是四个所需的装置 (就是 [m/n] 里面的 m) 的启劢情况,U 代表正常运作,若为 _ 则代表不正常。
格式化与挂载使用RAID
- [root@linux ~]# mkfs -t ext3 /dev/md0
- mke2fs 1.39 (29-May-2006)
- Filesystem label=
- OS type: Linux
- Block size=4096 (log=2)
- Fragment size=4096 (log=2)
- 3145728 inodes, 6291408 blocks
- 314570 blocks (5.00%) reserved for the super user
- First data block=0
- Maximum filesystem blocks=0
- 192 block groups
- 32768 blocks per group, 32768 fragments per group
- 16384 inodes per group
- Superblock backups stored on blocks:
- 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
- 4096000
- Writing inode tables: done
- Creating journal (32768 blocks): done
- Writing superblocks and filesystem accounting information: done
- This filesystem will be automatically checked every 22 mounts or
- 180 days, whichever comes first. Use tune2fs -c or -i to override.
- [root@linux ~]# mkdir /mnt/raid
- [root@linux ~]# mount /dev/md0 /mnt/raid/
- [root@linux ~]# df
- 文件系统 1K-块 已用 可用 已用% 挂载点
- /dev/sda3 5991232 2656564 3025420 47% /
- /dev/sda1 101086 11373 84494 12% /boot
- tmpfs 517548 0 517548 0% /dev/shm
- /dev/md0 24770748 176200 23336268 1% /mnt/raid
仿真 RAID 错误的救援模式
- # mdadm --manage /dev/md[0-9] [--add 设备] [--remove 设备] [--fail 设备]
- 参数:
- --add :会将后面的设备加入到这个 md 中!
- --remove :会将后面的设备从这个 md 中移除
- --fail :会将后面的设备设定成为出错的状态
设置磁盘为错误
- [root@linux raid]# cp -a /etc/ /var/log/ /mnt/raid/ --先复制一些数据
- [root@linux raid]# df /mnt/raid/
- 文件系统 1K-块 已用 可用 已用% 挂载点
- /dev/md0 24770748 279932 23232536 2% /mnt/raid
- [root@linux raid]# du -sm /mnt/raid/*
- 106 /mnt/raid/etc --看吧!确实有数据在里面
- 2 /mnt/raid/log
- 1 /mnt/raid/lost+found
- [root@linux raid]# ll /mnt/raid/
- 总计 40
- drwxr-xr-x 101 root root 12288 02-16 20:37 etc
- drwxr-xr-x 16 root root 4096 02-16 18:24 log
- drwx------ 2 root root 16384 02-16 20:36 lost+found
- [root@linux raid]# mdadm --manage /dev/md0 --fail /dev/sdb --假设这个磁盘设备出错了。
- mdadm: set /dev/sdb faulty in /dev/md0
- [root@linux raid]# mdadm --detail /dev/md0
- /dev/md0:
- Version : 0.90
- Creation Time : Thu Feb 16 19:11:44 2012
- Raid Level : raid5
- Array Size : 25165632 (24.00 GiB 25.77 GB)
- Used Dev Size : 8388544 (8.00 GiB 8.59 GB)
- Raid Devices : 4
- Total Devices : 5
- Preferred Minor : 0
- Persistence : Superblock is persistent
- Update Time : Thu Feb 16 20:51:49 2012
- State : clean, degraded, recovering
- Active Devices : 3
- Working Devices : 4
- Failed Devices : 1 --出错的磁盘有一个
- Spare Devices : 1
- Layout : left-symmetric
- Chunk Size : 64K
- Rebuild Status : 16% complete
- UUID : 84c5171f:50290a3e:8673f81b:4cc9501b
- Events : 0.4
- Number Major Minor RaidDevice State
- 4 8 80 0 spare rebuilding /dev/sdf
- 1 8 32 1 active sync /dev/sdc
- 2 8 48 2 active sync /dev/sdd
- 3 8 64 3 active sync /dev/sde
- 5 8 16 - faulty spare /dev/sdb
- [root@linux raid]# cat /proc/mdstat
- Personalities : [raid6] [raid5] [raid4]
- md0 : active raid5 sde[3] sdf[4] sdd[2] sdc[1] sdb[5](F)
- 25165632 blocks level 5, 64k chunk, algorithm 2 [4/3] [_UUU]
- [======>..............] recovery = 34.3% (2878256/8388544) finish=3.2min speed=28577K/sec
- unused devices: <none>
重建完毕的RAID 5情况
- [root@linux raid]# cat /proc/mdstat
- Personalities : [raid6] [raid5] [raid4]
- md0 : active raid5 sde[3] sdf[0] sdd[2] sdc[1] sdb[4](F)
- 25165632 blocks level 5, 64k chunk, algorithm 2 [4/4] [UUUU]
- unused devices: <none>
- [root@linux raid]# mdadm --detail /dev/md0
- /dev/md0:
- Version : 0.90
- Creation Time : Thu Feb 16 19:11:44 2012
- Raid Level : raid5
- Array Size : 25165632 (24.00 GiB 25.77 GB)
- Used Dev Size : 8388544 (8.00 GiB 8.59 GB)
- Raid Devices : 4
- Total Devices : 5
- Preferred Minor : 0
- Persistence : Superblock is persistent
- Update Time : Thu Feb 16 21:02:31 2012
- State : clean
- Active Devices : 4
- Working Devices : 4
- Failed Devices : 1
- Spare Devices : 0
- Layout : left-symmetric
- Chunk Size : 64K
- UUID : 84c5171f:50290a3e:8673f81b:4cc9501b
- Events : 0.12
- Number Major Minor RaidDevice State
- 0 8 80 0 active sync /dev/sdf
- 1 8 32 1 active sync /dev/sdc
- 2 8 48 2 active sync /dev/sdd
- 3 8 64 3 active sync /dev/sde
- 4 8 16 - faulty spare /dev/sdb
将错误的磁盘删除并加入新磁盘
- [root@linux raid]# mdadm --manage /dev/md0 --remove /dev/sdb
- mdadm: hot removed /dev/sdb
- [root@linux raid]# cat /proc/mdstat
- Personalities : [raid6] [raid5] [raid4]
- md0 : active raid5 sde[3] sdf[0] sdd[2] sdc[1]
- 25165632 blocks level 5, 64k chunk, algorithm 2 [4/4] [UUUU]
- unused devices: <none>
- [root@linux raid]# mdadm --detail /dev/md0
- /dev/md0:
- Version : 0.90
- Creation Time : Thu Feb 16 19:11:44 2012
- Raid Level : raid5
- Array Size : 25165632 (24.00 GiB 25.77 GB)
- Used Dev Size : 8388544 (8.00 GiB 8.59 GB)
- Raid Devices : 4
- Total Devices : 4
- Preferred Minor : 0
- Persistence : Superblock is persistent
- Update Time : Thu Feb 16 21:06:32 2012
- State : clean
- Active Devices : 4
- Working Devices : 4
- Failed Devices : 0
- Spare Devices : 0
- Layout : left-symmetric
- Chunk Size : 64K
- UUID : 84c5171f:50290a3e:8673f81b:4cc9501b
- Events : 0.14
- Number Major Minor RaidDevice State
- 0 8 80 0 active sync /dev/sdf
- 1 8 32 1 active sync /dev/sdc
- 2 8 48 2 active sync /dev/sdd
- 3 8 64 3 active sync /dev/sde
- [root@linux raid]# mdadm --manage /dev/md0 --add /dev/sdb
- mdadm: added /dev/sdb
- [root@linux raid]# mdadm --detail /dev/md0
- /dev/md0:
- Version : 0.90
- Creation Time : Thu Feb 16 19:11:44 2012
- Raid Level : raid5
- Array Size : 25165632 (24.00 GiB 25.77 GB)
- Used Dev Size : 8388544 (8.00 GiB 8.59 GB)
- Raid Devices : 4
- Total Devices : 5
- Preferred Minor : 0
- Persistence : Superblock is persistent
- Update Time : Thu Feb 16 21:06:32 2012
- State : clean
- Active Devices : 4
- Working Devices : 5
- Failed Devices : 0
- Spare Devices : 1
- Layout : left-symmetric
- Chunk Size : 64K
- UUID : 84c5171f:50290a3e:8673f81b:4cc9501b
- Events : 0.14
- Number Major Minor RaidDevice State
- 0 8 80 0 active sync /dev/sdf
- 1 8 32 1 active sync /dev/sdc
- 2 8 48 2 active sync /dev/sdd
- 3 8 64 3 active sync /dev/sde
- 4 8 16 - spare /dev/sdb
- [root@linux raid]# cat /proc/mdstat
- Personalities : [raid6] [raid5] [raid4]
- md0 : active raid5 sdb[4](S) sde[3] sdf[0] sdd[2] sdc[1]
- 25165632 blocks level 5, 64k chunk, algorithm 2 [4/4] [UUUU]
- unused devices: <none>
开机自动启动RAID并自动挂载
- [root@linux raid]# mdadm --detail /dev/md0 | grep UUID
- UUID : 84c5171f:50290a3e:8673f81b:4cc9501b
- [root@linux raid]# vi /etc/mdadm.conf
- ARRAY /dev/md0 UUID=84c5171f:50290a3e:8673f81b:4cc9501b
- [root@linux raid]# vi /etc/fstab
- /dev/md0 /mnt/raid ext3 defaults 1 2
- [root@linux ~]# umount /dev/md0
- [root@linux ~]# df
- 文件系统 1K-块 已用 可用 已用% 挂载点
- /dev/sda3 5991232 2655024 3026960 47% /
- /dev/sda1 101086 11373 84494 12% /boot
- tmpfs 517548 0 517548 0% /dev/shm
- [root@linux ~]# mount -a --参数 -a:依照配置文件 /etc/fstab 的数据将所有未挂载的磁盘都挂载上来
- [root@linux ~]# df
- 文件系统 1K-块 已用 可用 已用% 挂载点
- /dev/sda3 5991232 2655024 3026960 47% /
- /dev/sda1 101086 11373 84494 12% /boot
- tmpfs 517548 0 517548 0% /dev/shm
- /dev/md0 24770748 279936 23232532 2% /mnt/raid
关闭软件RAID
除非你未来就是要使用这颗 software RAID (/dev/md0),否则你势必要将这个 /dev/md0 关闭!如果你只是将 /dev/md0 卸除,然后忘记将 RAID 关闭, 结果就是....未来你在重新分割 /dev/sb* 时可能会出现一些莫名的错错误状况啦!
- # 1. 先卸载且删除配置文件内与这个 /dev/md0 有关的设置:
- [root@linux ~]# umount /dev/md0
- [root@linux ~]# vi /etc/fstab
- /dev/md0 /mnt/raid ext3 defaults 1 2 --将这一行删除掉!或者是批注掉也可以!
- # 2. 直接关闭 /dev/md0 的方法!
- [root@linux ~]# mdadm --stop /dev/md0
- mdadm: stopped /dev/md0 --这样就关闭了!
- [root@linux ~]# cat /proc/mdstat
- Personalities : [raid6] [raid5] [raid4]
- unused devices: <none> --看吧!确实不存在仸何数组设备!
- [root@linux ~]# vi /etc/mdadm.conf
- ARRAY /dev/md0 UUID=84c5171f:50290a3e:8673f81b:4cc9501b --同样啦!删除他或是批注他!